daily_recipe 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: eee8d4005c4150285ce6ac8ab2ad8a2c1dc196ba
4
+ data.tar.gz: 724a4372c0b6e934a6efcc54c9136377ff86b7ee
5
+ SHA512:
6
+ metadata.gz: 336d0ee7ffda4abeb02117ea841d73ef80094029f01aa6b95a7720681087d733dbd76992a7027143161fdd00fcd6f2187e328c286e2769915ed5ab7574e5f6a0
7
+ data.tar.gz: 084831fcd5323bc21b27b0f0f8e2f61ed89daa3802ef02bf57012ae3ba2df6976793bfe00269f007e040864869854aa59bb482d47888173bfd89ae39be5726b7
@@ -0,0 +1,49 @@
1
+ # Contributor Code of Conduct
2
+
3
+ As contributors and maintainers of this project, and in the interest of
4
+ fostering an open and welcoming community, we pledge to respect all people who
5
+ contribute through reporting issues, posting feature requests, updating
6
+ documentation, submitting pull requests or patches, and other activities.
7
+
8
+ We are committed to making participation in this project a harassment-free
9
+ experience for everyone, regardless of level of experience, gender, gender
10
+ identity and expression, sexual orientation, disability, personal appearance,
11
+ body size, race, ethnicity, age, religion, or nationality.
12
+
13
+ Examples of unacceptable behavior by participants include:
14
+
15
+ * The use of sexualized language or imagery
16
+ * Personal attacks
17
+ * Trolling or insulting/derogatory comments
18
+ * Public or private harassment
19
+ * Publishing other's private information, such as physical or electronic
20
+ addresses, without explicit permission
21
+ * Other unethical or unprofessional conduct
22
+
23
+ Project maintainers have the right and responsibility to remove, edit, or
24
+ reject comments, commits, code, wiki edits, issues, and other contributions
25
+ that are not aligned to this Code of Conduct, or to ban temporarily or
26
+ permanently any contributor for other behaviors that they deem inappropriate,
27
+ threatening, offensive, or harmful.
28
+
29
+ By adopting this Code of Conduct, project maintainers commit themselves to
30
+ fairly and consistently applying these principles to every aspect of managing
31
+ this project. Project maintainers who do not follow or enforce the Code of
32
+ Conduct may be permanently removed from the project team.
33
+
34
+ This code of conduct applies both within project spaces and in public spaces
35
+ when an individual is representing the project or its community.
36
+
37
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
38
+ reported by contacting a project maintainer at iandevivi@gmail.com. All
39
+ complaints will be reviewed and investigated and will result in a response that
40
+ is deemed necessary and appropriate to the circumstances. Maintainers are
41
+ obligated to maintain confidentiality with regard to the reporter of an
42
+ incident.
43
+
44
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
45
+ version 1.3.0, available at
46
+ [http://contributor-covenant.org/version/1/3/0/][version]
47
+
48
+ [homepage]: http://contributor-covenant.org
49
+ [version]: http://contributor-covenant.org/version/1/3/0/
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in daily_recipe.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,36 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ daily_recipe (0.1.0)
5
+ nokogiri
6
+ terminal-table
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ coderay (1.1.0)
12
+ method_source (0.8.2)
13
+ mini_portile2 (2.1.0)
14
+ nokogiri (1.6.8)
15
+ mini_portile2 (~> 2.1.0)
16
+ pkg-config (~> 1.1.7)
17
+ pkg-config (1.1.7)
18
+ pry (0.10.3)
19
+ coderay (~> 1.1.0)
20
+ method_source (~> 0.8.1)
21
+ slop (~> 3.4)
22
+ rake (10.4.2)
23
+ slop (3.6.0)
24
+ terminal-table (1.6.0)
25
+
26
+ PLATFORMS
27
+ ruby
28
+
29
+ DEPENDENCIES
30
+ bundler (~> 1.12)
31
+ daily_recipe!
32
+ pry
33
+ rake (~> 10.0)
34
+
35
+ BUNDLED WITH
36
+ 1.12.5
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 iandevivi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/NOTES ADDED
@@ -0,0 +1,39 @@
1
+ How to Build a CLI Gem
2
+
3
+ 1. Plan your gem, imagine the interface
4
+ 2. Start with the project structure - use google
5
+ 3. Start with the entry point - the file the user will run
6
+ 4. Force that to build the CLI interface
7
+ 5. Stub out the interface
8
+ 6. Start making things real
9
+ 7. Discover objects
10
+ 8. Program
11
+
12
+ - A command line interface for daily recipes
13
+ - from http://www.foodnetwork.com/recipes/photos/recipe-of-the-day-what-to-cook-now.html
14
+ #body > div:nth-child(13) > div.row.split > article > div >
15
+ #div.list-featured-in-gallery.section > section > div > ul > li:nth-child(1)
16
+
17
+
18
+ user types daily_recipes
19
+
20
+ Shows a list of recipes
21
+
22
+ 1. Herb Chicken - 1 hour 30 minutes cook time - 4.5/5 stars - 16 reviews
23
+ 2. Guacamole - 5 stars - 783 reviews
24
+
25
+ User picks a recipe by number
26
+ provides list of ingredients
27
+ provides cooking instructions
28
+
29
+ copy ingredients/recipe to clipboard? #copy method using pbcopy
30
+
31
+
32
+ What is a recipe?
33
+
34
+ A recipe has a name
35
+ A recipe has a cook time
36
+ A recipe has a rating
37
+ A recipe has a number of reviews
38
+ A recipe has ingredients
39
+ A recipe has cooking instructions
data/README.md ADDED
@@ -0,0 +1,39 @@
1
+ # DailyRecipe
2
+ daily_recipe is a gem that will pull a changing recipe list, provide the user with the name, cook time and average rating of the recipe. Selecting a recipe will give the user the ingredient list and the cooking directions.
3
+
4
+ ## Installation
5
+
6
+ Add this line to your application's Gemfile:
7
+
8
+ ```ruby
9
+ gem 'daily_recipe'
10
+ ```
11
+
12
+ And then execute:
13
+
14
+ $ bundle
15
+
16
+ Or install it yourself as:
17
+
18
+ $ gem install daily_recipe
19
+
20
+ ## Usage
21
+
22
+ To use this gem, install using 'gem install daily_recipe'.
23
+ To run, simply type 'daily_recipe' once the gem has been installed.
24
+ A list of recipes will be loaded. Select an option to get ingredients and further instructions.
25
+
26
+ ## Development
27
+
28
+ After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
29
+
30
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
31
+
32
+ ## Contributing
33
+
34
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/daily_recipe. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
35
+
36
+
37
+ ## License
38
+
39
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "daily_recipe"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/daily_recipe ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require './lib/daily_recipe'
4
+
5
+ DailyRecipe::CLI.new.call
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,37 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'daily_recipe/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "daily_recipe"
8
+ spec.version = DailyRecipe::VERSION
9
+ spec.authors = ["Ian DeVivi"]
10
+ spec.email = ["iandevivi@gmail.com"]
11
+
12
+ spec.summary = "Daily Recipes List"
13
+ spec.description = "List of recipes with ratings and cooking time, along with ingredient list and cooking instructions."
14
+ spec.homepage = "https://github.com/iandevivi/daily-recipe-cli-gem"
15
+ spec.license = "MIT"
16
+
17
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
19
+ # if spec.respond_to?(:metadata)
20
+ # spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
21
+ # else
22
+ # raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
23
+ # end
24
+
25
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
26
+ spec.bindir = "bin"
27
+ spec.executables = ["daily_recipe"]
28
+ spec.require_paths = ["lib"]
29
+
30
+ spec.add_development_dependency "bundler", "~> 1.12"
31
+ spec.add_development_dependency "rake", "~> 10.0"
32
+
33
+ spec.add_development_dependency "pry"
34
+
35
+ spec.add_dependency "nokogiri"
36
+ spec.add_dependency "terminal-table"
37
+ end
@@ -0,0 +1,62 @@
1
+ require 'json'
2
+ class DailyRecipe::Recipe
3
+
4
+ attr_accessor :name, :cook_time, :rating, :api_id, :url
5
+ BASE_URL = "http://www.foodnetwork.com"
6
+ def self.today
7
+ self.scrape_food_network
8
+ end
9
+
10
+
11
+ # def self.scrape_recipes
12
+ # self.scrape_food_network
13
+ # end
14
+
15
+ def self.scrape_food_network
16
+ recipes = []
17
+ doc = Nokogiri::HTML(open("http://www.foodnetwork.com/recipes/photos/recipe-of-the-day-what-to-cook-now.html"))
18
+ doc.search(".feed li").each do |x|
19
+ #binding.pry
20
+ recipe = self.new
21
+ recipe.name = x.search("h6 a").text
22
+ recipe.cook_time = x.search("dd").text
23
+ recipe.api_id = (x.css("a.community-rating-stars").attribute("data-rating").value).scan(/\w+\-.+\w+/).join("-")
24
+ recipe.url = BASE_URL + x.search(".community-rating-stars").attribute("href").value
25
+ recipe.rating = get_rating(recipe.api_id)
26
+ recipes << recipe
27
+ end
28
+ recipes
29
+ end
30
+
31
+ def self.get_rating(api_id) #@beingy is the man
32
+ gigya_api_url = "http://comments.us1.gigya.com/comments.getStreamInfo?categoryID=recipe&streamID=API_ID&includeRatingDetails=true&APIKey=3_ClDcX23A7tU8pcydnKyENXSYP5kxCbwH4ZO741ZOujPRY8Ksj2UBnj8Zopb0OX0K&sdk=js_6.3.02&format=jsonp&callback=gigya._.apiAdapters.web.callback"
33
+ api_id_url = gigya_api_url.gsub("API_ID", api_id)
34
+ recipe_json = Nokogiri::HTML(open(api_id_url))
35
+ part1 = recipe_json.text.gsub("gigya._.apiAdapters.web.callback(","")
36
+ part2 = part1.gsub("});","}")
37
+ parsed = JSON.parse(part2, symbolize_names: true)
38
+ #binding.pry
39
+ rating = parsed[:streamInfo][:avgRatings][:_overall]
40
+ rating
41
+ end
42
+
43
+ def self.scrape_full_recipe(the_recipe)
44
+
45
+ doc = Nokogiri::HTML(open(the_recipe.url))
46
+ ingredients = doc.search("div.ingredients li")
47
+ puts ""
48
+ puts "Ingredients"
49
+ ingredients.each do |ingredient|
50
+ puts ingredient.text
51
+ end
52
+
53
+ cooking_instructions = doc.search("div.directions li")
54
+ cooking_instructions.each do |instruction|
55
+ puts ""
56
+ puts instruction.text
57
+ end
58
+ end
59
+
60
+
61
+
62
+ end
@@ -0,0 +1,48 @@
1
+ #our CLI controller
2
+
3
+ class DailyRecipe::CLI
4
+
5
+ def call
6
+ puts "Here are today's Daily Recipes"
7
+ list_recipes
8
+ menu
9
+ end
10
+
11
+ def list_recipes
12
+ #will get recipes
13
+ @recipes = DailyRecipe::Recipe.today
14
+ puts " Recipe name Rating Cooking Time"
15
+ @recipes.each.with_index(1) do |recipe, i| #There is a Recipe class with a #today method for today's recipes
16
+
17
+ puts "#{i}. #{recipe.name} - #{recipe.rating} - #{recipe.cook_time}"
18
+ end
19
+ end
20
+
21
+ def menu
22
+
23
+ input = nil
24
+ while input != "exit"
25
+ puts "Enter the number of the recipe you would like to explore."
26
+ puts "Enter list to see the full list of recipes."
27
+ puts "Type exit to exit"
28
+ input = gets.strip.downcase
29
+
30
+ if input.to_i > 0 and input.to_i <= @recipes.count
31
+ the_recipe = @recipes[input.to_i-1]
32
+ puts "#{the_recipe.name} - #{the_recipe.rating} - #{the_recipe.cook_time}"
33
+ DailyRecipe::Recipe.scrape_full_recipe(the_recipe)
34
+ elsif input == "list"
35
+ list_recipes
36
+ elsif input == "exit"
37
+ goodbye
38
+ else
39
+ puts "Not sure what you are asking for, type list or exit."
40
+ end
41
+
42
+ end
43
+ end
44
+
45
+ def goodbye
46
+ puts "Please join us tomorrow for more amazing recipes!"
47
+ end
48
+ end
@@ -0,0 +1,3 @@
1
+ module DailyRecipe
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,10 @@
1
+ #environment
2
+ require 'open-uri'
3
+ require 'nokogiri' # add dependency to gemspec
4
+ require 'pry'
5
+ require 'terminal-table'
6
+
7
+
8
+ require_relative "daily_recipe/version"
9
+ require_relative './daily_recipe/cli'
10
+ require_relative './daily_recipe/recipe'
metadata ADDED
@@ -0,0 +1,132 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: daily_recipe
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ian DeVivi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-06-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.12'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.12'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: nokogiri
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: terminal-table
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: List of recipes with ratings and cooking time, along with ingredient
84
+ list and cooking instructions.
85
+ email:
86
+ - iandevivi@gmail.com
87
+ executables:
88
+ - daily_recipe
89
+ extensions: []
90
+ extra_rdoc_files: []
91
+ files:
92
+ - CODE_OF_CONDUCT.md
93
+ - Gemfile
94
+ - Gemfile.lock
95
+ - LICENSE.txt
96
+ - NOTES
97
+ - README.md
98
+ - Rakefile
99
+ - bin/console
100
+ - bin/daily_recipe
101
+ - bin/setup
102
+ - daily_recipe.gemspec
103
+ - lib/daily_recipe.rb
104
+ - lib/daily_recipe/Recipe.rb
105
+ - lib/daily_recipe/cli.rb
106
+ - lib/daily_recipe/version.rb
107
+ homepage: https://github.com/iandevivi/daily-recipe-cli-gem
108
+ licenses:
109
+ - MIT
110
+ metadata: {}
111
+ post_install_message:
112
+ rdoc_options: []
113
+ require_paths:
114
+ - lib
115
+ required_ruby_version: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ required_rubygems_version: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ requirements: []
126
+ rubyforge_project:
127
+ rubygems_version: 2.4.5.1
128
+ signing_key:
129
+ specification_version: 4
130
+ summary: Daily Recipes List
131
+ test_files: []
132
+ has_rdoc: