brewery_db 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +2 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/CHANGELOG.md +15 -0
- data/README.md +81 -29
- data/Rakefile +5 -0
- data/brewery_db.gemspec +6 -5
- data/lib/brewery_db.rb +15 -19
- data/lib/brewery_db/client.rb +19 -7
- data/lib/brewery_db/collection.rb +42 -0
- data/lib/brewery_db/config.rb +7 -6
- data/lib/brewery_db/mash.rb +18 -0
- data/lib/brewery_db/middleware/error_handler.rb +28 -0
- data/lib/brewery_db/request.rb +27 -0
- data/lib/brewery_db/resource.rb +16 -22
- data/lib/brewery_db/resources/beers.rb +2 -2
- data/lib/brewery_db/resources/breweries.rb +2 -2
- data/lib/brewery_db/resources/brewery.rb +16 -0
- data/lib/brewery_db/resources/categories.rb +2 -2
- data/lib/brewery_db/resources/glassware.rb +2 -2
- data/lib/brewery_db/resources/search.rb +1 -1
- data/lib/brewery_db/resources/styles.rb +2 -2
- data/lib/brewery_db/response.rb +26 -12
- data/lib/brewery_db/version.rb +1 -1
- data/lib/brewery_db/web_hook.rb +32 -0
- data/spec/brewery_db/client_spec.rb +41 -30
- data/spec/brewery_db/config_spec.rb +25 -28
- data/spec/brewery_db/{response_spec.rb → mash_spec.rb} +1 -1
- data/spec/brewery_db/middleware/error_handler_spec.rb +49 -0
- data/spec/brewery_db/resource_spec.rb +35 -22
- data/spec/brewery_db/resources/beers_spec.rb +10 -82
- data/spec/brewery_db/resources/breweries_spec.rb +10 -54
- data/spec/brewery_db/resources/brewery_spec.rb +27 -0
- data/spec/brewery_db/resources/categories_spec.rb +10 -38
- data/spec/brewery_db/resources/glassware_spec.rb +10 -36
- data/spec/brewery_db/resources/search_spec.rb +19 -61
- data/spec/brewery_db/resources/styles_spec.rb +10 -72
- data/spec/brewery_db/web_hook_spec.rb +79 -0
- data/spec/fixtures/BreweryDB_Resource/_get/a_list_of_resources/can_be_enumerated.yml +515 -0
- data/spec/fixtures/BreweryDB_Resource/_get/a_not_found_request/raises_an_exception.yml +38 -0
- data/spec/fixtures/BreweryDB_Resource/_get/a_not_found_request/sets_the_exception_message_to_the_error_message_in_the_response.yml +38 -0
- data/spec/fixtures/BreweryDB_Resource/_get/an_OK_request/name/.yml +54 -0
- data/spec/fixtures/BreweryDB_Resources_Beers/_all/fetches_all_of_the_beers_at_once.yml +889 -0
- data/spec/fixtures/BreweryDB_Resources_Beers/_find/fetches_only_the_beer_asked_for.yml +61 -0
- data/spec/fixtures/BreweryDB_Resources_Breweries/_all/fetches_all_of_the_breweries_at_once.yml +430 -0
- data/spec/fixtures/BreweryDB_Resources_Breweries/_find/fetches_only_the_brewery_asked_for.yml +57 -0
- data/spec/fixtures/BreweryDB_Resources_Categories/_all/fetches_all_of_the_cagtegories_at_once.yml +49 -0
- data/spec/fixtures/BreweryDB_Resources_Categories/_find/fetches_only_the_category_asked_for.yml +39 -0
- data/spec/fixtures/BreweryDB_Resources_Glassware/_all/fetches_all_of_the_glassware_at_once.yml +45 -0
- data/spec/fixtures/BreweryDB_Resources_Glassware/_find/fetches_only_the_glassware_asked_for.yml +39 -0
- data/spec/fixtures/BreweryDB_Resources_Search/_all/fetches_all_of_the_search_results_at_once.yml +1132 -0
- data/spec/fixtures/BreweryDB_Resources_Styles/_all/fetches_all_of_the_styles_at_once.yml +1866 -0
- data/spec/fixtures/BreweryDB_Resources_Styles/_find/fetches_only_the_style_asked_for.yml +50 -0
- data/spec/spec_helper.rb +4 -4
- data/spec/support/shared/a_resource.rb +3 -9
- data/spec/support/vcr.rb +6 -1
- metadata +82 -42
- data/spec/brewery_db_spec.rb +0 -18
- data/spec/fixtures/beers.yml +0 -445
- data/spec/fixtures/breweries.yml +0 -409
- data/spec/fixtures/categories.yml +0 -102
- data/spec/fixtures/glassware.yml +0 -65
- data/spec/fixtures/search.yml +0 -314
- data/spec/fixtures/styles.yml +0 -317
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MjQzMTM3ZWNlM2JhODRkM2FkMDU2MDAzOWVkNzUwOGFkOWU1OTY5OA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZGM5NmZmMmE1MDcyYWUyMjFkODZkMmFlYjNiNjI5NTM0Y2JkMGUyZA==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
OGIxYmNhNjNlMWZiNGZhYzE0MzdjYjM4MzQ5YmYzMTUwNDRiOWM2YzczNDdl
|
10
|
+
ZDRkZjQzNmNjOThjNGY5YzkzZmNmMzRjYzViMTAzZWJiNWY1Yzk3ZDA2M2Ey
|
11
|
+
OTQwNjkyNTkzMjE0YTY3MzE1ZjA3OWZhYjRiYjlmMDg3NGQzZDY=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NjBiYjUxZGRmNTdmMjEyYTNjY2U0ZmMzYjQ5YTUxNjEyMThiNDAwNTBhMjY4
|
14
|
+
YjQzOGJhZWJlMmM4YWY4NzdiZDE4ZmI5ZGMxMWJlM2ZmZjY4OTAzMWFmMTdj
|
15
|
+
MzI2NGY4ZTNjYTYwMDcyZGJjYTljYmQ3NGU2NTA2MTNhMzJiYjg=
|
data/.gitignore
CHANGED
data/.rspec
CHANGED
data/.travis.yml
ADDED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
## BreweryDB 0.0.2 (Unreleased)
|
4
|
+
|
5
|
+
* Raise exceptions on unsuccessful responses
|
6
|
+
* Return the data directly on successful responses ([Steven Harman][stevenharman])
|
7
|
+
* Add support for `brewery/:id/beers` endpoint ([Steven Harman][stevenharman])
|
8
|
+
* Require `faraday_middleare` ~> 0.8 ([Steven Harman][stevenharman])
|
9
|
+
* Add support for handling webhook parameters ([Steven Harman][stevenharman])
|
10
|
+
|
11
|
+
## BreweryDB 0.0.1
|
12
|
+
|
13
|
+
* Initial release
|
14
|
+
|
15
|
+
[stevenharman]: http://github.com/stevenharman
|
data/README.md
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
# BreweryDB
|
2
2
|
|
3
|
-
|
3
|
+
[![Build Status][travis]][travis-web]
|
4
|
+
|
5
|
+
[travis]: https://secure.travis-ci.org/tylerhunt/brewery_db.png
|
6
|
+
[travis-web]: http://travis-ci.org/tylerhunt/brewery_db
|
7
|
+
|
8
|
+
A Ruby library for using the [BreweryDB][] API.
|
4
9
|
|
5
10
|
[brewerydb]: http://www.brewerydb.com/
|
6
11
|
|
@@ -29,55 +34,94 @@ one, you may [request one here][api-key].
|
|
29
34
|
|
30
35
|
[api-key]: http://www.brewerydb.com/developers
|
31
36
|
|
32
|
-
|
37
|
+
You can use the following method to configure your API key:
|
33
38
|
|
34
39
|
``` ruby
|
35
|
-
BreweryDB.
|
40
|
+
brewery_db = BreweryDB::Client.new do |config|
|
36
41
|
config.api_key = API_KEY
|
37
42
|
end
|
38
43
|
```
|
39
44
|
|
40
|
-
|
41
|
-
|
42
|
-
|
45
|
+
|
46
|
+
## Usage
|
47
|
+
|
48
|
+
Once an API key has been set, resources can be called on the client instance.
|
43
49
|
|
44
50
|
``` ruby
|
45
|
-
brewery_db
|
51
|
+
brewery_db.beers.all(abv: '5.5')
|
52
|
+
brewery_db.beers.find('vYlBZQ')
|
46
53
|
|
47
|
-
brewery_db.
|
48
|
-
|
49
|
-
|
54
|
+
brewery_db.breweries.all(established: 2006)
|
55
|
+
brewery_db.breweries.find('d1zSa7')
|
56
|
+
|
57
|
+
brewery_db.brewery('d1zSa7').beers
|
58
|
+
|
59
|
+
brewery_db.categories.all
|
60
|
+
brewery_db.categories.find(1)
|
61
|
+
|
62
|
+
brewery_db.glassware.all
|
63
|
+
brewery_db.glassware.find(1)
|
64
|
+
|
65
|
+
brewery_db.search.all(q: 'IPA')
|
66
|
+
brewery_db.search.beers(q: 'IPA')
|
67
|
+
brewery_db.search.breweries(q: 'IPA')
|
68
|
+
brewery_db.search.guilds(q: 'IPA')
|
69
|
+
brewery_db.search.events(q: 'IPA')
|
70
|
+
|
71
|
+
brewery_db.styles.all
|
72
|
+
brewery_db.styles.find(1)
|
50
73
|
```
|
51
74
|
|
75
|
+
### WebHooks
|
52
76
|
|
53
|
-
|
77
|
+
The BreweryDB API also provides [WebHooks][webhooks] which can be use to:
|
54
78
|
|
55
|
-
|
56
|
-
|
79
|
+
> keep your local data stores in sync with the main BreweryDB API. Instead of
|
80
|
+
> having to constantly query the API, webhooks will send you a message when
|
81
|
+
> something changes.
|
57
82
|
|
58
|
-
|
59
|
-
|
60
|
-
|
83
|
+
This library provides a simple abstraction over the data posted by those
|
84
|
+
webhooks.
|
85
|
+
|
86
|
+
```ruby
|
87
|
+
webhook = BreweryDB::WebHook.new(webhook_params_hash)
|
88
|
+
```
|
89
|
+
|
90
|
+
#### Validating a WebHook
|
91
|
+
|
92
|
+
The `webhook_params_hash` should contain the `key`, `nonce`, `action`, etc.
|
93
|
+
sent as the payload of the webhook. A `BreweryDB::WebHook` object can validate
|
94
|
+
the posted data by SHA1 hashing your API key with the `nonce` value and
|
95
|
+
comparing it to the `key` value (as per the [docs][webhooks]).
|
96
|
+
|
97
|
+
```ruby
|
98
|
+
webhook.valid?(API_KEY) #=> true or false
|
99
|
+
```
|
61
100
|
|
62
|
-
|
63
|
-
BreweryDB.breweries.find('d1zSa7')
|
101
|
+
#### Idiomatic wrapper over WebHook parameters
|
64
102
|
|
65
|
-
BreweryDB
|
66
|
-
|
103
|
+
The `BreweryDB::WebHook` object also provides an idiomatic Ruby wrapper over
|
104
|
+
the parameters. For example, one of the parameters posted in a webhook is
|
105
|
+
`attributeId`, which is the BreweryDB id for a brewery, beer, etc. This
|
106
|
+
parameter is exposed by an instance of `BreweryDB::WebHook` via
|
67
107
|
|
68
|
-
|
69
|
-
|
108
|
+
```ruby
|
109
|
+
webhook.attribute_id #=> 'x6bRxw'
|
110
|
+
```
|
70
111
|
|
71
|
-
|
72
|
-
BreweryDB.search.beers(q: 'IPA')
|
73
|
-
BreweryDB.search.breweries(q: 'IPA')
|
74
|
-
BreweryDB.search.guilds(q: 'IPA')
|
75
|
-
BreweryDB.search.events(q: 'IPA')
|
112
|
+
The full list of parameters available are:
|
76
113
|
|
77
|
-
|
78
|
-
|
114
|
+
```ruby
|
115
|
+
webhook.action #=> 'insert'
|
116
|
+
webhook.attribute #=> 'beer'
|
117
|
+
webhook.attribute_id #=> 'x6bRxw'
|
118
|
+
webhook.key #=> 'some-long-key-value-here'
|
119
|
+
webhook.nonce #=> 'some-long-nonce-value-here'
|
120
|
+
webhook.sub_action #=> 'none'
|
121
|
+
webhook.timestamp #=> '1350573527'
|
79
122
|
```
|
80
123
|
|
124
|
+
[webhooks]: http://developer.pintlabs.com/brewerydb/webhooks/
|
81
125
|
|
82
126
|
## Contributing
|
83
127
|
|
@@ -88,6 +132,14 @@ BreweryDB.styles.find(1)
|
|
88
132
|
5. Create a new Pull Request.
|
89
133
|
|
90
134
|
|
135
|
+
## Contributors
|
136
|
+
|
137
|
+
Thanks to the following people who have contributed patches or helpful
|
138
|
+
suggestions:
|
139
|
+
|
140
|
+
* [Steven Harman](https://github.com/stevenharman)
|
141
|
+
|
142
|
+
|
91
143
|
## Copyright
|
92
144
|
|
93
145
|
Copyright © 2012 Tyler Hunt. See LICENSE for details.
|
data/Rakefile
CHANGED
data/brewery_db.gemspec
CHANGED
@@ -3,16 +3,17 @@ require './lib/brewery_db/version'
|
|
3
3
|
Gem::Specification.new do |gem|
|
4
4
|
gem.name = 'brewery_db'
|
5
5
|
gem.version = BreweryDB::VERSION
|
6
|
-
gem.summary = 'A Ruby library for
|
6
|
+
gem.summary = 'A Ruby library for using the BreweryDB API.'
|
7
7
|
gem.homepage = 'http://github.com/tylerhunt/brewery_db'
|
8
|
-
gem.
|
8
|
+
gem.authors = ['Tyler Hunt', 'Steven Harman']
|
9
9
|
|
10
10
|
gem.required_ruby_version = '>= 1.9'
|
11
11
|
|
12
12
|
gem.add_dependency 'faraday', '~> 0.8.0'
|
13
|
-
gem.add_dependency 'faraday_middleware'
|
14
|
-
gem.add_dependency 'hashie', '
|
15
|
-
gem.add_development_dependency '
|
13
|
+
gem.add_dependency 'faraday_middleware', '~> 0.8'
|
14
|
+
gem.add_dependency 'hashie', '>= 1.1', '< 3'
|
15
|
+
gem.add_development_dependency 'pry'
|
16
|
+
gem.add_development_dependency 'rspec', '~> 2.11'
|
16
17
|
gem.add_development_dependency 'vcr', '~> 2.0'
|
17
18
|
|
18
19
|
gem.files = `git ls-files`.split($\)
|
data/lib/brewery_db.rb
CHANGED
@@ -1,36 +1,32 @@
|
|
1
1
|
require 'brewery_db/version'
|
2
2
|
|
3
3
|
module BreweryDB
|
4
|
+
Error = Class.new(StandardError)
|
5
|
+
BadRequest = Class.new(Error)
|
6
|
+
NotFound = Class.new(Error)
|
7
|
+
RateLimitExceeded = Class.new(Error)
|
8
|
+
Unauthorized = Class.new(Error)
|
9
|
+
|
4
10
|
autoload :Client, 'brewery_db/client'
|
11
|
+
autoload :Collection, 'brewery_db/collection'
|
5
12
|
autoload :Config, 'brewery_db/config'
|
13
|
+
autoload :Mash, 'brewery_db/mash'
|
14
|
+
autoload :Request, 'brewery_db/request'
|
6
15
|
autoload :Resource, 'brewery_db/resource'
|
7
16
|
autoload :Response, 'brewery_db/response'
|
17
|
+
autoload :WebHook, 'brewery_db/web_hook'
|
18
|
+
|
19
|
+
module Middleware
|
20
|
+
autoload :ErrorHandler, 'brewery_db/middleware/error_handler'
|
21
|
+
end
|
8
22
|
|
9
23
|
module Resources
|
10
24
|
autoload :Beers, 'brewery_db/resources/beers'
|
11
25
|
autoload :Breweries, 'brewery_db/resources/breweries'
|
26
|
+
autoload :Brewery, 'brewery_db/resources/brewery'
|
12
27
|
autoload :Categories, 'brewery_db/resources/categories'
|
13
28
|
autoload :Glassware, 'brewery_db/resources/glassware'
|
14
29
|
autoload :Search, 'brewery_db/resources/search'
|
15
30
|
autoload :Styles, 'brewery_db/resources/styles'
|
16
31
|
end
|
17
|
-
|
18
|
-
extend self
|
19
|
-
|
20
|
-
def respond_to?(method, include_private=false)
|
21
|
-
super || client.respond_to?(method, include_private)
|
22
|
-
end
|
23
|
-
|
24
|
-
def method_missing(method, *args, &block)
|
25
|
-
if client.respond_to?(method)
|
26
|
-
client.send(method, *args, &block)
|
27
|
-
else
|
28
|
-
super
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def client
|
33
|
-
@client ||= Client.new
|
34
|
-
end
|
35
|
-
private :client
|
36
32
|
end
|
data/lib/brewery_db/client.rb
CHANGED
@@ -1,36 +1,48 @@
|
|
1
1
|
module BreweryDB
|
2
2
|
class Client
|
3
|
+
def initialize(&block)
|
4
|
+
configure(&block) if block_given?
|
5
|
+
end
|
6
|
+
|
3
7
|
def config
|
4
8
|
@config ||= Config.new
|
5
9
|
end
|
6
10
|
|
7
11
|
def configure
|
8
12
|
yield(config)
|
9
|
-
|
13
|
+
self
|
10
14
|
end
|
11
15
|
|
12
16
|
def beers
|
13
|
-
@beers ||= Resources::Beers.new(
|
17
|
+
@beers ||= Resources::Beers.new(config)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Builds a new instance of the brewery resource.
|
21
|
+
#
|
22
|
+
# @param id [String] the brewery ID
|
23
|
+
# @return <Resources::Breweries> an instance of the brewery resource
|
24
|
+
def brewery(id)
|
25
|
+
Resources::Brewery.new(config, id: id)
|
14
26
|
end
|
15
27
|
|
16
28
|
def breweries
|
17
|
-
@breweries ||= Resources::Breweries.new(
|
29
|
+
@breweries ||= Resources::Breweries.new(config)
|
18
30
|
end
|
19
31
|
|
20
32
|
def categories
|
21
|
-
@categories ||= Resources::Categories.new(
|
33
|
+
@categories ||= Resources::Categories.new(config)
|
22
34
|
end
|
23
35
|
|
24
36
|
def glassware
|
25
|
-
@glassware ||= Resources::Glassware.new(
|
37
|
+
@glassware ||= Resources::Glassware.new(config)
|
26
38
|
end
|
27
39
|
|
28
40
|
def search
|
29
|
-
@search ||= Resources::Search.new(
|
41
|
+
@search ||= Resources::Search.new(config)
|
30
42
|
end
|
31
43
|
|
32
44
|
def styles
|
33
|
-
@styles ||= Resources::Styles.new(
|
45
|
+
@styles ||= Resources::Styles.new(config)
|
34
46
|
end
|
35
47
|
end
|
36
48
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module BreweryDB
|
2
|
+
class Collection
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
BATCH_SIZE = 50
|
6
|
+
|
7
|
+
attr_reader :size
|
8
|
+
alias length size
|
9
|
+
|
10
|
+
def initialize(response)
|
11
|
+
self.response = response
|
12
|
+
end
|
13
|
+
|
14
|
+
def count(*args, &block)
|
15
|
+
# The Ruby documentation is wrong, and Enumerable#count no longer calls
|
16
|
+
# #size, so let's make sure it's used here when no arguments are given.
|
17
|
+
if args.empty? && !block_given?
|
18
|
+
size
|
19
|
+
else
|
20
|
+
super
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def each
|
25
|
+
return to_enum unless block_given?
|
26
|
+
|
27
|
+
while @collection.any?
|
28
|
+
@collection.each { |element| yield(element) }
|
29
|
+
break if @collection.size < BATCH_SIZE
|
30
|
+
self.response = @response.next_page
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def response=(response)
|
35
|
+
@response = response
|
36
|
+
@collection = Array(response.data) || []
|
37
|
+
@size = response.count || 0
|
38
|
+
@page_count = response.page_count
|
39
|
+
end
|
40
|
+
private :response=
|
41
|
+
end
|
42
|
+
end
|
data/lib/brewery_db/config.rb
CHANGED
@@ -2,19 +2,20 @@ require 'faraday'
|
|
2
2
|
|
3
3
|
module BreweryDB
|
4
4
|
class Config
|
5
|
-
|
6
|
-
ENDPOINT = 'http://api.brewerydb.com/v2'
|
7
|
-
MIDDLEWARE = []
|
5
|
+
BASE_URI = 'http://api.brewerydb.com/v2'
|
8
6
|
USER_AGENT = "BreweryDB Ruby Gem #{BreweryDB::VERSION}"
|
7
|
+
TIMEOUT = 60
|
9
8
|
|
10
9
|
attr_accessor :adapter
|
11
10
|
attr_accessor :api_key
|
12
|
-
attr_accessor :
|
11
|
+
attr_accessor :base_uri
|
12
|
+
attr_accessor :timeout
|
13
13
|
attr_accessor :user_agent
|
14
14
|
|
15
15
|
def initialize
|
16
|
-
self.adapter =
|
17
|
-
self.
|
16
|
+
self.adapter = Faraday.default_adapter
|
17
|
+
self.base_uri = BASE_URI
|
18
|
+
self.timeout = TIMEOUT
|
18
19
|
self.user_agent = USER_AGENT
|
19
20
|
end
|
20
21
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'hashie'
|
2
|
+
|
3
|
+
module BreweryDB
|
4
|
+
class Mash < Hashie::Mash
|
5
|
+
def convert_key(key)
|
6
|
+
key = key.to_s.dup
|
7
|
+
key.gsub!(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
8
|
+
key.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
|
9
|
+
key.tr('-', '_').downcase
|
10
|
+
end
|
11
|
+
protected :convert_key
|
12
|
+
|
13
|
+
def convert_value(value, duping=false)
|
14
|
+
value.is_a?(String) ? super.gsub("\r\n", "\n") : super
|
15
|
+
end
|
16
|
+
protected :convert_value
|
17
|
+
end
|
18
|
+
end
|