usda_fdc 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4796ad6e9de7996f19018c9e89c90386b74313d6ea5661877060aa1a71d4db8b
4
- data.tar.gz: cbebe212275b3834bf07731efca382a5e9a67b21e7878905f1ff787d125d3aa1
3
+ metadata.gz: 3259d937f8cab77f84475be7d9cc4871efed34326604ceeb0aa2fb6f3e217546
4
+ data.tar.gz: 88c52fdab8c2bd8fc4d6492fdc81d594dd477d63c49cac8c77b216a35bd21926
5
5
  SHA512:
6
- metadata.gz: d14e949edd29832fc9a02d5ed4884b0b9c11e3b8ede97a9eb8ea1f27fe3b0f141cfb1e5a504f1256a828c472415f9cd9dbaa773ba302e6237897d45493d76d12
7
- data.tar.gz: 5993a9ef8cdb28c88ec35390970880c08416e897ec93ae955d019381f1aa02ffc679690754c2ae28ca5d05938cc4d98aaacda51b864a0d4e2391b6296ee8d677
6
+ metadata.gz: b9804c6de9e90e962dafb4cc9184165c85f6f1b9bbf20a8e6551ab45b817319c87266b82b85cc12988bd2d714ba9db192127739d559ab6eb49d968e4cbcb61d6
7
+ data.tar.gz: 97dcb6d90428858f511c413e59faab3faa14e056377cab0da0ebb96427371d93132507b24b6220c17aba592ac82059ace8d053a648dc7a177cf770b49786c4e3
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.2.0] - 2022-07-15
4
+
5
+ - Allow request methods to accept block to manage request
6
+ - Improve response handling (e.g. raise on 4xx/5xx responses)
7
+
3
8
  ## [0.1.1] - 2022-06-24
4
9
 
5
10
  - Ensure `json` module is available to Client
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # UsdaFdc
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/usda_fdc.svg)](https://badge.fury.io/rb/usda_fdc)
4
+
3
5
  A Ruby interface to the USDA [FoodData Central](https://fdc.nal.usda.gov) API.
4
6
 
5
7
  ## Installation
@@ -27,6 +29,14 @@ client.food(534358)
27
29
  #=> { "dataType" => "Branded", "description" => "NUT 'N BERRY MIX", "fdcId" => 534358, ... }
28
30
  ```
29
31
 
32
+ You can also configure the default API key globally for all `UsdaFdc::Client` instances:
33
+
34
+ ```ruby
35
+ UsdaFdc.configure do |config|
36
+ config.api_key = 'your_api_key'
37
+ end
38
+ ```
39
+
30
40
  For more information on interacting with the API, including accepted parameters and response formats, check out the official USDA FDC [API guide](https://fdc.nal.usda.gov/api-guide.html).
31
41
 
32
42
  ## Development
@@ -2,29 +2,31 @@
2
2
 
3
3
  require 'net/http'
4
4
  require 'json'
5
+ require_relative 'helpers/errors'
5
6
 
6
7
  module UsdaFdc
7
8
  class Client
8
9
  API_URL = 'https://api.nal.usda.gov'
9
10
 
10
- def initialize(api_key)
11
+ def initialize(api_key = nil)
11
12
  @api_key = api_key || UsdaFdc.api_key
13
+ raise UsdaFdc::ArgumentError, 'An API key is required.' if @api_key.nil?
12
14
  end
13
15
 
14
- def food(fdc_id, params = {})
15
- get("/fdc/v1/food/#{fdc_id}", params)
16
+ def food(fdc_id, params = {}, &block)
17
+ get("/fdc/v1/food/#{fdc_id}", params, &block)
16
18
  end
17
19
 
18
- def foods(body)
19
- post('/fdc/v1/foods', body)
20
+ def foods(body = {}, &block)
21
+ post('/fdc/v1/foods', body, &block)
20
22
  end
21
23
 
22
- def foods_list(body)
23
- post('/fdc/v1/foods/list', body)
24
+ def foods_list(body = {}, &block)
25
+ post('/fdc/v1/foods/list', body, &block)
24
26
  end
25
27
 
26
- def foods_search(body)
27
- post('/fdc/v1/foods/search', body)
28
+ def foods_search(body = {}, &block)
29
+ post('/fdc/v1/foods/search', body, &block)
28
30
  end
29
31
 
30
32
  def get(path, params = {})
@@ -32,29 +34,52 @@ module UsdaFdc
32
34
  uri.query = URI.encode_www_form(params) if params.any?
33
35
 
34
36
  request = Net::HTTP::Get.new(uri)
35
- request['X-Api-Key'] = @api_key
36
- request['Content-Type'] = 'application/json'
37
+ set_default_headers_for(request)
38
+
39
+ yield(request) if block_given?
37
40
 
38
41
  response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
39
42
  http.request(request)
40
43
  end
41
44
 
42
- JSON.parse(response.body)
45
+ handle_response(response)
43
46
  end
44
47
 
45
48
  def post(path, body = {})
46
49
  uri = URI("#{API_URL}#{path}")
47
50
 
48
51
  request = Net::HTTP::Post.new(uri)
49
- request['X-Api-Key'] = @api_key
50
- request['Content-Type'] = 'application/json'
52
+ set_default_headers_for(request)
51
53
  request.body = body.to_json
52
54
 
55
+ yield(request) if block_given?
56
+
53
57
  response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
54
58
  http.request(request)
55
59
  end
56
60
 
57
- JSON.parse(response.body)
61
+ handle_response(response)
62
+ end
63
+
64
+ private
65
+
66
+ def set_default_headers_for(request)
67
+ request['X-Api-Key'] = @api_key
68
+ request['Content-Type'] = 'application/json'
69
+ request['User-Agent'] = "usda_fdc gem (v#{UsdaFdc::VERSION})"
70
+ end
71
+
72
+ def handle_response(response)
73
+ case response
74
+ when Net::HTTPSuccess
75
+ JSON.parse(response.body)
76
+ when Net::HTTPClientError
77
+ raise UsdaFdc::ClientError.new(response.message, response.code)
78
+ when Net::HTTPServerError
79
+ raise UsdaFdc::ServerError.new(response.message, response.code)
80
+ else
81
+ response
82
+ end
58
83
  end
59
84
  end
60
85
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module UsdaFdc
4
+ class ArgumentError < ::ArgumentError
5
+ end
6
+
7
+ class ResponseError < StandardError
8
+ attr_reader :code
9
+
10
+ def initialize(message = '', code = nil)
11
+ @code = code
12
+ super(message)
13
+ end
14
+ end
15
+
16
+ # For 4xx responses
17
+ class ClientError < ResponseError
18
+ end
19
+
20
+ # For 5xx responses
21
+ class ServerError < ResponseError
22
+ end
23
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module UsdaFdc
4
- VERSION = '0.1.1'
4
+ VERSION = '0.2.0'
5
5
  end
data/usda_fdc.gemspec CHANGED
@@ -6,7 +6,6 @@ Gem::Specification.new do |spec|
6
6
  spec.name = 'usda_fdc'
7
7
  spec.version = UsdaFdc::VERSION
8
8
  spec.authors = ['Zoran Pesic']
9
- spec.email = ['zspesic@gmail.com']
10
9
 
11
10
  spec.summary = 'A Ruby interface to the USDA FoodData Central API.'
12
11
  spec.homepage = 'https://github.com/zokioki/usda_fdc'
metadata CHANGED
@@ -1,18 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: usda_fdc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zoran Pesic
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-06-24 00:00:00.000000000 Z
11
+ date: 2022-07-15 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
15
- - zspesic@gmail.com
16
15
  executables: []
17
16
  extensions: []
18
17
  extra_rdoc_files: []
@@ -27,6 +26,7 @@ files:
27
26
  - lib/usda_fdc/client.rb
28
27
  - lib/usda_fdc/configuration.rb
29
28
  - lib/usda_fdc/helpers/configurable.rb
29
+ - lib/usda_fdc/helpers/errors.rb
30
30
  - lib/usda_fdc/version.rb
31
31
  - sig/usda_fdc.rbs
32
32
  - usda_fdc.gemspec