From b2c4575944611807a0258dd77c946208920d26f9 Mon Sep 17 00:00:00 2001
From: Brandi Phillips
Date: Mon, 31 Oct 2016 16:45:57 -0700
Subject: [PATCH 01/25] baseline setup
---
.gitignore | 17 ++
Gemfile | 52 +++++
Gemfile.lock | 192 ++++++++++++++++++
README.rdoc | 28 +++
Rakefile | 6 +
app/assets/images/.keep | 0
app/assets/javascripts/application.js | 16 ++
app/assets/javascripts/hompages.coffee | 3 +
app/assets/stylesheets/application.css | 15 ++
app/assets/stylesheets/hompages.scss | 3 +
app/controllers/application_controller.rb | 5 +
app/controllers/concerns/.keep | 0
app/controllers/hompages_controller.rb | 10 +
app/helpers/application_helper.rb | 2 +
app/helpers/hompages_helper.rb | 2 +
app/mailers/.keep | 0
app/models/.keep | 0
app/models/concerns/.keep | 0
app/views/hompages/create.html.erb | 2 +
app/views/hompages/index.html.erb | 2 +
app/views/hompages/new.html.erb | 2 +
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 | 62 ++++++
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/controllers/hompages_controller_test.rb | 19 ++
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
65 files changed, 1072 insertions(+)
create mode 100644 .gitignore
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/javascripts/hompages.coffee
create mode 100644 app/assets/stylesheets/application.css
create mode 100644 app/assets/stylesheets/hompages.scss
create mode 100644 app/controllers/application_controller.rb
create mode 100644 app/controllers/concerns/.keep
create mode 100644 app/controllers/hompages_controller.rb
create mode 100644 app/helpers/application_helper.rb
create mode 100644 app/helpers/hompages_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/hompages/create.html.erb
create mode 100644 app/views/hompages/index.html.erb
create mode 100644 app/views/hompages/new.html.erb
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/controllers/hompages_controller_test.rb
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/.gitignore b/.gitignore
new file mode 100644
index 000000000..050c9d95c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,17 @@
+# See https://help.github.com/articles/ignoring-files for more about ignoring files.
+#
+# If you find yourself ignoring temporary files generated by your text editor
+# or operating system, you probably want to add a global ignore instead:
+# git config --global core.excludesfile '~/.gitignore_global'
+
+# Ignore bundler config.
+/.bundle
+
+# Ignore the default SQLite database.
+/db/*.sqlite3
+/db/*.sqlite3-journal
+
+# Ignore all logfiles and tempfiles.
+/log/*
+!/log/.keep
+/tmp
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 000000000..e5fd8433e
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,52 @@
+source 'https://rubygems.org'
+
+gem 'awesome_print'
+
+# 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
+
+gem 'httparty'
+gem 'foundation-rails'
+
+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'
+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'
+end
diff --git a/Gemfile.lock b/Gemfile.lock
new file mode 100644
index 000000000..8499dcd3d
--- /dev/null
+++ b/Gemfile.lock
@@ -0,0 +1,192 @@
+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)
+ awesome_print (1.7.0)
+ babel-source (5.8.35)
+ babel-transpiler (0.7.0)
+ babel-source (>= 4.0, < 6)
+ execjs (~> 2.0)
+ 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)
+ 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)
+ foundation-rails (6.2.4.0)
+ railties (>= 3.1.0)
+ sass (>= 3.3.0, < 3.5)
+ sprockets-es6 (>= 0.9.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)
+ 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)
+ multi_xml (0.5.5)
+ 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-es6 (0.9.2)
+ babel-source (>= 5.8.11)
+ babel-transpiler
+ sprockets (>= 3.0.0)
+ 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
+ awesome_print
+ better_errors
+ byebug
+ coffee-rails (~> 4.1.0)
+ dotenv-rails
+ foundation-rails
+ httparty
+ 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.6
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/javascripts/hompages.coffee b/app/assets/javascripts/hompages.coffee
new file mode 100644
index 000000000..24f83d18b
--- /dev/null
+++ b/app/assets/javascripts/hompages.coffee
@@ -0,0 +1,3 @@
+# Place all the behaviors and hooks related to the matching controller here.
+# All this logic will automatically be available in application.js.
+# You can use CoffeeScript in this file: http://coffeescript.org/
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/assets/stylesheets/hompages.scss b/app/assets/stylesheets/hompages.scss
new file mode 100644
index 000000000..c0017ca2f
--- /dev/null
+++ b/app/assets/stylesheets/hompages.scss
@@ -0,0 +1,3 @@
+// Place all the styles related to the hompages controller here.
+// They will automatically be included in application.css.
+// You can use Sass (SCSS) here: http://sass-lang.com/
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/controllers/hompages_controller.rb b/app/controllers/hompages_controller.rb
new file mode 100644
index 000000000..71fc28f18
--- /dev/null
+++ b/app/controllers/hompages_controller.rb
@@ -0,0 +1,10 @@
+class HompagesController < ApplicationController
+ def index
+ end
+
+ def new
+ end
+
+ def create
+ end
+end
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/helpers/hompages_helper.rb b/app/helpers/hompages_helper.rb
new file mode 100644
index 000000000..49d0f9ff8
--- /dev/null
+++ b/app/helpers/hompages_helper.rb
@@ -0,0 +1,2 @@
+module HompagesHelper
+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/hompages/create.html.erb b/app/views/hompages/create.html.erb
new file mode 100644
index 000000000..f990bf3b7
--- /dev/null
+++ b/app/views/hompages/create.html.erb
@@ -0,0 +1,2 @@
+Hompages#create
+Find me in app/views/hompages/create.html.erb
diff --git a/app/views/hompages/index.html.erb b/app/views/hompages/index.html.erb
new file mode 100644
index 000000000..836ea64ba
--- /dev/null
+++ b/app/views/hompages/index.html.erb
@@ -0,0 +1,2 @@
+Hompages#index
+Find me in app/views/hompages/index.html.erb
diff --git a/app/views/hompages/new.html.erb b/app/views/hompages/new.html.erb
new file mode 100644
index 000000000..de16d93cf
--- /dev/null
+++ b/app/views/hompages/new.html.erb
@@ -0,0 +1,2 @@
+Hompages#new
+Find me in app/views/hompages/new.html.erb
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..f16b76cec
--- /dev/null
+++ b/config/routes.rb
@@ -0,0 +1,62 @@
+Rails.application.routes.draw do
+ get 'hompages/index'
+
+ get 'hompages/new'
+
+ get 'hompages/create'
+
+ # 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..1ed3fc03e
--- /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: 66c77e6c3e8ed8dd65c02ef4e9a2f7c7c6094cfff131fc2607493a9c8e6d2218c6f4e89295f7fdc7480f34da327ec7deb659a1121a9d144236939102b70a75c6
+
+test:
+ secret_key_base: 1f427961bc01818b3dd42c6d762904b362f2a27bfa6c55a38331fea6832e0c5f8167b02947a3c97d132e40894ab100b07611a1ffa5f27f654dd7bb0dc2fc7f6f
+
+# 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/controllers/hompages_controller_test.rb b/test/controllers/hompages_controller_test.rb
new file mode 100644
index 000000000..d7004642c
--- /dev/null
+++ b/test/controllers/hompages_controller_test.rb
@@ -0,0 +1,19 @@
+require 'test_helper'
+
+class HompagesControllerTest < ActionController::TestCase
+ test "should get index" do
+ get :index
+ assert_response :success
+ end
+
+ test "should get new" do
+ get :new
+ assert_response :success
+ end
+
+ test "should get create" do
+ get :create
+ assert_response :success
+ end
+
+end
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 e6dcc3ebb49b8b6f62babc702617cd36cc02b4d6 Mon Sep 17 00:00:00 2001
From: Brandi Phillips
Date: Mon, 31 Oct 2016 17:15:24 -0700
Subject: [PATCH 02/25] installed foundation
---
.gitignore | 4 +
Gemfile | 2 +
Gemfile.lock | 4 +
app/assets/javascripts/application.js | 10 +
app/assets/stylesheets/_settings.scss | 574 ++++++++++++++++++
.../{application.css => application.scss} | 2 +
.../stylesheets/foundation_and_overrides.scss | 52 ++
app/views/layouts/application.html.erb | 29 +-
8 files changed, 665 insertions(+), 12 deletions(-)
create mode 100644 app/assets/stylesheets/_settings.scss
rename app/assets/stylesheets/{application.css => application.scss} (94%)
create mode 100644 app/assets/stylesheets/foundation_and_overrides.scss
diff --git a/.gitignore b/.gitignore
index 050c9d95c..b5996c819 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,3 +15,7 @@
/log/*
!/log/.keep
/tmp
+
+.env
+/*.env
+.DS_Store
diff --git a/Gemfile b/Gemfile
index e5fd8433e..826119ad8 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,5 +1,7 @@
source 'https://rubygems.org'
+gem 'jquery-turbolinks'
+
gem 'awesome_print'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
diff --git a/Gemfile.lock b/Gemfile.lock
index 8499dcd3d..d07d4fa38 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -82,6 +82,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)
@@ -179,6 +182,7 @@ DEPENDENCIES
httparty
jbuilder (~> 2.0)
jquery-rails
+ jquery-turbolinks
rails (= 4.2.7)
sass-rails (~> 5.0)
sdoc (~> 0.4.0)
diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js
index e07c5a830..90f4f5442 100644
--- a/app/assets/javascripts/application.js
+++ b/app/assets/javascripts/application.js
@@ -12,5 +12,15 @@
//
//= require jquery
//= require jquery_ujs
+//= require foundation
//= require turbolinks
//= require_tree .
+
+// $(function(){ $(document).foundation(); });
+
+//= require foundation
+$(document).foundation();
+
+$(document).on('turbolinks:load', function() {
+ $(function(){ $(document).foundation(); });
+});
diff --git a/app/assets/stylesheets/_settings.scss b/app/assets/stylesheets/_settings.scss
new file mode 100644
index 000000000..703053eb9
--- /dev/null
+++ b/app/assets/stylesheets/_settings.scss
@@ -0,0 +1,574 @@
+// Foundation for Sites Settings
+// -----------------------------
+//
+// Table of Contents:
+//
+// 1. Global
+// 2. Breakpoints
+// 3. The Grid
+// 4. Base Typography
+// 5. Typography Helpers
+// 6. Abide
+// 7. Accordion
+// 8. Accordion Menu
+// 9. Badge
+// 10. Breadcrumbs
+// 11. Button
+// 12. Button Group
+// 13. Callout
+// 14. Close Button
+// 15. Drilldown
+// 16. Dropdown
+// 17. Dropdown Menu
+// 18. Flex Video
+// 19. Forms
+// 20. Label
+// 21. Media Object
+// 22. Menu
+// 23. Meter
+// 24. Off-canvas
+// 25. Orbit
+// 26. Pagination
+// 27. Progress Bar
+// 28. Reveal
+// 29. Slider
+// 30. Switch
+// 31. Table
+// 32. Tabs
+// 33. Thumbnail
+// 34. Title Bar
+// 35. Tooltip
+// 36. Top Bar
+
+@import 'util/util';
+
+// 1. Global
+// ---------
+
+$global-font-size: 100%;
+$global-width: rem-calc(1200);
+$global-lineheight: 1.5;
+$foundation-palette: (
+ primary: #2199e8,
+ secondary: #777,
+ success: #3adb76,
+ warning: #ffae00,
+ alert: #ec5840,
+);
+$light-gray: #e6e6e6;
+$medium-gray: #cacaca;
+$dark-gray: #8a8a8a;
+$black: #0a0a0a;
+$white: #fefefe;
+$body-background: $white;
+$body-font-color: $black;
+$body-font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;
+$body-antialiased: true;
+$global-margin: 1rem;
+$global-padding: 1rem;
+$global-weight-normal: normal;
+$global-weight-bold: bold;
+$global-radius: 0;
+$global-text-direction: ltr;
+$global-flexbox: false;
+$print-transparent-backgrounds: true;
+
+@include add-foundation-colors;
+
+// 2. Breakpoints
+// --------------
+
+$breakpoints: (
+ small: 0,
+ medium: 640px,
+ large: 1024px,
+ xlarge: 1200px,
+ xxlarge: 1440px,
+);
+$breakpoint-classes: (small medium large);
+
+// 3. The Grid
+// -----------
+
+$grid-row-width: $global-width;
+$grid-column-count: 12;
+$grid-column-gutter: (
+ small: 20px,
+ medium: 30px,
+);
+$grid-column-align-edge: true;
+$block-grid-max: 8;
+
+// 4. Base Typography
+// ------------------
+
+$header-font-family: $body-font-family;
+$header-font-weight: $global-weight-normal;
+$header-font-style: normal;
+$font-family-monospace: Consolas, 'Liberation Mono', Courier, monospace;
+$header-sizes: (
+ small: (
+ 'h1': 24,
+ 'h2': 20,
+ 'h3': 19,
+ 'h4': 18,
+ 'h5': 17,
+ 'h6': 16,
+ ),
+ medium: (
+ 'h1': 48,
+ 'h2': 40,
+ 'h3': 31,
+ 'h4': 25,
+ 'h5': 20,
+ 'h6': 16,
+ ),
+);
+$header-color: inherit;
+$header-lineheight: 1.4;
+$header-margin-bottom: 0.5rem;
+$header-text-rendering: optimizeLegibility;
+$small-font-size: 80%;
+$header-small-font-color: $medium-gray;
+$paragraph-lineheight: 1.6;
+$paragraph-margin-bottom: 1rem;
+$paragraph-text-rendering: optimizeLegibility;
+$code-color: $black;
+$code-font-family: $font-family-monospace;
+$code-font-weight: $global-weight-normal;
+$code-background: $light-gray;
+$code-border: 1px solid $medium-gray;
+$code-padding: rem-calc(2 5 1);
+$anchor-color: $primary-color;
+$anchor-color-hover: scale-color($anchor-color, $lightness: -14%);
+$anchor-text-decoration: none;
+$anchor-text-decoration-hover: none;
+$hr-width: $global-width;
+$hr-border: 1px solid $medium-gray;
+$hr-margin: rem-calc(20) auto;
+$list-lineheight: $paragraph-lineheight;
+$list-margin-bottom: $paragraph-margin-bottom;
+$list-style-type: disc;
+$list-style-position: outside;
+$list-side-margin: 1.25rem;
+$list-nested-side-margin: 1.25rem;
+$defnlist-margin-bottom: 1rem;
+$defnlist-term-weight: $global-weight-bold;
+$defnlist-term-margin-bottom: 0.3rem;
+$blockquote-color: $dark-gray;
+$blockquote-padding: rem-calc(9 20 0 19);
+$blockquote-border: 1px solid $medium-gray;
+$cite-font-size: rem-calc(13);
+$cite-color: $dark-gray;
+$keystroke-font: $font-family-monospace;
+$keystroke-color: $black;
+$keystroke-background: $light-gray;
+$keystroke-padding: rem-calc(2 4 0);
+$keystroke-radius: $global-radius;
+$abbr-underline: 1px dotted $black;
+
+// 5. Typography Helpers
+// ---------------------
+
+$lead-font-size: $global-font-size * 1.25;
+$lead-lineheight: 1.6;
+$subheader-lineheight: 1.4;
+$subheader-color: $dark-gray;
+$subheader-font-weight: $global-weight-normal;
+$subheader-margin-top: 0.2rem;
+$subheader-margin-bottom: 0.5rem;
+$stat-font-size: 2.5rem;
+
+// 6. Abide
+// --------
+
+$abide-inputs: true;
+$abide-labels: true;
+$input-background-invalid: map-get($foundation-palette, alert);
+$form-label-color-invalid: map-get($foundation-palette, alert);
+$input-error-color: map-get($foundation-palette, alert);
+$input-error-font-size: rem-calc(12);
+$input-error-font-weight: $global-weight-bold;
+
+// 7. Accordion
+// ------------
+
+$accordion-background: $white;
+$accordion-plusminus: true;
+$accordion-item-color: foreground($accordion-background, $primary-color);
+$accordion-item-background-hover: $light-gray;
+$accordion-item-padding: 1.25rem 1rem;
+$accordion-content-background: $white;
+$accordion-content-border: 1px solid $light-gray;
+$accordion-content-color: foreground($accordion-content-background, $body-font-color);
+$accordion-content-padding: 1rem;
+
+// 8. Accordion Menu
+// -----------------
+
+$accordionmenu-arrows: true;
+$accordionmenu-arrow-color: $primary-color;
+
+// 9. Badge
+// --------
+
+$badge-background: $primary-color;
+$badge-color: foreground($badge-background);
+$badge-padding: 0.3em;
+$badge-minwidth: 2.1em;
+$badge-font-size: 0.6rem;
+
+// 10. Breadcrumbs
+// ---------------
+
+$breadcrumbs-margin: 0 0 $global-margin 0;
+$breadcrumbs-item-font-size: rem-calc(11);
+$breadcrumbs-item-color: $primary-color;
+$breadcrumbs-item-color-current: $black;
+$breadcrumbs-item-color-disabled: $medium-gray;
+$breadcrumbs-item-margin: 0.75rem;
+$breadcrumbs-item-uppercase: true;
+$breadcrumbs-item-slash: true;
+
+// 11. Button
+// ----------
+
+$button-padding: 0.85em 1em;
+$button-margin: 0 0 $global-margin 0;
+$button-fill: solid;
+$button-background: $primary-color;
+$button-background-hover: scale-color($button-background, $lightness: -15%);
+$button-color: $white;
+$button-color-alt: $black;
+$button-radius: $global-radius;
+$button-sizes: (
+ tiny: 0.6rem,
+ small: 0.75rem,
+ default: 0.9rem,
+ large: 1.25rem,
+);
+$button-opacity-disabled: 0.25;
+$button-background-hover-lightness: -20%;
+$button-hollow-hover-lightness: -50%;
+
+// 12. Button Group
+// ----------------
+
+$buttongroup-margin: 1rem;
+$buttongroup-spacing: 1px;
+$buttongroup-child-selector: '.button';
+$buttongroup-expand-max: 6;
+
+// 13. Callout
+// -----------
+
+$callout-background: $white;
+$callout-background-fade: 85%;
+$callout-border: 1px solid rgba($black, 0.25);
+$callout-margin: 0 0 1rem 0;
+$callout-padding: 1rem;
+$callout-font-color: $body-font-color;
+$callout-font-color-alt: $body-background;
+$callout-radius: $global-radius;
+$callout-link-tint: 30%;
+
+// 14. Close Button
+// ----------------
+
+$closebutton-position: right top;
+$closebutton-offset-horizontal: 1rem;
+$closebutton-offset-vertical: 0.5rem;
+$closebutton-size: 2em;
+$closebutton-lineheight: 1;
+$closebutton-color: $dark-gray;
+$closebutton-color-hover: $black;
+
+// 15. Drilldown
+// -------------
+
+$drilldown-transition: transform 0.15s linear;
+$drilldown-arrows: true;
+$drilldown-arrow-color: $primary-color;
+$drilldown-background: $white;
+
+// 16. Dropdown
+// ------------
+
+$dropdown-padding: 1rem;
+$dropdown-border: 1px solid $medium-gray;
+$dropdown-font-size: 1rem;
+$dropdown-width: 300px;
+$dropdown-radius: $global-radius;
+$dropdown-sizes: (
+ tiny: 100px,
+ small: 200px,
+ large: 400px,
+);
+
+// 17. Dropdown Menu
+// -----------------
+
+$dropdownmenu-arrows: true;
+$dropdownmenu-arrow-color: $anchor-color;
+$dropdownmenu-min-width: 200px;
+$dropdownmenu-background: $white;
+$dropdownmenu-border: 1px solid $medium-gray;
+
+// 18. Flex Video
+// --------------
+
+$flexvideo-margin-bottom: rem-calc(16);
+$flexvideo-ratio: 4 by 3;
+$flexvideo-ratio-widescreen: 16 by 9;
+
+// 19. Forms
+// ---------
+
+$fieldset-border: 1px solid $medium-gray;
+$fieldset-padding: rem-calc(20);
+$fieldset-margin: rem-calc(18 0);
+$legend-padding: rem-calc(0 3);
+$form-spacing: rem-calc(16);
+$helptext-color: $black;
+$helptext-font-size: rem-calc(13);
+$helptext-font-style: italic;
+$input-prefix-color: $black;
+$input-prefix-background: $light-gray;
+$input-prefix-border: 1px solid $medium-gray;
+$input-prefix-padding: 1rem;
+$form-label-color: $black;
+$form-label-font-size: rem-calc(14);
+$form-label-font-weight: $global-weight-normal;
+$form-label-line-height: 1.8;
+$select-background: $white;
+$select-triangle-color: $dark-gray;
+$select-radius: $global-radius;
+$input-color: $black;
+$input-placeholder-color: $medium-gray;
+$input-font-family: inherit;
+$input-font-size: rem-calc(16);
+$input-background: $white;
+$input-background-focus: $white;
+$input-background-disabled: $light-gray;
+$input-border: 1px solid $medium-gray;
+$input-border-focus: 1px solid $dark-gray;
+$input-shadow: inset 0 1px 2px rgba($black, 0.1);
+$input-shadow-focus: 0 0 5px $medium-gray;
+$input-cursor-disabled: not-allowed;
+$input-transition: box-shadow 0.5s, border-color 0.25s ease-in-out;
+$input-number-spinners: true;
+$input-radius: $global-radius;
+$button-radius: $global-radius;
+
+// 20. Label
+// ---------
+
+$label-background: $primary-color;
+$label-color: foreground($label-background);
+$label-font-size: 0.8rem;
+$label-padding: 0.33333rem 0.5rem;
+$label-radius: $global-radius;
+
+// 21. Media Object
+// ----------------
+
+$mediaobject-margin-bottom: $global-margin;
+$mediaobject-section-padding: $global-padding;
+$mediaobject-image-width-stacked: 100%;
+
+// 22. Menu
+// --------
+
+$menu-margin: 0;
+$menu-margin-nested: 1rem;
+$menu-item-padding: 0.7rem 1rem;
+$menu-item-color-active: $white;
+$menu-item-background-active: map-get($foundation-palette, primary);
+$menu-icon-spacing: 0.25rem;
+
+// 23. Meter
+// ---------
+
+$meter-height: 1rem;
+$meter-radius: $global-radius;
+$meter-background: $medium-gray;
+$meter-fill-good: $success-color;
+$meter-fill-medium: $warning-color;
+$meter-fill-bad: $alert-color;
+
+// 24. Off-canvas
+// --------------
+
+$offcanvas-size: 250px;
+$offcanvas-background: $light-gray;
+$offcanvas-zindex: -1;
+$offcanvas-transition-length: 0.5s;
+$offcanvas-transition-timing: ease;
+$offcanvas-fixed-reveal: true;
+$offcanvas-exit-background: rgba($white, 0.25);
+$maincontent-class: 'off-canvas-content';
+$maincontent-shadow: 0 0 10px rgba($black, 0.5);
+
+// 25. Orbit
+// ---------
+
+$orbit-bullet-background: $medium-gray;
+$orbit-bullet-background-active: $dark-gray;
+$orbit-bullet-diameter: 1.2rem;
+$orbit-bullet-margin: 0.1rem;
+$orbit-bullet-margin-top: 0.8rem;
+$orbit-bullet-margin-bottom: 0.8rem;
+$orbit-caption-background: rgba($black, 0.5);
+$orbit-caption-padding: 1rem;
+$orbit-control-background-hover: rgba($black, 0.5);
+$orbit-control-padding: 1rem;
+$orbit-control-zindex: 10;
+
+// 26. Pagination
+// --------------
+
+$pagination-font-size: rem-calc(14);
+$pagination-margin-bottom: $global-margin;
+$pagination-item-color: $black;
+$pagination-item-padding: rem-calc(3 10);
+$pagination-item-spacing: rem-calc(1);
+$pagination-radius: $global-radius;
+$pagination-item-background-hover: $light-gray;
+$pagination-item-background-current: $primary-color;
+$pagination-item-color-current: foreground($pagination-item-background-current);
+$pagination-item-color-disabled: $medium-gray;
+$pagination-ellipsis-color: $black;
+$pagination-mobile-items: false;
+$pagination-mobile-current-item: false;
+$pagination-arrows: true;
+
+// 27. Progress Bar
+// ----------------
+
+$progress-height: 1rem;
+$progress-background: $medium-gray;
+$progress-margin-bottom: $global-margin;
+$progress-meter-background: $primary-color;
+$progress-radius: $global-radius;
+
+// 28. Reveal
+// ----------
+
+$reveal-background: $white;
+$reveal-width: 600px;
+$reveal-max-width: $global-width;
+$reveal-padding: $global-padding;
+$reveal-border: 1px solid $medium-gray;
+$reveal-radius: $global-radius;
+$reveal-zindex: 1005;
+$reveal-overlay-background: rgba($black, 0.45);
+
+// 29. Slider
+// ----------
+
+$slider-width-vertical: 0.5rem;
+$slider-transition: all 0.2s ease-in-out;
+$slider-height: 0.5rem;
+$slider-background: $light-gray;
+$slider-fill-background: $medium-gray;
+$slider-handle-height: 1.4rem;
+$slider-handle-width: 1.4rem;
+$slider-handle-background: $primary-color;
+$slider-opacity-disabled: 0.25;
+$slider-radius: $global-radius;
+
+// 30. Switch
+// ----------
+
+$switch-background: $medium-gray;
+$switch-background-active: $primary-color;
+$switch-height: 2rem;
+$switch-height-tiny: 1.5rem;
+$switch-height-small: 1.75rem;
+$switch-height-large: 2.5rem;
+$switch-radius: $global-radius;
+$switch-margin: $global-margin;
+$switch-paddle-background: $white;
+$switch-paddle-offset: 0.25rem;
+$switch-paddle-radius: $global-radius;
+$switch-paddle-transition: all 0.25s ease-out;
+
+// 31. Table
+// ---------
+
+$table-background: $white;
+$table-color-scale: 5%;
+$table-border: 1px solid smart-scale($table-background, $table-color-scale);
+$table-padding: rem-calc(8 10 10);
+$table-hover-scale: 2%;
+$table-row-hover: darken($table-background, $table-hover-scale);
+$table-row-stripe-hover: darken($table-background, $table-color-scale + $table-hover-scale);
+$table-striped-background: smart-scale($table-background, $table-color-scale);
+$table-stripe: even;
+$table-head-background: smart-scale($table-background, $table-color-scale / 2);
+$table-head-row-hover: darken($table-head-background, $table-hover-scale);
+$table-foot-background: smart-scale($table-background, $table-color-scale);
+$table-foot-row-hover: darken($table-foot-background, $table-hover-scale);
+$table-head-font-color: $body-font-color;
+$table-foot-font-color: $body-font-color;
+$show-header-for-stacked: false;
+
+// 32. Tabs
+// --------
+
+$tab-margin: 0;
+$tab-background: $white;
+$tab-background-active: $light-gray;
+$tab-item-font-size: rem-calc(12);
+$tab-item-background-hover: $white;
+$tab-item-padding: 1.25rem 1.5rem;
+$tab-expand-max: 6;
+$tab-content-background: $white;
+$tab-content-border: $light-gray;
+$tab-content-color: foreground($tab-background, $primary-color);
+$tab-content-padding: 1rem;
+
+// 33. Thumbnail
+// -------------
+
+$thumbnail-border: solid 4px $white;
+$thumbnail-margin-bottom: $global-margin;
+$thumbnail-shadow: 0 0 0 1px rgba($black, 0.2);
+$thumbnail-shadow-hover: 0 0 6px 1px rgba($primary-color, 0.5);
+$thumbnail-transition: box-shadow 200ms ease-out;
+$thumbnail-radius: $global-radius;
+
+// 34. Title Bar
+// -------------
+
+$titlebar-background: $black;
+$titlebar-color: $white;
+$titlebar-padding: 0.5rem;
+$titlebar-text-font-weight: bold;
+$titlebar-icon-color: $white;
+$titlebar-icon-color-hover: $medium-gray;
+$titlebar-icon-spacing: 0.25rem;
+
+// 35. Tooltip
+// -----------
+
+$has-tip-font-weight: $global-weight-bold;
+$has-tip-border-bottom: dotted 1px $dark-gray;
+$tooltip-background-color: $black;
+$tooltip-color: $white;
+$tooltip-padding: 0.75rem;
+$tooltip-font-size: $small-font-size;
+$tooltip-pip-width: 0.75rem;
+$tooltip-pip-height: $tooltip-pip-width * 0.866;
+$tooltip-radius: $global-radius;
+
+// 36. Top Bar
+// -----------
+
+$topbar-padding: 0.5rem;
+$topbar-background: $light-gray;
+$topbar-submenu-background: $topbar-background;
+$topbar-title-spacing: 1rem;
+$topbar-input-width: 200px;
+$topbar-unstack-breakpoint: medium;
+
diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.scss
similarity index 94%
rename from app/assets/stylesheets/application.css
rename to app/assets/stylesheets/application.scss
index f9cd5b348..c8b8e576f 100644
--- a/app/assets/stylesheets/application.css
+++ b/app/assets/stylesheets/application.scss
@@ -12,4 +12,6 @@
*
*= require_tree .
*= require_self
+ *= require foundation_and_overrides
+
*/
diff --git a/app/assets/stylesheets/foundation_and_overrides.scss b/app/assets/stylesheets/foundation_and_overrides.scss
new file mode 100644
index 000000000..458eb4faf
--- /dev/null
+++ b/app/assets/stylesheets/foundation_and_overrides.scss
@@ -0,0 +1,52 @@
+@charset 'utf-8';
+
+@import 'settings';
+@import 'foundation';
+
+// If you'd like to include motion-ui the foundation-rails gem comes prepackaged with it, uncomment the 3 @imports, if you are not using the gem you need to install the motion-ui sass package.
+//
+@import 'motion-ui/motion-ui';
+
+// We include everything by default. To slim your CSS, remove components you don't use.
+
+@include foundation-global-styles;
+@include foundation-grid;
+@include foundation-typography;
+@include foundation-button;
+@include foundation-forms;
+@include foundation-visibility-classes;
+@include foundation-float-classes;
+@include foundation-accordion;
+@include foundation-accordion-menu;
+@include foundation-badge;
+@include foundation-breadcrumbs;
+@include foundation-button-group;
+@include foundation-callout;
+@include foundation-close-button;
+@include foundation-drilldown-menu;
+@include foundation-dropdown;
+@include foundation-dropdown-menu;
+@include foundation-flex-video;
+@include foundation-label;
+@include foundation-media-object;
+@include foundation-menu;
+@include foundation-menu-icon;
+@include foundation-off-canvas;
+@include foundation-orbit;
+@include foundation-pagination;
+@include foundation-progress-bar;
+@include foundation-slider;
+@include foundation-sticky;
+@include foundation-reveal;
+@include foundation-switch;
+@include foundation-table;
+@include foundation-tabs;
+@include foundation-thumbnail;
+@include foundation-title-bar;
+@include foundation-tooltip;
+@include foundation-top-bar;
+
+// If you'd like to include motion-ui the foundation-rails gem comes prepackaged with it, uncomment the 3 @imports, if you are not using the gem you need to install the motion-ui sass package.
+//
+@include motion-ui-transitions;
+@include motion-ui-animations;
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb
index 237dbba45..cd6000489 100644
--- a/app/views/layouts/application.html.erb
+++ b/app/views/layouts/application.html.erb
@@ -1,14 +1,19 @@
-
-
- ApiMuncher
- <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
- <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
- <%= csrf_meta_tags %>
-
-
-
-<%= yield %>
-
-
+
+
+
+
+
+ <%= content_for?(:title) ? yield(:title) : "Untitled" %>
+
+ <%= stylesheet_link_tag "application" %>
+ <%= javascript_include_tag "application", 'data-turbolinks-track' => true %>
+ <%= csrf_meta_tags %>
+
+
+
+
+ <%= yield %>
+
+
From 91022b6a65dd83eefbafccc60d4902ef0ec571e4 Mon Sep 17 00:00:00 2001
From: Brandi Phillips
Date: Wed, 2 Nov 2016 08:44:42 -0700
Subject: [PATCH 03/25] set-up basics
---
config/application.rb | 1 +
lib/edemam_api_wrapper.rb | 9 +++++++++
2 files changed, 10 insertions(+)
create mode 100644 lib/edemam_api_wrapper.rb
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/lib/edemam_api_wrapper.rb b/lib/edemam_api_wrapper.rb
new file mode 100644
index 000000000..5272d1fb5
--- /dev/null
+++ b/lib/edemam_api_wrapper.rb
@@ -0,0 +1,9 @@
+require 'httparty'
+
+class EdemamApiWrapper
+ BASE_URL = "https://api.edamam.com"
+ TOKEN = ENV["TOKEN"]
+
+
+
+end
From 378fbeae22003062662e51d5bfdd5253ff5a3d29 Mon Sep 17 00:00:00 2001
From: Brandi Phillips
Date: Wed, 2 Nov 2016 15:36:15 -0700
Subject: [PATCH 04/25] url request from api is working
---
app/controllers/hompages_controller.rb | 10 +++++++++
app/views/hompages/new.html.erb | 11 ++++++++--
lib/edemam_api_wrapper.rb | 30 +++++++++++++++++++++++++-
lib/recipe.rb | 15 +++++++++++++
4 files changed, 63 insertions(+), 3 deletions(-)
create mode 100644 lib/recipe.rb
diff --git a/app/controllers/hompages_controller.rb b/app/controllers/hompages_controller.rb
index 71fc28f18..ac168499d 100644
--- a/app/controllers/hompages_controller.rb
+++ b/app/controllers/hompages_controller.rb
@@ -1,10 +1,20 @@
+require "#{Rails.root}/lib/edemam_api_wrapper.rb"
+require "#{Rails.root}/lib/recipe.rb"
+
+
class HompagesController < ApplicationController
+ # the results will be shown through the index page:
def index
+
end
+ # landing page where one can search for a recipe, paramaters will be brought in through a form:
def new
+ @search = EdemamApiWrapper.request_recipes(params[:search_term])
end
+ # the search results will be stored into a variable:
def create
end
+
end
diff --git a/app/views/hompages/new.html.erb b/app/views/hompages/new.html.erb
index de16d93cf..ae5cd5dfa 100644
--- a/app/views/hompages/new.html.erb
+++ b/app/views/hompages/new.html.erb
@@ -1,2 +1,9 @@
-Hompages#new
-Find me in app/views/hompages/new.html.erb
+Food Love
+Finding all the food you love.
+
+
+ <%= form_tag homepages_path, method: "get" do %>
+ <%= text_field_tag :search_term %>
+ <%= submit_tag "Find Recipes", class: "Button" %>
+<% end %>
+
diff --git a/lib/edemam_api_wrapper.rb b/lib/edemam_api_wrapper.rb
index 5272d1fb5..8eb1a77ee 100644
--- a/lib/edemam_api_wrapper.rb
+++ b/lib/edemam_api_wrapper.rb
@@ -1,9 +1,37 @@
require 'httparty'
class EdemamApiWrapper
- BASE_URL = "https://api.edamam.com"
+ BASE_URL = "https://api.edamam.com/"
TOKEN = ENV["TOKEN"]
+ APP_ID = ENV["APP_ID"]
+ # def initialize(label, image, rec_source, url)
+ # @label = label
+ # @image = image
+ # @source = rec_source
+ # @url = url
+ # end
+
+ # Need to request a list of recipes given a specified search term
+ def self.request_recipes(search_term)
+ url = BASE_URL + "search?" + "q=#{search_term}" + "&app_id=#{APP_ID}" + "&app_key=#{TOKEN}"
+
+ data = HTTParty.get(url)
+ recipes = []
+ if data["hits"] # if the request was successful we should have recieved "hits" from the api
+ # puts = "success"
+ data["hits"].each do |hit|
+ wrapper = Recipe.new(hit["recipe"]["label"], hit["recipe"]["image"], hit["recipe"]["source"], hit["recipe"]["url"])
+ recipes << wrapper
+ end
+ return recipes
+ else
+ return nil
+ end
+
+ end
end
+
+ # curl "https://api.edamam.com/search?q=chicken&app_id=${YOUR_APP_ID}&app_key=${YOUR_APP_KEY}"
diff --git a/lib/recipe.rb b/lib/recipe.rb
new file mode 100644
index 000000000..23a42574c
--- /dev/null
+++ b/lib/recipe.rb
@@ -0,0 +1,15 @@
+class Recipe
+ attr_reader :label, :image, :rec_source, :url
+
+ def initialize(label, image, rec_source, url)
+ if label == nil || label == ""
+ raise ArgumentError
+ end
+
+ @label = label
+ @image = image
+ @source = rec_source
+ @url = url
+ end
+
+end
From 2b5fff2be75fc1f5cb19b791771ab5b4cc21d99b Mon Sep 17 00:00:00 2001
From: Brandi Phillips
Date: Thu, 3 Nov 2016 18:02:09 -0700
Subject: [PATCH 05/25] list view is working
---
app/controllers/homepages_controller.rb | 22 ++++++++++++++++++
app/controllers/hompages_controller.rb | 20 ----------------
.../{hompages => homepages}/create.html.erb | 0
.../new.html.erb => homepages/index.html.erb} | 2 +-
app/views/homepages/new.html.erb | 18 +++++++++++++++
app/views/homepages/show.html.erb | 23 +++++++++++++++++++
app/views/hompages/index.html.erb | 2 --
config/routes.rb | 8 ++++---
lib/edemam_api_wrapper.rb | 21 +++++++++--------
lib/recipe.rb | 17 +++++++++-----
10 files changed, 92 insertions(+), 41 deletions(-)
create mode 100644 app/controllers/homepages_controller.rb
delete mode 100644 app/controllers/hompages_controller.rb
rename app/views/{hompages => homepages}/create.html.erb (100%)
rename app/views/{hompages/new.html.erb => homepages/index.html.erb} (76%)
create mode 100644 app/views/homepages/new.html.erb
create mode 100644 app/views/homepages/show.html.erb
delete mode 100644 app/views/hompages/index.html.erb
diff --git a/app/controllers/homepages_controller.rb b/app/controllers/homepages_controller.rb
new file mode 100644
index 000000000..f86f76d00
--- /dev/null
+++ b/app/controllers/homepages_controller.rb
@@ -0,0 +1,22 @@
+require "#{Rails.root}/lib/edemam_api_wrapper.rb"
+require "#{Rails.root}/lib/recipe.rb"
+
+
+class HomepagesController < ApplicationController
+ # landing page where one can search for a recipe, user inputs parameter
+ def index
+
+ end
+
+ # new list of recipes
+ def new
+ @search_term = params[:search_term]
+ @search_results = EdemamApiWrapper.list_recipes(params[:search_term])
+ end
+
+ # show the individual recipe(use uri as the id):
+ def show
+ @recipe = EdemamApiWrapper.get_a_recipe(params[:uri])
+ end
+
+end
diff --git a/app/controllers/hompages_controller.rb b/app/controllers/hompages_controller.rb
deleted file mode 100644
index ac168499d..000000000
--- a/app/controllers/hompages_controller.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-require "#{Rails.root}/lib/edemam_api_wrapper.rb"
-require "#{Rails.root}/lib/recipe.rb"
-
-
-class HompagesController < ApplicationController
- # the results will be shown through the index page:
- def index
-
- end
-
- # landing page where one can search for a recipe, paramaters will be brought in through a form:
- def new
- @search = EdemamApiWrapper.request_recipes(params[:search_term])
- end
-
- # the search results will be stored into a variable:
- def create
- end
-
-end
diff --git a/app/views/hompages/create.html.erb b/app/views/homepages/create.html.erb
similarity index 100%
rename from app/views/hompages/create.html.erb
rename to app/views/homepages/create.html.erb
diff --git a/app/views/hompages/new.html.erb b/app/views/homepages/index.html.erb
similarity index 76%
rename from app/views/hompages/new.html.erb
rename to app/views/homepages/index.html.erb
index ae5cd5dfa..24d3634d6 100644
--- a/app/views/hompages/new.html.erb
+++ b/app/views/homepages/index.html.erb
@@ -2,7 +2,7 @@
Finding all the food you love.
- <%= form_tag homepages_path, method: "get" do %>
+ <%= form_tag homepages_new_path, method: "get" do %>
<%= text_field_tag :search_term %>
<%= submit_tag "Find Recipes", class: "Button" %>
<% end %>
diff --git a/app/views/homepages/new.html.erb b/app/views/homepages/new.html.erb
new file mode 100644
index 000000000..a2d1542a8
--- /dev/null
+++ b/app/views/homepages/new.html.erb
@@ -0,0 +1,18 @@
+
+
+
+
+
+ <%= "#{@search_term.capitalize} Search Results" %>
+
+<% @search_results.each do |recipe| %>
+
+ <%= image_tag recipe.image %>
+
+
+ <%= link_to recipe.label, homepages_show_path %>
+
+
+<% end %>
+
+
diff --git a/app/views/homepages/show.html.erb b/app/views/homepages/show.html.erb
new file mode 100644
index 000000000..fb88e462c
--- /dev/null
+++ b/app/views/homepages/show.html.erb
@@ -0,0 +1,23 @@
+
+
+
+ Recipe Details
+
+<%= image_tag @recipe.image %>
+
+ <% @recipe.label %>
+
+
+ <% link_to @recipe.source, url: @recipe.url %>
+
+
+ <% @recipe.yield %>
+
+
+ <% @recipe.ingredientLines %>
+
+
+ <% @recipe.healthLabels %>
+
+
+
diff --git a/app/views/hompages/index.html.erb b/app/views/hompages/index.html.erb
deleted file mode 100644
index 836ea64ba..000000000
--- a/app/views/hompages/index.html.erb
+++ /dev/null
@@ -1,2 +0,0 @@
-Hompages#index
-Find me in app/views/hompages/index.html.erb
diff --git a/config/routes.rb b/config/routes.rb
index f16b76cec..595da1a21 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,9 +1,11 @@
Rails.application.routes.draw do
- get 'hompages/index'
- get 'hompages/new'
+ root to: 'homepages#index'
+
+ get 'homepages/new' => 'homepages#new'
+
+ get 'homepages/show' => 'homepages#show'
- get 'hompages/create'
# 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/edemam_api_wrapper.rb b/lib/edemam_api_wrapper.rb
index 8eb1a77ee..0c8134aaa 100644
--- a/lib/edemam_api_wrapper.rb
+++ b/lib/edemam_api_wrapper.rb
@@ -5,15 +5,8 @@ class EdemamApiWrapper
TOKEN = ENV["TOKEN"]
APP_ID = ENV["APP_ID"]
- # def initialize(label, image, rec_source, url)
- # @label = label
- # @image = image
- # @source = rec_source
- # @url = url
- # end
-
# Need to request a list of recipes given a specified search term
- def self.request_recipes(search_term)
+ def self.list_recipes(search_term)
url = BASE_URL + "search?" + "q=#{search_term}" + "&app_id=#{APP_ID}" + "&app_key=#{TOKEN}"
data = HTTParty.get(url)
@@ -21,7 +14,7 @@ def self.request_recipes(search_term)
if data["hits"] # if the request was successful we should have recieved "hits" from the api
# puts = "success"
data["hits"].each do |hit|
- wrapper = Recipe.new(hit["recipe"]["label"], hit["recipe"]["image"], hit["recipe"]["source"], hit["recipe"]["url"])
+ wrapper = Recipe.new(hit["recipe"]["uri"], label: hit["recipe"]["label"], image: hit["recipe"]["image"])
recipes << wrapper
end
return recipes
@@ -31,6 +24,16 @@ def self.request_recipes(search_term)
end
+ def self.get_a_recipe(uri)
+ url = BASE_URL + "search?" + "r=#{uri}" + "&app_id=#{APP_ID}" + "&app_key=#{TOKEN}"
+
+ data = HTTParty.get(url)
+ if data["uri"]
+ recipe = Recipe.new(["uri"], label: ["label"], image: ["image"], source: ["source"], url: ["url"], yield: ["yield"], ingredientLines: ["ingredientLines"], healthLabels: ["healthLabels"])
+ else
+ return nil
+ end
+ end
end
diff --git a/lib/recipe.rb b/lib/recipe.rb
index 23a42574c..b67e3ed56 100644
--- a/lib/recipe.rb
+++ b/lib/recipe.rb
@@ -1,15 +1,20 @@
class Recipe
attr_reader :label, :image, :rec_source, :url
- def initialize(label, image, rec_source, url)
- if label == nil || label == ""
+ def initialize(uri, options = {})
+ if uri == nil || uri == ""
raise ArgumentError
end
- @label = label
- @image = image
- @source = rec_source
- @url = url
+ @uri = uri
+
+ @label = options[:label]
+ @image = options[:image]
+ @source = options[:rec_source]
+ @url = options[:url]
+ @yield = options[:yield]
+ @ingredientLines = options[:ingredientLines]
+ @healthLabels = options[:healthLabels]
end
end
From a61b212df77000df9181f6b715a94c55e4c58f4a Mon Sep 17 00:00:00 2001
From: Brandi Phillips
Date: Fri, 4 Nov 2016 14:58:35 -0700
Subject: [PATCH 06/25] I see chicken
---
app/assets/javascripts/recipes.coffee | 3 ++
app/assets/stylesheets/recipes.scss | 3 ++
app/controllers/homepages_controller.rb | 10 ------
app/controllers/recipes_controller.rb | 16 ++++++++++
app/helpers/recipes_helper.rb | 2 ++
app/views/homepages/create.html.erb | 2 --
app/views/homepages/index.html.erb | 4 +--
app/views/homepages/show.html.erb | 23 -------------
.../new.html.erb => recipes/index.html.erb} | 5 ++-
app/views/recipes/show.html.erb | 32 +++++++++++++++++++
config/routes.rb | 5 ++-
lib/edemam_api_wrapper.rb | 11 ++++---
lib/recipe.rb | 4 +--
test/controllers/recipes_controller_test.rb | 14 ++++++++
14 files changed, 85 insertions(+), 49 deletions(-)
create mode 100644 app/assets/javascripts/recipes.coffee
create mode 100644 app/assets/stylesheets/recipes.scss
create mode 100644 app/controllers/recipes_controller.rb
create mode 100644 app/helpers/recipes_helper.rb
delete mode 100644 app/views/homepages/create.html.erb
delete mode 100644 app/views/homepages/show.html.erb
rename app/views/{homepages/new.html.erb => recipes/index.html.erb} (76%)
create mode 100644 app/views/recipes/show.html.erb
create mode 100644 test/controllers/recipes_controller_test.rb
diff --git a/app/assets/javascripts/recipes.coffee b/app/assets/javascripts/recipes.coffee
new file mode 100644
index 000000000..24f83d18b
--- /dev/null
+++ b/app/assets/javascripts/recipes.coffee
@@ -0,0 +1,3 @@
+# Place all the behaviors and hooks related to the matching controller here.
+# All this logic will automatically be available in application.js.
+# You can use CoffeeScript in this file: http://coffeescript.org/
diff --git a/app/assets/stylesheets/recipes.scss b/app/assets/stylesheets/recipes.scss
new file mode 100644
index 000000000..1e10ffa50
--- /dev/null
+++ b/app/assets/stylesheets/recipes.scss
@@ -0,0 +1,3 @@
+// Place all the styles related to the recipes controller here.
+// They will automatically be included in application.css.
+// You can use Sass (SCSS) here: http://sass-lang.com/
diff --git a/app/controllers/homepages_controller.rb b/app/controllers/homepages_controller.rb
index f86f76d00..247632ca5 100644
--- a/app/controllers/homepages_controller.rb
+++ b/app/controllers/homepages_controller.rb
@@ -8,15 +8,5 @@ def index
end
- # new list of recipes
- def new
- @search_term = params[:search_term]
- @search_results = EdemamApiWrapper.list_recipes(params[:search_term])
- end
-
- # show the individual recipe(use uri as the id):
- def show
- @recipe = EdemamApiWrapper.get_a_recipe(params[:uri])
- end
end
diff --git a/app/controllers/recipes_controller.rb b/app/controllers/recipes_controller.rb
new file mode 100644
index 000000000..06d7588ff
--- /dev/null
+++ b/app/controllers/recipes_controller.rb
@@ -0,0 +1,16 @@
+require "#{Rails.root}/lib/edemam_api_wrapper.rb"
+require "#{Rails.root}/lib/recipe.rb"
+
+class RecipesController < ApplicationController
+ def index
+ @search_term = params[:search_term]
+ @search_results = EdemamApiWrapper.list_recipes(params[:search_term])
+
+ end
+
+ def show
+
+ @recipe = EdemamApiWrapper.get_a_recipe(params[:uri])
+
+ end
+end
diff --git a/app/helpers/recipes_helper.rb b/app/helpers/recipes_helper.rb
new file mode 100644
index 000000000..f526316e2
--- /dev/null
+++ b/app/helpers/recipes_helper.rb
@@ -0,0 +1,2 @@
+module RecipesHelper
+end
diff --git a/app/views/homepages/create.html.erb b/app/views/homepages/create.html.erb
deleted file mode 100644
index f990bf3b7..000000000
--- a/app/views/homepages/create.html.erb
+++ /dev/null
@@ -1,2 +0,0 @@
-Hompages#create
-Find me in app/views/hompages/create.html.erb
diff --git a/app/views/homepages/index.html.erb b/app/views/homepages/index.html.erb
index 24d3634d6..121f94047 100644
--- a/app/views/homepages/index.html.erb
+++ b/app/views/homepages/index.html.erb
@@ -1,8 +1,8 @@
-Food Love
+For The Love of Food
Finding all the food you love.
- <%= form_tag homepages_new_path, method: "get" do %>
+ <%= form_tag recipes_index_path, method: "get" do %>
<%= text_field_tag :search_term %>
<%= submit_tag "Find Recipes", class: "Button" %>
<% end %>
diff --git a/app/views/homepages/show.html.erb b/app/views/homepages/show.html.erb
deleted file mode 100644
index fb88e462c..000000000
--- a/app/views/homepages/show.html.erb
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
- Recipe Details
-
-<%= image_tag @recipe.image %>
-
- <% @recipe.label %>
-
-
- <% link_to @recipe.source, url: @recipe.url %>
-
-
- <% @recipe.yield %>
-
-
- <% @recipe.ingredientLines %>
-
-
- <% @recipe.healthLabels %>
-
-
-
diff --git a/app/views/homepages/new.html.erb b/app/views/recipes/index.html.erb
similarity index 76%
rename from app/views/homepages/new.html.erb
rename to app/views/recipes/index.html.erb
index a2d1542a8..45baaea64 100644
--- a/app/views/homepages/new.html.erb
+++ b/app/views/recipes/index.html.erb
@@ -1,5 +1,3 @@
-
-
@@ -10,7 +8,8 @@
<%= image_tag recipe.image %>
- <%= link_to recipe.label, homepages_show_path %>
+ <%= link_to recipe.label, recipe_show_path(recipe.uri)%>
+
<% end %>
diff --git a/app/views/recipes/show.html.erb b/app/views/recipes/show.html.erb
new file mode 100644
index 000000000..c9a8818ff
--- /dev/null
+++ b/app/views/recipes/show.html.erb
@@ -0,0 +1,32 @@
+
+
+
+
+ <%= @recipe.label %>
+
+<%= image_tag @recipe.image %>
+
+Recipe Source: <%= link_to @recipe.source, url_for(@recipe.url) %>
+
+
+ <%= "Recipe Yields: #{@recipe.yield}" %>
+
+
+ Ingredients
+
+ <% @recipe.ingredientLines.each do |ingredient| %>
+ -
+ <%= ingredient %>
+
+ <% end %>
+
+ Dietary Categories
+
+ <% @recipe.healthLabels.each do|label| %>
+ -
+ <%= label %>
+
+ <% end %>
+
+
+
diff --git a/config/routes.rb b/config/routes.rb
index 595da1a21..faa8c6357 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,10 +1,9 @@
Rails.application.routes.draw do
-
root to: 'homepages#index'
- get 'homepages/new' => 'homepages#new'
+ get 'recipes/index' => 'recipes#index'
- get 'homepages/show' => 'homepages#show'
+ get 'recipes/:uri/show' => 'recipes#show', as: 'recipe_show'
# The priority is based upon order of creation: first created -> highest priority.
diff --git a/lib/edemam_api_wrapper.rb b/lib/edemam_api_wrapper.rb
index 0c8134aaa..42e1f4466 100644
--- a/lib/edemam_api_wrapper.rb
+++ b/lib/edemam_api_wrapper.rb
@@ -14,7 +14,9 @@ def self.list_recipes(search_term)
if data["hits"] # if the request was successful we should have recieved "hits" from the api
# puts = "success"
data["hits"].each do |hit|
- wrapper = Recipe.new(hit["recipe"]["uri"], label: hit["recipe"]["label"], image: hit["recipe"]["image"])
+ a = hit["recipe"]["uri"]
+ uri = a.slice!(/h.*_/)
+ wrapper = Recipe.new(a, label: hit["recipe"]["label"], image: hit["recipe"]["image"])
recipes << wrapper
end
return recipes
@@ -25,11 +27,12 @@ def self.list_recipes(search_term)
end
def self.get_a_recipe(uri)
- url = BASE_URL + "search?" + "r=#{uri}" + "&app_id=#{APP_ID}" + "&app_key=#{TOKEN}"
+ url = BASE_URL + "search?" + "r=http://www.edamam.com/ontologies/edamam.owl%23recipe_#{uri}" + "&app_id=#{APP_ID}" + "&app_key=#{TOKEN}"
data = HTTParty.get(url)
- if data["uri"]
- recipe = Recipe.new(["uri"], label: ["label"], image: ["image"], source: ["source"], url: ["url"], yield: ["yield"], ingredientLines: ["ingredientLines"], healthLabels: ["healthLabels"])
+
+ if data[0]["uri"]
+ recipe = Recipe.new(data[0]["uri"], label: data[0]["label"], image: data[0]["image"], source: data[0]["source"], url: data[0]["url"], yield: data[0]["yield"], ingredientLines: data[0]["ingredientLines"], healthLabels: data[0]["healthLabels"])
else
return nil
end
diff --git a/lib/recipe.rb b/lib/recipe.rb
index b67e3ed56..254595df1 100644
--- a/lib/recipe.rb
+++ b/lib/recipe.rb
@@ -1,5 +1,5 @@
class Recipe
- attr_reader :label, :image, :rec_source, :url
+ attr_reader :uri, :label, :image, :source, :url, :yield, :ingredientLines, :healthLabels
def initialize(uri, options = {})
if uri == nil || uri == ""
@@ -10,7 +10,7 @@ def initialize(uri, options = {})
@label = options[:label]
@image = options[:image]
- @source = options[:rec_source]
+ @source = options[:source]
@url = options[:url]
@yield = options[:yield]
@ingredientLines = options[:ingredientLines]
diff --git a/test/controllers/recipes_controller_test.rb b/test/controllers/recipes_controller_test.rb
new file mode 100644
index 000000000..841be6132
--- /dev/null
+++ b/test/controllers/recipes_controller_test.rb
@@ -0,0 +1,14 @@
+require 'test_helper'
+
+class RecipesControllerTest < 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
From 1cfcc8f5fa53bd5b571045ffd668ec73324ea503 Mon Sep 17 00:00:00 2001
From: Brandi Phillips
Date: Sun, 6 Nov 2016 13:10:03 -0800
Subject: [PATCH 07/25] tests are written
---
Gemfile | 2 +
Gemfile.lock | 18 ++++++
app/controllers/homepages_controller.rb | 1 -
app/controllers/recipes_controller.rb | 3 +-
app/views/homepages/index.html.erb | 18 +++---
config/routes.rb | 4 ++
lib/edemam_api_wrapper.rb | 8 +--
test/controllers/hompages_controller_test.rb | 21 +++----
test/controllers/recipes_controller_test.rb | 24 +++++---
test/lib/edemam_api_wrapper.rb | 58 ++++++++++++++++++++
test/lib/recipe.rb | 16 ++++++
test/test_helper.rb | 19 +++++++
12 files changed, 155 insertions(+), 37 deletions(-)
create mode 100644 test/lib/edemam_api_wrapper.rb
create mode 100644 test/lib/recipe.rb
diff --git a/Gemfile b/Gemfile
index 826119ad8..c87a2beed 100644
--- a/Gemfile
+++ b/Gemfile
@@ -43,6 +43,8 @@ group :development, :test do
gem 'byebug'
gem 'dotenv-rails'
gem 'better_errors'
+ gem 'minitest-vcr'
+ gem 'webmock'
end
group :development do
diff --git a/Gemfile.lock b/Gemfile.lock
index d07d4fa38..be8ce7edb 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -36,6 +36,7 @@ GEM
minitest (~> 5.1)
thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1)
+ addressable (2.4.0)
arel (6.0.3)
awesome_print (1.7.0)
babel-source (5.8.35)
@@ -59,6 +60,8 @@ GEM
execjs
coffee-script-source (1.10.0)
concurrent-ruby (1.0.2)
+ crack (0.4.3)
+ safe_yaml (~> 1.0.0)
debug_inspector (0.0.2)
dotenv (2.1.1)
dotenv-rails (2.1.1)
@@ -72,6 +75,7 @@ GEM
sprockets-es6 (>= 0.9.0)
globalid (0.3.7)
activesupport (>= 4.1.0)
+ hashdiff (0.3.0)
httparty (0.14.0)
multi_xml (>= 0.5.2)
i18n (0.7.0)
@@ -94,7 +98,13 @@ GEM
mime-types-data (~> 3.2015)
mime-types-data (3.2016.0521)
mini_portile2 (2.1.0)
+ minispec-metadata (2.0.0)
+ minitest
minitest (5.9.1)
+ minitest-vcr (1.4.0)
+ minispec-metadata (~> 2.0)
+ minitest (>= 4.7.5)
+ vcr (>= 2.9)
multi_json (1.12.1)
multi_xml (0.5.5)
nokogiri (1.6.8.1)
@@ -129,6 +139,7 @@ GEM
rake (11.3.0)
rdoc (4.2.2)
json (~> 1.4)
+ safe_yaml (1.0.4)
sass (3.4.22)
sass-rails (5.0.6)
railties (>= 4.0.0, < 6)
@@ -163,11 +174,16 @@ GEM
thread_safe (~> 0.1)
uglifier (3.0.3)
execjs (>= 0.3.0, < 3)
+ vcr (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)
+ webmock (2.1.0)
+ addressable (>= 2.3.6)
+ crack (>= 0.3.2)
+ hashdiff
PLATFORMS
ruby
@@ -183,6 +199,7 @@ DEPENDENCIES
jbuilder (~> 2.0)
jquery-rails
jquery-turbolinks
+ minitest-vcr
rails (= 4.2.7)
sass-rails (~> 5.0)
sdoc (~> 0.4.0)
@@ -191,6 +208,7 @@ DEPENDENCIES
turbolinks
uglifier (>= 1.3.0)
web-console (~> 2.0)
+ webmock
BUNDLED WITH
1.13.6
diff --git a/app/controllers/homepages_controller.rb b/app/controllers/homepages_controller.rb
index 247632ca5..7ca2aba54 100644
--- a/app/controllers/homepages_controller.rb
+++ b/app/controllers/homepages_controller.rb
@@ -5,7 +5,6 @@
class HomepagesController < ApplicationController
# landing page where one can search for a recipe, user inputs parameter
def index
-
end
diff --git a/app/controllers/recipes_controller.rb b/app/controllers/recipes_controller.rb
index 06d7588ff..de987f64f 100644
--- a/app/controllers/recipes_controller.rb
+++ b/app/controllers/recipes_controller.rb
@@ -11,6 +11,7 @@ def index
def show
@recipe = EdemamApiWrapper.get_a_recipe(params[:uri])
-
+
end
+
end
diff --git a/app/views/homepages/index.html.erb b/app/views/homepages/index.html.erb
index 121f94047..1e56cf0d3 100644
--- a/app/views/homepages/index.html.erb
+++ b/app/views/homepages/index.html.erb
@@ -1,9 +1,11 @@
-For The Love of Food
-Finding all the food you love.
-
- <%= form_tag recipes_index_path, method: "get" do %>
- <%= text_field_tag :search_term %>
- <%= submit_tag "Find Recipes", class: "Button" %>
-<% end %>
-
+
+ For The Love of Food
+ Finding all the food you love.
+
+
+ <%= form_tag recipes_index_path, method: "get" do %>
+ <%= text_field_tag :search_term %>
+ <%= submit_tag "Find Recipes", class: "Button" %>
+ <% end %>
+
diff --git a/config/routes.rb b/config/routes.rb
index faa8c6357..31bf36e8d 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,4 +1,8 @@
Rails.application.routes.draw do
+ get 'recipes/index'
+
+ get 'recipes/show'
+
root to: 'homepages#index'
get 'recipes/index' => 'recipes#index'
diff --git a/lib/edemam_api_wrapper.rb b/lib/edemam_api_wrapper.rb
index 42e1f4466..48da2e08f 100644
--- a/lib/edemam_api_wrapper.rb
+++ b/lib/edemam_api_wrapper.rb
@@ -14,9 +14,9 @@ def self.list_recipes(search_term)
if data["hits"] # if the request was successful we should have recieved "hits" from the api
# puts = "success"
data["hits"].each do |hit|
- a = hit["recipe"]["uri"]
- uri = a.slice!(/h.*_/)
- wrapper = Recipe.new(a, label: hit["recipe"]["label"], image: hit["recipe"]["image"])
+ uri = hit["recipe"]["uri"]
+ a = uri.slice!(/h.*_/)
+ wrapper = Recipe.new(uri, label: hit["recipe"]["label"], image: hit["recipe"]["image"])
recipes << wrapper
end
return recipes
@@ -40,4 +40,4 @@ def self.get_a_recipe(uri)
end
- # curl "https://api.edamam.com/search?q=chicken&app_id=${YOUR_APP_ID}&app_key=${YOUR_APP_KEY}"
+
diff --git a/test/controllers/hompages_controller_test.rb b/test/controllers/hompages_controller_test.rb
index d7004642c..6d0f0d8f4 100644
--- a/test/controllers/hompages_controller_test.rb
+++ b/test/controllers/hompages_controller_test.rb
@@ -1,19 +1,12 @@
require 'test_helper'
class HompagesControllerTest < ActionController::TestCase
- test "should get index" do
- get :index
- assert_response :success
- end
-
- test "should get new" do
- get :new
- assert_response :success
- end
-
- test "should get create" do
- get :create
- assert_response :success
- end
+ # test "should get search term found in params and redirect to recipes" do
+ # VCR.use_cassette("search_term") do
+ # get :index, params: {search_term: "chicken"}
+ # assert_response :success
+ # assert_redirected_to recipes_index_path
+ # end
+ # end
end
diff --git a/test/controllers/recipes_controller_test.rb b/test/controllers/recipes_controller_test.rb
index 841be6132..4eaf4270f 100644
--- a/test/controllers/recipes_controller_test.rb
+++ b/test/controllers/recipes_controller_test.rb
@@ -1,14 +1,20 @@
require 'test_helper'
class RecipesControllerTest < ActionController::TestCase
- test "should get index" do
- get :index
- assert_response :success
- end
-
- test "should get show" do
- get :show
- assert_response :success
- end
+ # test "should get search term found in params and show a list of recipes" do
+ # VCR.use_cassette("list_results") do
+ # get :index, params: {search_term: "chicken"}
+ # assert_response :success
+ # assert_template 'recipes/index'
+ # end
+ # end
+ #
+ # test "should get the uri associated with the selected recipe and show the recipe details" do
+ # VCR.use_cassette("recipe-details") do
+ # get :show, params: {uri: "c468dc28f8b64bb711125cc150b15c25"}
+ # assert_response :success
+ # assert_template 'recipes/show'
+ # end
+ # end
end
diff --git a/test/lib/edemam_api_wrapper.rb b/test/lib/edemam_api_wrapper.rb
new file mode 100644
index 000000000..cecb284dc
--- /dev/null
+++ b/test/lib/edemam_api_wrapper.rb
@@ -0,0 +1,58 @@
+require 'test_helper'
+require 'edemam_api_wrapper'
+require 'recipe'
+
+class EdemamApiTest < ActionController::TestCase
+ test "the truth" do
+ assert true
+ end
+
+ test "can retrieve a list of recipes" do
+ VCR.use_cassette("recipes") do # if there isn't a cassestte called channels it will create one and name it so
+ recipes = EdemamApiWrapper.request_recipes("chicken")
+
+ assert recipes.is_a? Array
+ assert recipes.length > 0 # the array will not be empty
+ recipes.each do |rec|
+ assert rec.is_a? Recipe # every element is an instance of the Recipe class
+ end
+ end
+ end
+ #
+ # test "can retrieve a single recipe and its attributes" do
+ # VCR.use_cassette("single_recipe") do
+ #
+ # recipes = EdemamApiWrapper.get_a_recipe(c468dc28f8b64bb711125cc150b15c25)
+ #
+ # assert recipe.is_a? Recipe # every element is an instance of the Recipe class
+ # assert_equal recipe.label "Grilled Deviled Chickens Under a Brick"
+ # assert_equal recipe.image "https://www.edamam.com/web-img/5f5/5f51c89f832d50da84e3c05bef3f66f9.jpg"
+ # assert_equal recipe.url "http://www.marthastewart.com/recipe/grilled-deviled-chickens-under-a-brick"
+ #
+ # end
+ # end
+ #
+ #
+ # test "can't send an invalid search request " do
+ # VCR.use_cassette("bad-search") do
+ # response = EdemamApiWrapper.list_recipes("")
+ # assert response["ok"] == false
+ # assert response["error"] == "no_text"
+ #
+ # response = EdemamApiWrapper.list_recipes(nil)
+ # assert response["ok"] == false
+ # assert response["error"] == "no_text"
+ #
+ # response = EdemamApiWrapper.list_recipes("1234")
+ # assert response["ok"] == false
+ # assert response["error"] == "no_text"
+ #
+ # response = EdemamApiWrapper.list_recipes("#$%&@")
+ # assert response["ok"] == false
+ # assert response["error"] == "no_text"
+ #
+ # end
+ # end
+
+
+end
diff --git a/test/lib/recipe.rb b/test/lib/recipe.rb
new file mode 100644
index 000000000..a2c9fe952
--- /dev/null
+++ b/test/lib/recipe.rb
@@ -0,0 +1,16 @@
+require 'test_helper'
+require 'edemam_api_wrapper'
+require 'recipe'
+
+class RecipeTest < ActionController::TestCase
+ # test "can't create a recipe with an invalid uri " do
+ # VCR.use_cassette("bad-uri") do
+ # recipe = Recipe.new("")
+ # assert response == "Bad array"
+ #
+ # recipe = Recipe.new(nil)
+ # assert response == "Bad array"
+ # end
+ # end
+
+end
diff --git a/test/test_helper.rb b/test/test_helper.rb
index 92e39b2d7..12b3143df 100644
--- a/test/test_helper.rb
+++ b/test/test_helper.rb
@@ -1,10 +1,29 @@
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
+require 'vcr'
+require 'webmock/minitest'
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...
+ VCR.configure do |config|
+ config.cassette_library_dir = 'test/cassettes' # folder where casettes will be located
+ config.hook_into :webmock # tie into this other tool called webmock
+ config.default_cassette_options = {
+ :record => :new_episodes, # record new data when we don't have it yet
+ :match_requests_on => [:method, :uri, :body] # The http method, URI and body of a request all need to match
+ }
+ # Don't leave our Slack token lying around in a cassette file.
+
+ config.filter_sensitive_data("") do
+ ENV['TOKEN']
+ end
+ config.filter_sensitive_data("") do
+ ENV['APP_ID']
+ end
+ end
+
end
From a26833b77928e03fbfa6601734c74f92d5d5504e Mon Sep 17 00:00:00 2001
From: Brandi Phillips
Date: Sun, 6 Nov 2016 22:11:40 -0800
Subject: [PATCH 08/25] attribution present, styling begun
---
app/assets/images/Attribution.png | Bin 0 -> 5387 bytes
app/assets/images/heart_food.jpg | Bin 0 -> 88294 bytes
app/assets/stylesheets/hompages.scss | 29 +++++++++++++++++++++++
app/views/homepages/index.html.erb | 33 ++++++++++++++++++++-------
4 files changed, 54 insertions(+), 8 deletions(-)
create mode 100644 app/assets/images/Attribution.png
create mode 100644 app/assets/images/heart_food.jpg
diff --git a/app/assets/images/Attribution.png b/app/assets/images/Attribution.png
new file mode 100644
index 0000000000000000000000000000000000000000..c4eb8eaac4703abccec8a1bb7c19564f1aff5332
GIT binary patch
literal 5387
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