food_info 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/HISTORY.markdown ADDED
@@ -0,0 +1,8 @@
1
+ # Changelog
2
+
3
+ ## 0.0.2 September 11, 2011
4
+ * Added propagation of errors from data source
5
+ * API improvement: No need to call <tt>results</tt> on FoodItem.search to access search results
6
+
7
+ ## 0.0.1 September 10, 2011
8
+ * Initial release. FatSecret adapter supports both <tt>search</tt> and <tt>details</tt> methods.
data/README.markdown CHANGED
@@ -49,16 +49,28 @@ Now we can search for foods.
49
49
 
50
50
  (As an aside, I get that pretty, nicely-lined-up console formatting from the remarkably awesome [AwesomePrint Gem](https://github.com/michaeldv/awesome_print)).
51
51
 
52
- Also, note that search supports pagination via the <tt>page</tt> and <tt>per_page</tt> (max 50) parameters:
52
+ #### Pagination
53
+
54
+ Search supports pagination via the <tt>page</tt> and <tt>per_page</tt> (max 50) parameters:
53
55
 
54
56
  FoodInfo.search('cheese', :page => 2, :per_page => 50)
55
57
 
58
+ #### Access to search results
59
+
60
+ You can access the results of the search explicitly:
61
+
62
+ FoodInfo.search('cheese').results # => ... lots of results ...
63
+
64
+ But the SearchResults class includes Enumerable, so you can also just call enumerable methods on it directly:
65
+
66
+ FoodInfo.search('cheese').map(&:name) # => array of names of matching foods
67
+
56
68
 
57
69
  ### Nutritional Details
58
70
 
59
71
  Once you have a specific food item in mind from the search results, you can retrieve a whole lot of additional information.
60
72
 
61
- cheddar = FoodInfo.search('cheese').results.first
73
+ cheddar = FoodInfo.search('cheese').first
62
74
  info = FoodInfo.details( cheddar.id ) # => ... a whole lotta data ...
63
75
 
64
76
  General metadata about the cheese includes id, name, kind, and url, which are identical to what you'd get from the <tt>search</tt> method. It also has one or more servings, however, and this is where we finally get our nutrition info.
data/TODO.txt CHANGED
@@ -1,4 +1,2 @@
1
- * Error handling (currently returns empty results for invalid key)
2
- * Better search API (search('cheese'), not search('cheese').results)
3
- * Add DB caching
1
+ * Add DB caching (or is that better left to the client, who can control the caching layer completely?)
4
2
  * It'd be great to have a connection pool, so we could process multiple requests concurrently. I've added a skeleton for it, but actually using it would require a non-blocking HTTP library in HTTParty.
@@ -4,6 +4,8 @@ module FoodInfo
4
4
  module Data
5
5
 
6
6
  class SearchResults < Hashie::Trash
7
+ include Enumerable
8
+
7
9
  property :results, :from => :food
8
10
  property :page, :from => :page_number
9
11
  property :per_page, :from => :max_results
@@ -23,6 +25,12 @@ module FoodInfo
23
25
  self[:results] = [self[:results]] unless self[:results].is_a?(Array)
24
26
  self[:results] = (self[:results] || []).collect {|result| SearchResult.new(result) }
25
27
  end
28
+
29
+ # Allow direct enumerable access to search results without calling search('cheese').results.each
30
+ def each(&block)
31
+ self[:results].each{|result| block.call(result)}
32
+ end
33
+
26
34
  end
27
35
 
28
36
  end
@@ -37,7 +37,10 @@ module FoodInfo
37
37
 
38
38
  def query(method, opts = {})
39
39
  query_url = Request.new(method, {:key => @key, :secret => @secret}, opts).signed_request
40
- self.class.get( query_url )
40
+ data = self.class.get( query_url )
41
+ raise DataSourceException.new(data['error']['message']) if data['error']
42
+
43
+ return data
41
44
  end
42
45
 
43
46
  end
@@ -2,4 +2,5 @@ module FoodInfo
2
2
  class NoAdapterSpecified < StandardError; end
3
3
  class UnsupportedAdapter < StandardError; end
4
4
  class AuthorizationError < StandardError; end
5
+ class DataSourceException < StandardError; end
5
6
  end
@@ -1,3 +1,3 @@
1
1
  module FoodInfo
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/food_info.rb CHANGED
@@ -50,8 +50,8 @@ end
50
50
  __END__
51
51
 
52
52
  FoodInfo.establish_connection(:fat_secret, :key => ENV['KEY'], :secret => ENV['SECRET'])
53
+ a=FoodInfo.search('cheese', :page => 1, :per_page => 1).results.first
53
54
  a=FoodInfo.search('cheese')
54
- a=FoodInfo.search('cheese', :page => 1, :per_page => 1)
55
55
 
56
56
  FoodInfo.establish_connection(:fat_secret, :key => ENV['KEY'], :secret => ENV['SECRET'])
57
57
  a=FoodInfo.details("33689")
metadata CHANGED
@@ -1,66 +1,50 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: food_info
3
- version: !ruby/object:Gem::Version
4
- hash: 29
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 0
9
- - 1
10
- version: 0.0.1
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Kali Donovan
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-09-10 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2011-09-11 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: httparty
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &2156585880 !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- hash: 13
29
- segments:
30
- - 0
31
- - 7
32
- - 7
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
33
21
  version: 0.7.7
34
22
  type: :runtime
35
- version_requirements: *id001
36
- - !ruby/object:Gem::Dependency
37
- name: hashie
38
23
  prerelease: false
39
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *2156585880
25
+ - !ruby/object:Gem::Dependency
26
+ name: hashie
27
+ requirement: &2156585140 !ruby/object:Gem::Requirement
40
28
  none: false
41
- requirements:
42
- - - ">="
43
- - !ruby/object:Gem::Version
44
- hash: 19
45
- segments:
46
- - 1
47
- - 1
48
- - 0
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
49
32
  version: 1.1.0
50
33
  type: :runtime
51
- version_requirements: *id002
52
- description: Generic Ruby interface to look up nutritional information on food. Design is modular so other adapters can be plugged in, but only data source currently implemented is FatSecret.
53
- email:
34
+ prerelease: false
35
+ version_requirements: *2156585140
36
+ description: Generic Ruby interface to look up nutritional information on food. Design
37
+ is modular so other adapters can be plugged in, but only data source currently implemented
38
+ is FatSecret.
39
+ email:
54
40
  - kali@deviantech.com
55
41
  executables: []
56
-
57
42
  extensions: []
58
-
59
43
  extra_rdoc_files: []
60
-
61
- files:
44
+ files:
62
45
  - .gitignore
63
46
  - Gemfile
47
+ - HISTORY.markdown
64
48
  - LICENSE
65
49
  - README.markdown
66
50
  - Rakefile
@@ -79,36 +63,26 @@ files:
79
63
  - lib/food_info/version.rb
80
64
  homepage: https://github.com/deviantech/food_info
81
65
  licenses: []
82
-
83
66
  post_install_message:
84
67
  rdoc_options: []
85
-
86
- require_paths:
68
+ require_paths:
87
69
  - lib
88
- required_ruby_version: !ruby/object:Gem::Requirement
70
+ required_ruby_version: !ruby/object:Gem::Requirement
89
71
  none: false
90
- requirements:
91
- - - ">="
92
- - !ruby/object:Gem::Version
93
- hash: 3
94
- segments:
95
- - 0
96
- version: "0"
97
- required_rubygems_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
98
77
  none: false
99
- requirements:
100
- - - ">="
101
- - !ruby/object:Gem::Version
102
- hash: 3
103
- segments:
104
- - 0
105
- version: "0"
78
+ requirements:
79
+ - - ! '>='
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
106
82
  requirements: []
107
-
108
83
  rubyforge_project:
109
84
  rubygems_version: 1.8.10
110
85
  signing_key:
111
86
  specification_version: 3
112
87
  summary: API for researching nutritional information of various foods
113
88
  test_files: []
114
-