From a1f820d98d90d3341fd496b135984436e8d60153 Mon Sep 17 00:00:00 2001
From: Emily Abrash
Date: Mon, 31 Oct 2016 16:40:49 -0700
Subject: [PATCH 01/11] Baseline requirements completed
---
Gemfile | 48 +++++
Gemfile.lock | 169 ++++++++++++++++++
README.rdoc | 28 +++
Rakefile | 6 +
app/assets/images/.keep | 0
app/assets/javascripts/application.js | 16 ++
app/assets/stylesheets/application.css | 15 ++
app/controllers/application_controller.rb | 5 +
app/controllers/concerns/.keep | 0
app/helpers/application_helper.rb | 2 +
app/mailers/.keep | 0
app/models/.keep | 0
app/models/concerns/.keep | 0
app/views/layouts/application.html.erb | 14 ++
bin/bundle | 3 +
bin/rails | 9 +
bin/rake | 9 +
bin/setup | 29 +++
bin/spring | 16 ++
config.ru | 4 +
config/application.rb | 26 +++
config/boot.rb | 3 +
config/database.yml | 25 +++
config/environment.rb | 5 +
config/environments/development.rb | 41 +++++
config/environments/production.rb | 79 ++++++++
config/environments/test.rb | 42 +++++
config/initializers/assets.rb | 11 ++
config/initializers/backtrace_silencers.rb | 7 +
config/initializers/cookies_serializer.rb | 3 +
.../initializers/filter_parameter_logging.rb | 4 +
config/initializers/inflections.rb | 16 ++
config/initializers/mime_types.rb | 4 +
config/initializers/session_store.rb | 3 +
config/initializers/wrap_parameters.rb | 14 ++
config/locales/en.yml | 23 +++
config/routes.rb | 56 ++++++
config/secrets.yml | 22 +++
db/seeds.rb | 7 +
lib/assets/.keep | 0
lib/tasks/.keep | 0
log/.keep | 0
public/404.html | 67 +++++++
public/422.html | 67 +++++++
public/500.html | 66 +++++++
public/favicon.ico | 0
public/robots.txt | 5 +
test/controllers/.keep | 0
test/fixtures/.keep | 0
test/helpers/.keep | 0
test/integration/.keep | 0
test/mailers/.keep | 0
test/models/.keep | 0
test/test_helper.rb | 10 ++
vendor/assets/javascripts/.keep | 0
vendor/assets/stylesheets/.keep | 0
56 files changed, 979 insertions(+)
create mode 100644 Gemfile
create mode 100644 Gemfile.lock
create mode 100644 README.rdoc
create mode 100644 Rakefile
create mode 100644 app/assets/images/.keep
create mode 100644 app/assets/javascripts/application.js
create mode 100644 app/assets/stylesheets/application.css
create mode 100644 app/controllers/application_controller.rb
create mode 100644 app/controllers/concerns/.keep
create mode 100644 app/helpers/application_helper.rb
create mode 100644 app/mailers/.keep
create mode 100644 app/models/.keep
create mode 100644 app/models/concerns/.keep
create mode 100644 app/views/layouts/application.html.erb
create mode 100755 bin/bundle
create mode 100755 bin/rails
create mode 100755 bin/rake
create mode 100755 bin/setup
create mode 100755 bin/spring
create mode 100644 config.ru
create mode 100644 config/application.rb
create mode 100644 config/boot.rb
create mode 100644 config/database.yml
create mode 100644 config/environment.rb
create mode 100644 config/environments/development.rb
create mode 100644 config/environments/production.rb
create mode 100644 config/environments/test.rb
create mode 100644 config/initializers/assets.rb
create mode 100644 config/initializers/backtrace_silencers.rb
create mode 100644 config/initializers/cookies_serializer.rb
create mode 100644 config/initializers/filter_parameter_logging.rb
create mode 100644 config/initializers/inflections.rb
create mode 100644 config/initializers/mime_types.rb
create mode 100644 config/initializers/session_store.rb
create mode 100644 config/initializers/wrap_parameters.rb
create mode 100644 config/locales/en.yml
create mode 100644 config/routes.rb
create mode 100644 config/secrets.yml
create mode 100644 db/seeds.rb
create mode 100644 lib/assets/.keep
create mode 100644 lib/tasks/.keep
create mode 100644 log/.keep
create mode 100644 public/404.html
create mode 100644 public/422.html
create mode 100644 public/500.html
create mode 100644 public/favicon.ico
create mode 100644 public/robots.txt
create mode 100644 test/controllers/.keep
create mode 100644 test/fixtures/.keep
create mode 100644 test/helpers/.keep
create mode 100644 test/integration/.keep
create mode 100644 test/mailers/.keep
create mode 100644 test/models/.keep
create mode 100644 test/test_helper.rb
create mode 100644 vendor/assets/javascripts/.keep
create mode 100644 vendor/assets/stylesheets/.keep
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 000000000..12770b950
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,48 @@
+source 'https://rubygems.org'
+
+
+# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
+gem 'rails', '4.2.7'
+# Use sqlite3 as the database for Active Record
+gem 'sqlite3'
+# Use SCSS for stylesheets
+gem 'sass-rails', '~> 5.0'
+# Use Uglifier as compressor for JavaScript assets
+gem 'uglifier', '>= 1.3.0'
+# Use CoffeeScript for .coffee assets and views
+gem 'coffee-rails', '~> 4.1.0'
+# See https://github.com/rails/execjs#readme for more supported runtimes
+# gem 'therubyracer', platforms: :ruby
+
+# Use jquery as the JavaScript library
+gem 'jquery-rails'
+# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
+gem 'turbolinks'
+# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
+gem 'jbuilder', '~> 2.0'
+# bundle exec rake doc:rails generates the API under doc/api.
+gem 'sdoc', '~> 0.4.0', group: :doc
+
+# Use ActiveModel has_secure_password
+# gem 'bcrypt', '~> 3.1.7'
+
+# Use Unicorn as the app server
+# gem 'unicorn'
+
+# Use Capistrano for deployment
+# gem 'capistrano-rails', group: :development
+
+group :development, :test do
+ # Call 'byebug' anywhere in the code to stop execution and get a debugger console
+ gem 'byebug'
+end
+
+group :development do
+ # Access an IRB console on exception pages or by using <%= console %> in views
+ gem 'web-console', '~> 2.0'
+
+ # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
+ gem 'spring'
+ gem 'better_errors'
+ gem 'binding_of_caller'
+end
diff --git a/Gemfile.lock b/Gemfile.lock
new file mode 100644
index 000000000..77c764a1e
--- /dev/null
+++ b/Gemfile.lock
@@ -0,0 +1,169 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ actionmailer (4.2.7)
+ actionpack (= 4.2.7)
+ actionview (= 4.2.7)
+ activejob (= 4.2.7)
+ mail (~> 2.5, >= 2.5.4)
+ rails-dom-testing (~> 1.0, >= 1.0.5)
+ actionpack (4.2.7)
+ actionview (= 4.2.7)
+ activesupport (= 4.2.7)
+ rack (~> 1.6)
+ rack-test (~> 0.6.2)
+ rails-dom-testing (~> 1.0, >= 1.0.5)
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
+ actionview (4.2.7)
+ activesupport (= 4.2.7)
+ builder (~> 3.1)
+ erubis (~> 2.7.0)
+ rails-dom-testing (~> 1.0, >= 1.0.5)
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
+ activejob (4.2.7)
+ activesupport (= 4.2.7)
+ globalid (>= 0.3.0)
+ activemodel (4.2.7)
+ activesupport (= 4.2.7)
+ builder (~> 3.1)
+ activerecord (4.2.7)
+ activemodel (= 4.2.7)
+ activesupport (= 4.2.7)
+ arel (~> 6.0)
+ activesupport (4.2.7)
+ i18n (~> 0.7)
+ json (~> 1.7, >= 1.7.7)
+ minitest (~> 5.1)
+ thread_safe (~> 0.3, >= 0.3.4)
+ tzinfo (~> 1.1)
+ arel (6.0.3)
+ better_errors (2.1.1)
+ coderay (>= 1.0.0)
+ erubis (>= 2.6.6)
+ rack (>= 0.9.0)
+ binding_of_caller (0.7.2)
+ debug_inspector (>= 0.0.1)
+ builder (3.2.2)
+ byebug (9.0.6)
+ coderay (1.1.1)
+ coffee-rails (4.1.1)
+ coffee-script (>= 2.2.0)
+ railties (>= 4.0.0, < 5.1.x)
+ coffee-script (2.4.1)
+ coffee-script-source
+ execjs
+ coffee-script-source (1.10.0)
+ concurrent-ruby (1.0.2)
+ debug_inspector (0.0.2)
+ erubis (2.7.0)
+ execjs (2.7.0)
+ globalid (0.3.7)
+ activesupport (>= 4.1.0)
+ i18n (0.7.0)
+ jbuilder (2.6.0)
+ activesupport (>= 3.0.0, < 5.1)
+ multi_json (~> 1.2)
+ jquery-rails (4.2.1)
+ rails-dom-testing (>= 1, < 3)
+ railties (>= 4.2.0)
+ thor (>= 0.14, < 2.0)
+ json (1.8.3)
+ loofah (2.0.3)
+ nokogiri (>= 1.5.9)
+ mail (2.6.4)
+ mime-types (>= 1.16, < 4)
+ mime-types (3.1)
+ mime-types-data (~> 3.2015)
+ mime-types-data (3.2016.0521)
+ mini_portile2 (2.1.0)
+ minitest (5.9.1)
+ multi_json (1.12.1)
+ nokogiri (1.6.8.1)
+ mini_portile2 (~> 2.1.0)
+ rack (1.6.4)
+ rack-test (0.6.3)
+ rack (>= 1.0)
+ rails (4.2.7)
+ actionmailer (= 4.2.7)
+ actionpack (= 4.2.7)
+ actionview (= 4.2.7)
+ activejob (= 4.2.7)
+ activemodel (= 4.2.7)
+ activerecord (= 4.2.7)
+ activesupport (= 4.2.7)
+ bundler (>= 1.3.0, < 2.0)
+ railties (= 4.2.7)
+ sprockets-rails
+ rails-deprecated_sanitizer (1.0.3)
+ activesupport (>= 4.2.0.alpha)
+ rails-dom-testing (1.0.7)
+ activesupport (>= 4.2.0.beta, < 5.0)
+ nokogiri (~> 1.6.0)
+ rails-deprecated_sanitizer (>= 1.0.1)
+ rails-html-sanitizer (1.0.3)
+ loofah (~> 2.0)
+ railties (4.2.7)
+ actionpack (= 4.2.7)
+ activesupport (= 4.2.7)
+ rake (>= 0.8.7)
+ thor (>= 0.18.1, < 2.0)
+ rake (11.3.0)
+ rdoc (4.2.2)
+ json (~> 1.4)
+ sass (3.4.22)
+ sass-rails (5.0.6)
+ railties (>= 4.0.0, < 6)
+ sass (~> 3.1)
+ sprockets (>= 2.8, < 4.0)
+ sprockets-rails (>= 2.0, < 4.0)
+ tilt (>= 1.1, < 3)
+ sdoc (0.4.2)
+ json (~> 1.7, >= 1.7.7)
+ rdoc (~> 4.0)
+ spring (2.0.0)
+ activesupport (>= 4.2)
+ sprockets (3.7.0)
+ concurrent-ruby (~> 1.0)
+ rack (> 1, < 3)
+ sprockets-rails (3.2.0)
+ actionpack (>= 4.0)
+ activesupport (>= 4.0)
+ sprockets (>= 3.0.0)
+ sqlite3 (1.3.12)
+ thor (0.19.1)
+ thread_safe (0.3.5)
+ tilt (2.0.5)
+ turbolinks (5.0.1)
+ turbolinks-source (~> 5)
+ turbolinks-source (5.0.0)
+ tzinfo (1.2.2)
+ thread_safe (~> 0.1)
+ uglifier (3.0.3)
+ execjs (>= 0.3.0, < 3)
+ web-console (2.3.0)
+ activemodel (>= 4.0)
+ binding_of_caller (>= 0.7.2)
+ railties (>= 4.0)
+ sprockets-rails (>= 2.0, < 4.0)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ better_errors
+ binding_of_caller
+ byebug
+ coffee-rails (~> 4.1.0)
+ jbuilder (~> 2.0)
+ jquery-rails
+ rails (= 4.2.7)
+ sass-rails (~> 5.0)
+ sdoc (~> 0.4.0)
+ spring
+ sqlite3
+ turbolinks
+ uglifier (>= 1.3.0)
+ web-console (~> 2.0)
+
+BUNDLED WITH
+ 1.13.5
diff --git a/README.rdoc b/README.rdoc
new file mode 100644
index 000000000..dd4e97e22
--- /dev/null
+++ b/README.rdoc
@@ -0,0 +1,28 @@
+== README
+
+This README would normally document whatever steps are necessary to get the
+application up and running.
+
+Things you may want to cover:
+
+* Ruby version
+
+* System dependencies
+
+* Configuration
+
+* Database creation
+
+* Database initialization
+
+* How to run the test suite
+
+* Services (job queues, cache servers, search engines, etc.)
+
+* Deployment instructions
+
+* ...
+
+
+Please feel free to use a different markup language if you do not plan to run
+rake doc:app.
diff --git a/Rakefile b/Rakefile
new file mode 100644
index 000000000..ba6b733dd
--- /dev/null
+++ b/Rakefile
@@ -0,0 +1,6 @@
+# Add your own tasks in files placed in lib/tasks ending in .rake,
+# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
+
+require File.expand_path('../config/application', __FILE__)
+
+Rails.application.load_tasks
diff --git a/app/assets/images/.keep b/app/assets/images/.keep
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js
new file mode 100644
index 000000000..e07c5a830
--- /dev/null
+++ b/app/assets/javascripts/application.js
@@ -0,0 +1,16 @@
+// This is a manifest file that'll be compiled into application.js, which will include all the files
+// listed below.
+//
+// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
+// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
+//
+// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
+// compiled file.
+//
+// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
+// about supported directives.
+//
+//= require jquery
+//= require jquery_ujs
+//= require turbolinks
+//= require_tree .
diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css
new file mode 100644
index 000000000..f9cd5b348
--- /dev/null
+++ b/app/assets/stylesheets/application.css
@@ -0,0 +1,15 @@
+/*
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
+ * listed below.
+ *
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
+ *
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
+ * compiled file so the styles you add here take precedence over styles defined in any styles
+ * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
+ * file per style scope.
+ *
+ *= require_tree .
+ *= require_self
+ */
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
new file mode 100644
index 000000000..d83690e1b
--- /dev/null
+++ b/app/controllers/application_controller.rb
@@ -0,0 +1,5 @@
+class ApplicationController < ActionController::Base
+ # Prevent CSRF attacks by raising an exception.
+ # For APIs, you may want to use :null_session instead.
+ protect_from_forgery with: :exception
+end
diff --git a/app/controllers/concerns/.keep b/app/controllers/concerns/.keep
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
new file mode 100644
index 000000000..de6be7945
--- /dev/null
+++ b/app/helpers/application_helper.rb
@@ -0,0 +1,2 @@
+module ApplicationHelper
+end
diff --git a/app/mailers/.keep b/app/mailers/.keep
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/models/.keep b/app/models/.keep
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/models/concerns/.keep b/app/models/concerns/.keep
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb
new file mode 100644
index 000000000..237dbba45
--- /dev/null
+++ b/app/views/layouts/application.html.erb
@@ -0,0 +1,14 @@
+
+
+
+ ApiMuncher
+ <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
+ <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
+ <%= csrf_meta_tags %>
+
+
+
+<%= yield %>
+
+
+
diff --git a/bin/bundle b/bin/bundle
new file mode 100755
index 000000000..66e9889e8
--- /dev/null
+++ b/bin/bundle
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
+load Gem.bin_path('bundler', 'bundle')
diff --git a/bin/rails b/bin/rails
new file mode 100755
index 000000000..0138d79b7
--- /dev/null
+++ b/bin/rails
@@ -0,0 +1,9 @@
+#!/usr/bin/env ruby
+begin
+ load File.expand_path('../spring', __FILE__)
+rescue LoadError => e
+ raise unless e.message.include?('spring')
+end
+APP_PATH = File.expand_path('../../config/application', __FILE__)
+require_relative '../config/boot'
+require 'rails/commands'
diff --git a/bin/rake b/bin/rake
new file mode 100755
index 000000000..d87d5f578
--- /dev/null
+++ b/bin/rake
@@ -0,0 +1,9 @@
+#!/usr/bin/env ruby
+begin
+ load File.expand_path('../spring', __FILE__)
+rescue LoadError => e
+ raise unless e.message.include?('spring')
+end
+require_relative '../config/boot'
+require 'rake'
+Rake.application.run
diff --git a/bin/setup b/bin/setup
new file mode 100755
index 000000000..acdb2c138
--- /dev/null
+++ b/bin/setup
@@ -0,0 +1,29 @@
+#!/usr/bin/env ruby
+require 'pathname'
+
+# path to your application root.
+APP_ROOT = Pathname.new File.expand_path('../../', __FILE__)
+
+Dir.chdir APP_ROOT do
+ # This script is a starting point to setup your application.
+ # Add necessary setup steps to this file:
+
+ puts "== Installing dependencies =="
+ system "gem install bundler --conservative"
+ system "bundle check || bundle install"
+
+ # puts "\n== Copying sample files =="
+ # unless File.exist?("config/database.yml")
+ # system "cp config/database.yml.sample config/database.yml"
+ # end
+
+ puts "\n== Preparing database =="
+ system "bin/rake db:setup"
+
+ puts "\n== Removing old logs and tempfiles =="
+ system "rm -f log/*"
+ system "rm -rf tmp/cache"
+
+ puts "\n== Restarting application server =="
+ system "touch tmp/restart.txt"
+end
diff --git a/bin/spring b/bin/spring
new file mode 100755
index 000000000..9bc076b9e
--- /dev/null
+++ b/bin/spring
@@ -0,0 +1,16 @@
+#!/usr/bin/env ruby
+
+# This file loads spring without using Bundler, in order to be fast.
+# It gets overwritten when you run the `spring binstub` command.
+
+unless defined?(Spring)
+ require 'rubygems'
+ require 'bundler'
+
+ lockfile = Bundler::LockfileParser.new(Bundler.default_lockfile.read)
+ if spring = lockfile.specs.detect { |spec| spec.name == "spring" }
+ Gem.use_paths Gem.dir, Bundler.bundle_path.to_s, *Gem.path
+ gem 'spring', spring.version
+ require 'spring/binstub'
+ end
+end
diff --git a/config.ru b/config.ru
new file mode 100644
index 000000000..bd83b2541
--- /dev/null
+++ b/config.ru
@@ -0,0 +1,4 @@
+# This file is used by Rack-based servers to start the application.
+
+require ::File.expand_path('../config/environment', __FILE__)
+run Rails.application
diff --git a/config/application.rb b/config/application.rb
new file mode 100644
index 000000000..20568697a
--- /dev/null
+++ b/config/application.rb
@@ -0,0 +1,26 @@
+require File.expand_path('../boot', __FILE__)
+
+require 'rails/all'
+
+# Require the gems listed in Gemfile, including any gems
+# you've limited to :test, :development, or :production.
+Bundler.require(*Rails.groups)
+
+module ApiMuncher
+ class Application < Rails::Application
+ # Settings in config/environments/* take precedence over those specified here.
+ # Application configuration should go into files in config/initializers
+ # -- all .rb files in that directory are automatically loaded.
+
+ # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
+ # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
+ # config.time_zone = 'Central Time (US & Canada)'
+
+ # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
+ # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
+ # config.i18n.default_locale = :de
+
+ # Do not swallow errors in after_commit/after_rollback callbacks.
+ config.active_record.raise_in_transactional_callbacks = true
+ end
+end
diff --git a/config/boot.rb b/config/boot.rb
new file mode 100644
index 000000000..6b750f00b
--- /dev/null
+++ b/config/boot.rb
@@ -0,0 +1,3 @@
+ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
+
+require 'bundler/setup' # Set up gems listed in the Gemfile.
diff --git a/config/database.yml b/config/database.yml
new file mode 100644
index 000000000..1c1a37ca8
--- /dev/null
+++ b/config/database.yml
@@ -0,0 +1,25 @@
+# SQLite version 3.x
+# gem install sqlite3
+#
+# Ensure the SQLite 3 gem is defined in your Gemfile
+# gem 'sqlite3'
+#
+default: &default
+ adapter: sqlite3
+ pool: 5
+ timeout: 5000
+
+development:
+ <<: *default
+ database: db/development.sqlite3
+
+# Warning: The database defined as "test" will be erased and
+# re-generated from your development database when you run "rake".
+# Do not set this db to the same as development or production.
+test:
+ <<: *default
+ database: db/test.sqlite3
+
+production:
+ <<: *default
+ database: db/production.sqlite3
diff --git a/config/environment.rb b/config/environment.rb
new file mode 100644
index 000000000..ee8d90dc6
--- /dev/null
+++ b/config/environment.rb
@@ -0,0 +1,5 @@
+# Load the Rails application.
+require File.expand_path('../application', __FILE__)
+
+# Initialize the Rails application.
+Rails.application.initialize!
diff --git a/config/environments/development.rb b/config/environments/development.rb
new file mode 100644
index 000000000..b55e2144b
--- /dev/null
+++ b/config/environments/development.rb
@@ -0,0 +1,41 @@
+Rails.application.configure do
+ # Settings specified here will take precedence over those in config/application.rb.
+
+ # In the development environment your application's code is reloaded on
+ # every request. This slows down response time but is perfect for development
+ # since you don't have to restart the web server when you make code changes.
+ config.cache_classes = false
+
+ # Do not eager load code on boot.
+ config.eager_load = false
+
+ # Show full error reports and disable caching.
+ config.consider_all_requests_local = true
+ config.action_controller.perform_caching = false
+
+ # Don't care if the mailer can't send.
+ config.action_mailer.raise_delivery_errors = false
+
+ # Print deprecation notices to the Rails logger.
+ config.active_support.deprecation = :log
+
+ # Raise an error on page load if there are pending migrations.
+ config.active_record.migration_error = :page_load
+
+ # Debug mode disables concatenation and preprocessing of assets.
+ # This option may cause significant delays in view rendering with a large
+ # number of complex assets.
+ config.assets.debug = true
+
+ # Asset digests allow you to set far-future HTTP expiration dates on all assets,
+ # yet still be able to expire them through the digest params.
+ config.assets.digest = true
+
+ # Adds additional error checking when serving assets at runtime.
+ # Checks for improperly declared sprockets dependencies.
+ # Raises helpful error messages.
+ config.assets.raise_runtime_errors = true
+
+ # Raises error for missing translations
+ # config.action_view.raise_on_missing_translations = true
+end
diff --git a/config/environments/production.rb b/config/environments/production.rb
new file mode 100644
index 000000000..5c1b32e48
--- /dev/null
+++ b/config/environments/production.rb
@@ -0,0 +1,79 @@
+Rails.application.configure do
+ # Settings specified here will take precedence over those in config/application.rb.
+
+ # Code is not reloaded between requests.
+ config.cache_classes = true
+
+ # Eager load code on boot. This eager loads most of Rails and
+ # your application in memory, allowing both threaded web servers
+ # and those relying on copy on write to perform better.
+ # Rake tasks automatically ignore this option for performance.
+ config.eager_load = true
+
+ # Full error reports are disabled and caching is turned on.
+ config.consider_all_requests_local = false
+ config.action_controller.perform_caching = true
+
+ # Enable Rack::Cache to put a simple HTTP cache in front of your application
+ # Add `rack-cache` to your Gemfile before enabling this.
+ # For large-scale production use, consider using a caching reverse proxy like
+ # NGINX, varnish or squid.
+ # config.action_dispatch.rack_cache = true
+
+ # Disable serving static files from the `/public` folder by default since
+ # Apache or NGINX already handles this.
+ config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?
+
+ # Compress JavaScripts and CSS.
+ config.assets.js_compressor = :uglifier
+ # config.assets.css_compressor = :sass
+
+ # Do not fallback to assets pipeline if a precompiled asset is missed.
+ config.assets.compile = false
+
+ # Asset digests allow you to set far-future HTTP expiration dates on all assets,
+ # yet still be able to expire them through the digest params.
+ config.assets.digest = true
+
+ # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb
+
+ # Specifies the header that your server uses for sending files.
+ # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache
+ # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX
+
+ # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
+ # config.force_ssl = true
+
+ # Use the lowest log level to ensure availability of diagnostic information
+ # when problems arise.
+ config.log_level = :debug
+
+ # Prepend all log lines with the following tags.
+ # config.log_tags = [ :subdomain, :uuid ]
+
+ # Use a different logger for distributed setups.
+ # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)
+
+ # Use a different cache store in production.
+ # config.cache_store = :mem_cache_store
+
+ # Enable serving of images, stylesheets, and JavaScripts from an asset server.
+ # config.action_controller.asset_host = 'http://assets.example.com'
+
+ # Ignore bad email addresses and do not raise email delivery errors.
+ # Set this to true and configure the email server for immediate delivery to raise delivery errors.
+ # config.action_mailer.raise_delivery_errors = false
+
+ # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
+ # the I18n.default_locale when a translation cannot be found).
+ config.i18n.fallbacks = true
+
+ # Send deprecation notices to registered listeners.
+ config.active_support.deprecation = :notify
+
+ # Use default logging formatter so that PID and timestamp are not suppressed.
+ config.log_formatter = ::Logger::Formatter.new
+
+ # Do not dump schema after migrations.
+ config.active_record.dump_schema_after_migration = false
+end
diff --git a/config/environments/test.rb b/config/environments/test.rb
new file mode 100644
index 000000000..1c19f08b2
--- /dev/null
+++ b/config/environments/test.rb
@@ -0,0 +1,42 @@
+Rails.application.configure do
+ # Settings specified here will take precedence over those in config/application.rb.
+
+ # The test environment is used exclusively to run your application's
+ # test suite. You never need to work with it otherwise. Remember that
+ # your test database is "scratch space" for the test suite and is wiped
+ # and recreated between test runs. Don't rely on the data there!
+ config.cache_classes = true
+
+ # Do not eager load code on boot. This avoids loading your whole application
+ # just for the purpose of running a single test. If you are using a tool that
+ # preloads Rails for running tests, you may have to set it to true.
+ config.eager_load = false
+
+ # Configure static file server for tests with Cache-Control for performance.
+ config.serve_static_files = true
+ config.static_cache_control = 'public, max-age=3600'
+
+ # Show full error reports and disable caching.
+ config.consider_all_requests_local = true
+ config.action_controller.perform_caching = false
+
+ # Raise exceptions instead of rendering exception templates.
+ config.action_dispatch.show_exceptions = false
+
+ # Disable request forgery protection in test environment.
+ config.action_controller.allow_forgery_protection = false
+
+ # Tell Action Mailer not to deliver emails to the real world.
+ # The :test delivery method accumulates sent emails in the
+ # ActionMailer::Base.deliveries array.
+ config.action_mailer.delivery_method = :test
+
+ # Randomize the order test cases are executed.
+ config.active_support.test_order = :random
+
+ # Print deprecation notices to the stderr.
+ config.active_support.deprecation = :stderr
+
+ # Raises error for missing translations
+ # config.action_view.raise_on_missing_translations = true
+end
diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb
new file mode 100644
index 000000000..01ef3e663
--- /dev/null
+++ b/config/initializers/assets.rb
@@ -0,0 +1,11 @@
+# Be sure to restart your server when you modify this file.
+
+# Version of your assets, change this if you want to expire all your assets.
+Rails.application.config.assets.version = '1.0'
+
+# Add additional assets to the asset load path
+# Rails.application.config.assets.paths << Emoji.images_path
+
+# Precompile additional assets.
+# application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
+# Rails.application.config.assets.precompile += %w( search.js )
diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb
new file mode 100644
index 000000000..59385cdf3
--- /dev/null
+++ b/config/initializers/backtrace_silencers.rb
@@ -0,0 +1,7 @@
+# Be sure to restart your server when you modify this file.
+
+# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
+# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
+
+# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
+# Rails.backtrace_cleaner.remove_silencers!
diff --git a/config/initializers/cookies_serializer.rb b/config/initializers/cookies_serializer.rb
new file mode 100644
index 000000000..7f70458de
--- /dev/null
+++ b/config/initializers/cookies_serializer.rb
@@ -0,0 +1,3 @@
+# Be sure to restart your server when you modify this file.
+
+Rails.application.config.action_dispatch.cookies_serializer = :json
diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb
new file mode 100644
index 000000000..4a994e1e7
--- /dev/null
+++ b/config/initializers/filter_parameter_logging.rb
@@ -0,0 +1,4 @@
+# Be sure to restart your server when you modify this file.
+
+# Configure sensitive parameters which will be filtered from the log file.
+Rails.application.config.filter_parameters += [:password]
diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb
new file mode 100644
index 000000000..ac033bf9d
--- /dev/null
+++ b/config/initializers/inflections.rb
@@ -0,0 +1,16 @@
+# Be sure to restart your server when you modify this file.
+
+# Add new inflection rules using the following format. Inflections
+# are locale specific, and you may define rules for as many different
+# locales as you wish. All of these examples are active by default:
+# ActiveSupport::Inflector.inflections(:en) do |inflect|
+# inflect.plural /^(ox)$/i, '\1en'
+# inflect.singular /^(ox)en/i, '\1'
+# inflect.irregular 'person', 'people'
+# inflect.uncountable %w( fish sheep )
+# end
+
+# These inflection rules are supported but not enabled by default:
+# ActiveSupport::Inflector.inflections(:en) do |inflect|
+# inflect.acronym 'RESTful'
+# end
diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb
new file mode 100644
index 000000000..dc1899682
--- /dev/null
+++ b/config/initializers/mime_types.rb
@@ -0,0 +1,4 @@
+# Be sure to restart your server when you modify this file.
+
+# Add new mime types for use in respond_to blocks:
+# Mime::Type.register "text/richtext", :rtf
diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb
new file mode 100644
index 000000000..6cc0e03e4
--- /dev/null
+++ b/config/initializers/session_store.rb
@@ -0,0 +1,3 @@
+# Be sure to restart your server when you modify this file.
+
+Rails.application.config.session_store :cookie_store, key: '_api-muncher_session'
diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb
new file mode 100644
index 000000000..33725e95f
--- /dev/null
+++ b/config/initializers/wrap_parameters.rb
@@ -0,0 +1,14 @@
+# Be sure to restart your server when you modify this file.
+
+# This file contains settings for ActionController::ParamsWrapper which
+# is enabled by default.
+
+# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
+ActiveSupport.on_load(:action_controller) do
+ wrap_parameters format: [:json] if respond_to?(:wrap_parameters)
+end
+
+# To enable root element in JSON for ActiveRecord objects.
+# ActiveSupport.on_load(:active_record) do
+# self.include_root_in_json = true
+# end
diff --git a/config/locales/en.yml b/config/locales/en.yml
new file mode 100644
index 000000000..065395716
--- /dev/null
+++ b/config/locales/en.yml
@@ -0,0 +1,23 @@
+# Files in the config/locales directory are used for internationalization
+# and are automatically loaded by Rails. If you want to use locales other
+# than English, add the necessary files in this directory.
+#
+# To use the locales, use `I18n.t`:
+#
+# I18n.t 'hello'
+#
+# In views, this is aliased to just `t`:
+#
+# <%= t('hello') %>
+#
+# To use a different locale, set it with `I18n.locale`:
+#
+# I18n.locale = :es
+#
+# This would use the information in config/locales/es.yml.
+#
+# To learn more, please read the Rails Internationalization guide
+# available at http://guides.rubyonrails.org/i18n.html.
+
+en:
+ hello: "Hello world"
diff --git a/config/routes.rb b/config/routes.rb
new file mode 100644
index 000000000..3f66539d5
--- /dev/null
+++ b/config/routes.rb
@@ -0,0 +1,56 @@
+Rails.application.routes.draw do
+ # The priority is based upon order of creation: first created -> highest priority.
+ # See how all your routes lay out with "rake routes".
+
+ # You can have the root of your site routed with "root"
+ # root 'welcome#index'
+
+ # Example of regular route:
+ # get 'products/:id' => 'catalog#view'
+
+ # Example of named route that can be invoked with purchase_url(id: product.id)
+ # get 'products/:id/purchase' => 'catalog#purchase', as: :purchase
+
+ # Example resource route (maps HTTP verbs to controller actions automatically):
+ # resources :products
+
+ # Example resource route with options:
+ # resources :products do
+ # member do
+ # get 'short'
+ # post 'toggle'
+ # end
+ #
+ # collection do
+ # get 'sold'
+ # end
+ # end
+
+ # Example resource route with sub-resources:
+ # resources :products do
+ # resources :comments, :sales
+ # resource :seller
+ # end
+
+ # Example resource route with more complex sub-resources:
+ # resources :products do
+ # resources :comments
+ # resources :sales do
+ # get 'recent', on: :collection
+ # end
+ # end
+
+ # Example resource route with concerns:
+ # concern :toggleable do
+ # post 'toggle'
+ # end
+ # resources :posts, concerns: :toggleable
+ # resources :photos, concerns: :toggleable
+
+ # Example resource route within a namespace:
+ # namespace :admin do
+ # # Directs /admin/products/* to Admin::ProductsController
+ # # (app/controllers/admin/products_controller.rb)
+ # resources :products
+ # end
+end
diff --git a/config/secrets.yml b/config/secrets.yml
new file mode 100644
index 000000000..02e9972c9
--- /dev/null
+++ b/config/secrets.yml
@@ -0,0 +1,22 @@
+# Be sure to restart your server when you modify this file.
+
+# Your secret key is used for verifying the integrity of signed cookies.
+# If you change this key, all old signed cookies will become invalid!
+
+# Make sure the secret is at least 30 characters and all random,
+# no regular words or you'll be exposed to dictionary attacks.
+# You can use `rake secret` to generate a secure secret key.
+
+# Make sure the secrets in this file are kept private
+# if you're sharing your code publicly.
+
+development:
+ secret_key_base: f59f1e1d31357c67ea1a090e639164db7fed19b6a778e898c5b978bc319bf9a692fde3f325857abf57d629e9ce4b40d689ed2ee13e36e1fbc4a5517a2da64752
+
+test:
+ secret_key_base: 910f71acefda276db3133cc809401a01fc8537b4dcd1c9c92650b5ee952759473383b68babce2cc9fb9b01798bf26846dcbe837494a03171884437d3614ec954
+
+# Do not keep production secrets in the repository,
+# instead read values from the environment.
+production:
+ secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
diff --git a/db/seeds.rb b/db/seeds.rb
new file mode 100644
index 000000000..4edb1e857
--- /dev/null
+++ b/db/seeds.rb
@@ -0,0 +1,7 @@
+# This file should contain all the record creation needed to seed the database with its default values.
+# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
+#
+# Examples:
+#
+# cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }])
+# Mayor.create(name: 'Emanuel', city: cities.first)
diff --git a/lib/assets/.keep b/lib/assets/.keep
new file mode 100644
index 000000000..e69de29bb
diff --git a/lib/tasks/.keep b/lib/tasks/.keep
new file mode 100644
index 000000000..e69de29bb
diff --git a/log/.keep b/log/.keep
new file mode 100644
index 000000000..e69de29bb
diff --git a/public/404.html b/public/404.html
new file mode 100644
index 000000000..b612547fc
--- /dev/null
+++ b/public/404.html
@@ -0,0 +1,67 @@
+
+
+
+ The page you were looking for doesn't exist (404)
+
+
+
+
+
+
+
+
+
The page you were looking for doesn't exist.
+
You may have mistyped the address or the page may have moved.
+
+
If you are the application owner check the logs for more information.
+
+
+
diff --git a/public/422.html b/public/422.html
new file mode 100644
index 000000000..a21f82b3b
--- /dev/null
+++ b/public/422.html
@@ -0,0 +1,67 @@
+
+
+
+ The change you wanted was rejected (422)
+
+
+
+
+
+
+
+
+
The change you wanted was rejected.
+
Maybe you tried to change something you didn't have access to.
+
+
If you are the application owner check the logs for more information.
+
+
+
diff --git a/public/500.html b/public/500.html
new file mode 100644
index 000000000..061abc587
--- /dev/null
+++ b/public/500.html
@@ -0,0 +1,66 @@
+
+
+
+ We're sorry, but something went wrong (500)
+
+
+
+
+
+
+
+
+
We're sorry, but something went wrong.
+
+
If you are the application owner check the logs for more information.
+
+
+
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 000000000..e69de29bb
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100644
index 000000000..3c9c7c01f
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,5 @@
+# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file
+#
+# To ban all spiders from the entire site uncomment the next two lines:
+# User-agent: *
+# Disallow: /
diff --git a/test/controllers/.keep b/test/controllers/.keep
new file mode 100644
index 000000000..e69de29bb
diff --git a/test/fixtures/.keep b/test/fixtures/.keep
new file mode 100644
index 000000000..e69de29bb
diff --git a/test/helpers/.keep b/test/helpers/.keep
new file mode 100644
index 000000000..e69de29bb
diff --git a/test/integration/.keep b/test/integration/.keep
new file mode 100644
index 000000000..e69de29bb
diff --git a/test/mailers/.keep b/test/mailers/.keep
new file mode 100644
index 000000000..e69de29bb
diff --git a/test/models/.keep b/test/models/.keep
new file mode 100644
index 000000000..e69de29bb
diff --git a/test/test_helper.rb b/test/test_helper.rb
new file mode 100644
index 000000000..92e39b2d7
--- /dev/null
+++ b/test/test_helper.rb
@@ -0,0 +1,10 @@
+ENV['RAILS_ENV'] ||= 'test'
+require File.expand_path('../../config/environment', __FILE__)
+require 'rails/test_help'
+
+class ActiveSupport::TestCase
+ # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
+ fixtures :all
+
+ # Add more helper methods to be used by all tests here...
+end
diff --git a/vendor/assets/javascripts/.keep b/vendor/assets/javascripts/.keep
new file mode 100644
index 000000000..e69de29bb
diff --git a/vendor/assets/stylesheets/.keep b/vendor/assets/stylesheets/.keep
new file mode 100644
index 000000000..e69de29bb
From b8550b1ae9848cf5e54340c206cf4ba9e6a65f23 Mon Sep 17 00:00:00 2001
From: Emily Abrash
Date: Wed, 2 Nov 2016 10:23:45 -0700
Subject: [PATCH 02/11] working with basic functionality
---
Gemfile | 13 ++++-
Gemfile.lock | 16 +++++
app/assets/images/edamamlogo.png | Bin 0 -> 5227 bytes
app/assets/javascripts/recipefinders.coffee | 3 +
app/assets/javascripts/recipes.coffee | 3 +
app/assets/stylesheets/recipefinders.scss | 3 +
app/assets/stylesheets/recipes.scss | 3 +
app/controllers/recipefinders_controller.rb | 17 ++++++
app/controllers/recipes_controller.rb | 5 ++
app/helpers/recipefinders_helper.rb | 2 +
app/helpers/recipes_helper.rb | 2 +
app/views/recipefinders/index.html.erb | 10 ++++
app/views/recipefinders/show.html.erb | 25 ++++++++
app/views/recipes/show.html.erb | 55 ++++++++++++++++++
config/application.rb | 1 +
config/routes.rb | 9 +++
lib/edamam_api_wrapper.rb | 38 ++++++++++++
lib/recipe.rb | 43 ++++++++++++++
.../recipefinders_controller_test.rb | 14 +++++
test/controllers/recipes_controller_test.rb | 9 +++
20 files changed, 269 insertions(+), 2 deletions(-)
create mode 100644 app/assets/images/edamamlogo.png
create mode 100644 app/assets/javascripts/recipefinders.coffee
create mode 100644 app/assets/javascripts/recipes.coffee
create mode 100644 app/assets/stylesheets/recipefinders.scss
create mode 100644 app/assets/stylesheets/recipes.scss
create mode 100644 app/controllers/recipefinders_controller.rb
create mode 100644 app/controllers/recipes_controller.rb
create mode 100644 app/helpers/recipefinders_helper.rb
create mode 100644 app/helpers/recipes_helper.rb
create mode 100644 app/views/recipefinders/index.html.erb
create mode 100644 app/views/recipefinders/show.html.erb
create mode 100644 app/views/recipes/show.html.erb
create mode 100644 lib/edamam_api_wrapper.rb
create mode 100644 lib/recipe.rb
create mode 100644 test/controllers/recipefinders_controller_test.rb
create mode 100644 test/controllers/recipes_controller_test.rb
diff --git a/Gemfile b/Gemfile
index 12770b950..e1da4a820 100644
--- a/Gemfile
+++ b/Gemfile
@@ -14,6 +14,14 @@ gem 'coffee-rails', '~> 4.1.0'
# See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby
+gem 'httparty'
+
+gem 'jquery-turbolinks'
+
+gem 'awesome_print'
+
+gem 'json'
+
# Use jquery as the JavaScript library
gem 'jquery-rails'
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
@@ -35,6 +43,9 @@ gem 'sdoc', '~> 0.4.0', group: :doc
group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug'
+ gem 'dotenv-rails'
+ gem 'better_errors'
+ gem 'binding_of_caller'
end
group :development do
@@ -43,6 +54,4 @@ group :development do
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
gem 'spring'
- gem 'better_errors'
- gem 'binding_of_caller'
end
diff --git a/Gemfile.lock b/Gemfile.lock
index 77c764a1e..a5ab90e0d 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -37,6 +37,7 @@ GEM
thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1)
arel (6.0.3)
+ awesome_print (1.7.0)
better_errors (2.1.1)
coderay (>= 1.0.0)
erubis (>= 2.6.6)
@@ -55,10 +56,16 @@ GEM
coffee-script-source (1.10.0)
concurrent-ruby (1.0.2)
debug_inspector (0.0.2)
+ dotenv (2.1.1)
+ dotenv-rails (2.1.1)
+ dotenv (= 2.1.1)
+ railties (>= 4.0, < 5.1)
erubis (2.7.0)
execjs (2.7.0)
globalid (0.3.7)
activesupport (>= 4.1.0)
+ httparty (0.14.0)
+ multi_xml (>= 0.5.2)
i18n (0.7.0)
jbuilder (2.6.0)
activesupport (>= 3.0.0, < 5.1)
@@ -67,6 +74,9 @@ GEM
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
+ jquery-turbolinks (2.1.0)
+ railties (>= 3.1.0)
+ turbolinks
json (1.8.3)
loofah (2.0.3)
nokogiri (>= 1.5.9)
@@ -78,6 +88,7 @@ GEM
mini_portile2 (2.1.0)
minitest (5.9.1)
multi_json (1.12.1)
+ multi_xml (0.5.5)
nokogiri (1.6.8.1)
mini_portile2 (~> 2.1.0)
rack (1.6.4)
@@ -150,12 +161,17 @@ PLATFORMS
ruby
DEPENDENCIES
+ awesome_print
better_errors
binding_of_caller
byebug
coffee-rails (~> 4.1.0)
+ dotenv-rails
+ httparty
jbuilder (~> 2.0)
jquery-rails
+ jquery-turbolinks
+ json
rails (= 4.2.7)
sass-rails (~> 5.0)
sdoc (~> 0.4.0)
diff --git a/app/assets/images/edamamlogo.png b/app/assets/images/edamamlogo.png
new file mode 100644
index 0000000000000000000000000000000000000000..af145d8739954e31a94953b2ac018d0a09157236
GIT binary patch
literal 5227
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 E C I P E F I N D E R S
+Find new favorite recipes for every taste!
+
+<%= flash[:notice] %>
+
+<%= form_tag recipefinders_show_path(0), method: "get" do %>
+ <%= label_tag :query, "Search" %>
+ <%= text_field_tag :query %>
+ <%= submit_tag "Find recipes", class: "Button" %>
+<% end %>
diff --git a/app/views/recipefinders/show.html.erb b/app/views/recipefinders/show.html.erb
new file mode 100644
index 000000000..dd3fce810
--- /dev/null
+++ b/app/views/recipefinders/show.html.erb
@@ -0,0 +1,25 @@
+
R E C I P E S
+
+<%= button_to "New search", recipefinders_index_path, method: :get %>
+
+<% if @recipes.length == 0 %>
+ Sorry, there were no results for that search. Please try again!
+<% else %>
+ Showing results from <%= @results_begin %> to <%= @results_end %>
+
+ <% if @results_begin > 10 %>
+ <%= link_to "Previous page", recipefinders_show_path(@results_begin-11, query: @search_term) %>
+ <% end %>
+ <% if @count - @results_end > 0 && @results_end < 100%>
+ <%= link_to "Next page", recipefinders_show_path(from: @results_end, query: @search_term) %>
+ <% end %>
+
+
+ <%@recipes.each do |recipe| %>
+
+ <%= image_tag recipe.image, alt: recipe.name %>
+ <%= link_to recipe.name, recipes_show_path(recipe.uri) %>
+
+ <% end %>
+
+<% end %>
diff --git a/app/views/recipes/show.html.erb b/app/views/recipes/show.html.erb
new file mode 100644
index 000000000..fb5352f9b
--- /dev/null
+++ b/app/views/recipes/show.html.erb
@@ -0,0 +1,55 @@
+<%= @recipe.name %>
+<%= image_tag @recipe.image, alt: @recipe.name %>
+ Ingredients
+
+ <% @recipe.ingredients_block.each do |ingredient| %>
+
+ <%= ingredient %>
+
+ <% end %>
+
+ Makes <%= @recipe.servings.round %> servings.
+Link to full recipe
+<%= link_to @recipe.name, @recipe.url %> (<%= @recipe.source %> <%= image_tag @recipe.source_icon, alt: @recipe.source_icon %>)
+Nutrition information
+Calories (per serving)
+ <%= (@recipe.calories/@recipe.servings).round %> cal
+Nutrition overview
+
+
+
+ | Nutrient |
+ Quantity |
+ Percent RDI |
+
+
+ <% @recipe.digest.each do |block| %>
+
+ <%= block['label'] %>
+
+ <% block['sub'].each do |subitem| %>
+     <%= subitem['label'] %>
+ <% end %>
+ <% end %>
+ |
+ <%= (block['total']/@recipe.servings).round %> <%= block['unit']%>
+ <% if block['sub'] %>
+
+ <% block['sub'].each do |subitem| %>
+ <%= (subitem['total']/@recipe.servings).round %> <%= subitem['unit']%>
+ <% end %>
+ <% end %>
+ |
+ <%= (block['daily']/@recipe.servings).round %> %
+ <% if block['sub'] %>
+
+ <% block['sub'].each do |subitem| %>
+ <%= (subitem['daily']/@recipe.servings).round %> %
+ <% end %>
+ <% end %>
+ |
+
+ <% end %>
+
+
diff --git a/config/application.rb b/config/application.rb
index 20568697a..4ecc7a04a 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -22,5 +22,6 @@ class Application < Rails::Application
# Do not swallow errors in after_commit/after_rollback callbacks.
config.active_record.raise_in_transactional_callbacks = true
+ config.autoload_paths << Rails.root.join('lib')
end
end
diff --git a/config/routes.rb b/config/routes.rb
index 3f66539d5..f13190ddc 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,4 +1,13 @@
Rails.application.routes.draw do
+
+ root 'recipefinders#index'
+
+ get 'recipefinders/index'
+
+ get 'recipefinders/show/:from' => 'recipefinders#show', as: 'recipefinders_show'
+
+ get 'recipes/show/:id' => 'recipes#show', as: 'recipes_show'
+
# The priority is based upon order of creation: first created -> highest priority.
# See how all your routes lay out with "rake routes".
diff --git a/lib/edamam_api_wrapper.rb b/lib/edamam_api_wrapper.rb
new file mode 100644
index 000000000..0d2ab0198
--- /dev/null
+++ b/lib/edamam_api_wrapper.rb
@@ -0,0 +1,38 @@
+require 'httparty'
+
+class Edamam_Api_Wrapper
+
+ CLIENT_ID = ENV["EDAMAM_CLIENT_ID"]
+ CLIENT_SECRET = ENV["EDAMAM_CLIENT_SECRET"]
+ BASE_URL = "https://api.edamam.com/"
+
+ def self.search(search_term, start_index)
+
+ url = "#{BASE_URL}search?q=#{search_term}&from=#{start_index}&app_id=#{CLIENT_ID}&app_key=#{CLIENT_SECRET}"
+ response = HTTParty.get(url)
+
+ if response.code != 200
+ return false
+ end
+
+ my_recipes = []
+
+ response["hits"].each do |response_item|
+ my_recipes << Recipe.new(response_item['recipe'])
+ end
+
+ return [my_recipes, response['count']]
+
+ end
+
+ def self.getrecipe(recipe_uri)
+
+ url = "#{BASE_URL}search?r=http://www.edamam.com/ontologies/edamam.owl%23recipe_#{recipe_uri}&app_id=#{CLIENT_ID}&app_key=#{CLIENT_SECRET}"
+ response = HTTParty.get(url)
+
+ recipe = Recipe.new(response.first)
+
+ return recipe
+ end
+
+end
diff --git a/lib/recipe.rb b/lib/recipe.rb
new file mode 100644
index 000000000..e38613a0e
--- /dev/null
+++ b/lib/recipe.rb
@@ -0,0 +1,43 @@
+
+class Recipe
+
+ attr_reader :name, :uri, :url, :image, :source, :source_icon, :servings, :diet_labels, :health_labels, :ingredients_block, :ingredients, :calories, :total_nutrients, :total_daily, :digest
+
+ def initialize(recipe_hash)
+
+ @name = recipe_hash['label']
+ @url = recipe_hash['url']
+
+ @uri = ""
+ start_uri = false
+
+ recipe_hash['uri'].each_char do |char|
+ if char == "_"
+ start_uri = true
+ end
+
+ if start_uri
+ @uri << char
+ end
+ end
+
+ if @name == nil || @name == "" || @url == nil || @url == "" || @uri == nil || @uri == ""
+ raise ArgumentError
+ end
+
+ @servings = recipe_hash['yield']
+ @image = recipe_hash['image']
+ @source = recipe_hash['source']
+ @source_icon = recipe_hash['sourceIcon']
+ @diet_labels = recipe_hash['dietLabels']
+ @health_labels = recipe_hash['healthLabels']
+ @ingredients_block = recipe_hash['ingredientLines']
+ @ingredients = recipe_hash['ingredients']
+ @calories = recipe_hash['calories']
+ @total_nutrients = recipe_hash['totalNutrients']
+ @total_daily = recipe_hash['totalDaily']
+ @digest = recipe_hash['digest']
+
+ end
+
+end
diff --git a/test/controllers/recipefinders_controller_test.rb b/test/controllers/recipefinders_controller_test.rb
new file mode 100644
index 000000000..118d4f2fd
--- /dev/null
+++ b/test/controllers/recipefinders_controller_test.rb
@@ -0,0 +1,14 @@
+require 'test_helper'
+
+class RecipefindersControllerTest < ActionController::TestCase
+ test "should get index" do
+ get :index
+ assert_response :success
+ end
+
+ test "should get show" do
+ get :show
+ assert_response :success
+ end
+
+end
diff --git a/test/controllers/recipes_controller_test.rb b/test/controllers/recipes_controller_test.rb
new file mode 100644
index 000000000..fd0c9aed4
--- /dev/null
+++ b/test/controllers/recipes_controller_test.rb
@@ -0,0 +1,9 @@
+require 'test_helper'
+
+class RecipesControllerTest < ActionController::TestCase
+ test "should get show" do
+ get :show
+ assert_response :success
+ end
+
+end
From 7bd96c9ad0bdcd28624f39108c7ac765a915b833 Mon Sep 17 00:00:00 2001
From: Emily Abrash
Date: Wed, 2 Nov 2016 17:39:10 -0700
Subject: [PATCH 03/11] front page and footer with basic funcitonality
---
app/.DS_Store | Bin 0 -> 6148 bytes
app/assets/.DS_Store | Bin 0 -> 6148 bytes
app/assets/images/landingpicture.jpeg | Bin 0 -> 1154271 bytes
app/assets/stylesheets/application.css | 62 +
app/assets/stylesheets/foundation.css | 4226 +++++++++++++++++++
app/controllers/recipefinders_controller.rb | 1 +
app/views/layouts/application.html.erb | 27 +-
app/views/recipefinders/index.html.erb | 19 +-
app/views/recipefinders/show.html.erb | 8 +-
lib/edamam_api_wrapper.rb | 1 +
10 files changed, 4332 insertions(+), 12 deletions(-)
create mode 100644 app/.DS_Store
create mode 100644 app/assets/.DS_Store
create mode 100644 app/assets/images/landingpicture.jpeg
create mode 100644 app/assets/stylesheets/foundation.css
diff --git a/app/.DS_Store b/app/.DS_Store
new file mode 100644
index 0000000000000000000000000000000000000000..a6f46d150c7d3c6211c27f84426ab5d24fd813ca
GIT binary patch
literal 6148
zcmeHK%}(1u5Z(mL0_o5sD)D%wzCV
zxbh5D`wl!xZ=KoQphhW25TKc8_M4rZ*|ooocD#%+-Wo(}jJb?43ly9
z7!M*>a}+EOhj}kdvT!Dv9Iuf9+`D-eupE9do8G@aVK0$+(P%vI%3Srs{DNiI9LK3S
z?qcnm-_3@85fp>G74*NVo{Zwq*zKU`PV9p$OCIeYJe2XU<9^)D(jt&)-2W%_QXxif+eUZujFeNNopcd?<4n%0w3DmTlXX-Emh&qxI%iU94~JjO$|5
zY&Pm*b7OlvcJD3g)9Tje{o~&F;_~YH=Ev>b&tG~cIQ(gqEE$}@Z!o4vIrIBzlBM6l
zKgpTI5)uQ%05R|e88Ang<-EaXr$;6Rh=J#20M7>jis%_EHL9Zn8vK03@hTz;*m##f
z6b3zmrA8P5;W`yir*d<};5r@r!o+z7ON~06akVncV^-$ohQihA;1?>KaZe+)!~iic
z&A^=Qx>*0eJbnM4PNE($Kn%Pq26%PP-)q4unc6z@a#(8x=qV@)#+4c$Q@~KA7-F#$
cuYf86zd!@fGgxW_4+wn-C>p3C240kbzwpFm)Bpeg
literal 0
HcmV?d00001
diff --git a/app/assets/.DS_Store b/app/assets/.DS_Store
new file mode 100644
index 0000000000000000000000000000000000000000..f4a5a8960e1097597514651ac2ee0554e7218ec1
GIT binary patch
literal 6148
zcmeHK&1%~~5Z-m1RWlA$f;9N^hOnUFQcU*I>$wnf+#GXLhA;%&wL(#yg|r17kj8%mGELxzIczIF33e
zHS0m-dXAKptj|*Tskvx!EFuF~I}fU+*cr>9Zuj*o<8e8Nvm%CwzwscGrE0Zqd2Ok_
z{OYyiHayR3c>bHlao8`$p^DU~>_o#u-IGZgTe};n{>AoywEHkOj9M^Rnx96`;ChP6Z
zrdZ$jG;NAWyWMJvjgMQ?sekD>YwtI=zkD4`zyJ98>-YJei>qr>6Api0EpIK(;0BCm
z=s69Cc~<1#AYzt1%OWHOhyh|?!5OgImg6n>bJF7x1H{0~Gl2Vp07VQeRtELf0S$gW
z;&>eq1#G-aAPS3t#mXRzfN+xvXi~YoVsMiVeqrMRi&bVF~=CLbtdqd%Rb?^%v
z&Uj#uT4I10c+9|(>H2v7?>>M3f1E@;Vt^RqF`KQ
m@Gb=meH2419>uGmTEH*R01PZv2EhYD9|D>NYKVasW#Av_9cXR<
literal 0
HcmV?d00001
diff --git a/app/assets/images/landingpicture.jpeg b/app/assets/images/landingpicture.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..f933a901081191c8ef91adac563ce511df76e0bf
GIT binary patch
literal 1154271
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
&a^wMc*YzkZ`ulQWpu?Ez
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