hungry 0.1.1 → 0.1.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.
- checksums.yaml +5 -5
- data/.travis.yml +0 -3
- data/Gemfile.lock +1 -1
- data/Rakefile +2 -2
- data/hungry.gemspec +3 -6
- data/lib/hungry.rb +12 -14
- data/lib/hungry/city.rb +2 -2
- data/lib/hungry/collection.rb +22 -22
- data/lib/hungry/country.rb +2 -2
- data/lib/hungry/geolocation.rb +15 -15
- data/lib/hungry/location.rb +9 -9
- data/lib/hungry/menu.rb +15 -15
- data/lib/hungry/menu/category.rb +4 -4
- data/lib/hungry/menu/dish.rb +4 -4
- data/lib/hungry/menu/option.rb +2 -2
- data/lib/hungry/region.rb +2 -2
- data/lib/hungry/resource.rb +49 -35
- data/lib/hungry/response.rb +6 -6
- data/lib/hungry/review.rb +7 -7
- data/lib/hungry/site.rb +13 -12
- data/lib/hungry/tag.rb +7 -7
- data/lib/hungry/user.rb +21 -21
- data/lib/hungry/util.rb +13 -13
- data/lib/hungry/venue.rb +22 -22
- data/lib/hungry/venue/collection.rb +9 -9
- data/lib/support/presence.rb +1 -1
- data/spec/hungry/geolocation_spec.rb +20 -20
- data/spec/hungry/util_spec.rb +9 -9
- metadata +3 -4
data/lib/hungry/menu/category.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
module Hungry
|
2
2
|
class Menu
|
3
3
|
class Category < Resource
|
4
|
-
|
4
|
+
|
5
5
|
attr_accessor :id, :name, :dishes, :menu
|
6
|
-
|
6
|
+
|
7
7
|
def dishes
|
8
8
|
@dishes ||= []
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
def dishes=(new_dishes)
|
12
12
|
@dishes = new_dishes.map do |attributes|
|
13
13
|
dish = Menu::Dish.new(attributes)
|
@@ -16,7 +16,7 @@ module Hungry
|
|
16
16
|
dish
|
17
17
|
end
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
data/lib/hungry/menu/dish.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
module Hungry
|
2
2
|
class Menu
|
3
3
|
class Dish < Resource
|
4
|
-
|
4
|
+
|
5
5
|
attr_accessor :name, :price, :description, :options, :photos, :category
|
6
|
-
|
6
|
+
|
7
7
|
def options
|
8
8
|
@options ||= []
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
def options=(new_options)
|
12
12
|
@options = new_options.map do |attributes|
|
13
13
|
option = Menu::Option.new(attributes)
|
@@ -16,7 +16,7 @@ module Hungry
|
|
16
16
|
option
|
17
17
|
end
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
data/lib/hungry/menu/option.rb
CHANGED
data/lib/hungry/region.rb
CHANGED
data/lib/hungry/resource.rb
CHANGED
@@ -3,23 +3,23 @@ require 'httparty' unless defined? HTTParty
|
|
3
3
|
module Hungry
|
4
4
|
class Resource
|
5
5
|
include HTTParty
|
6
|
-
|
6
|
+
|
7
7
|
attr_accessor :attributes, :resources, :data_source
|
8
|
-
|
8
|
+
|
9
9
|
### CLASS METHODS:
|
10
|
-
|
10
|
+
|
11
11
|
def self.get(*args)
|
12
12
|
self.base_uri Hungry.api_url
|
13
|
-
|
13
|
+
|
14
14
|
super
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def self.belongs_to(resource, klass = 'Resource')
|
18
18
|
define_method resource do
|
19
19
|
@belongs_to ||= {}
|
20
20
|
@belongs_to[resource] ||= begin
|
21
21
|
klass = Kernel.const_get(klass) if klass.is_a?(String)
|
22
|
-
|
22
|
+
|
23
23
|
if attributes[resource].present?
|
24
24
|
resource = klass.new attributes[resource]
|
25
25
|
resource.data_source = data_source
|
@@ -32,33 +32,47 @@ module Hungry
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
35
|
+
|
36
|
+
define_method "#{resource}=" do |object_or_attributes|
|
37
|
+
@belongs_to ||= {}
|
38
|
+
|
39
|
+
klass = Kernel.const_get(klass) if klass.is_a?(String)
|
40
|
+
|
41
|
+
if object_or_attributes.is_a?(klass)
|
42
|
+
@belongs_to[resource] = object_or_attributes
|
43
|
+
else
|
44
|
+
@belongs_to[resource] = klass.new object_or_attributes
|
45
|
+
end
|
46
|
+
|
47
|
+
@belongs_to[resource]
|
48
|
+
end
|
35
49
|
end
|
36
|
-
|
50
|
+
|
37
51
|
def self.has_many(resource, klass = 'Resource')
|
38
52
|
define_method resource do
|
39
53
|
@has_many ||= {}
|
40
54
|
@has_many[resource] ||= begin
|
41
55
|
klass = Kernel.const_get(klass) if klass.is_a?(String)
|
42
|
-
|
56
|
+
|
43
57
|
if url = resources[resource]
|
44
58
|
collection = klass.collection.from_url(url)
|
45
|
-
|
59
|
+
|
46
60
|
if attributes[resource].present?
|
47
61
|
collection.results = attributes[resource]
|
48
62
|
end
|
49
|
-
|
63
|
+
|
50
64
|
collection
|
51
65
|
end
|
52
66
|
end
|
53
67
|
end
|
54
68
|
end
|
55
|
-
|
69
|
+
|
56
70
|
def self.lazy_load(*attributes)
|
57
71
|
attributes.each do |attribute|
|
58
72
|
alias_method "#{attribute}_without_lazy_load".to_sym, attribute
|
59
73
|
define_method attribute do
|
60
74
|
result = send "#{attribute}_without_lazy_load".to_sym
|
61
|
-
|
75
|
+
|
62
76
|
if !result.present? && (canonical_data_source != data_source && canonical_data_source.present?)
|
63
77
|
reload
|
64
78
|
send "#{attribute}_without_lazy_load".to_sym
|
@@ -68,17 +82,17 @@ module Hungry
|
|
68
82
|
end
|
69
83
|
end
|
70
84
|
end
|
71
|
-
|
85
|
+
|
72
86
|
class << self
|
73
87
|
include Enumerable
|
74
|
-
|
88
|
+
|
75
89
|
attr_writer :endpoint
|
76
90
|
attr_writer :default_criteria
|
77
|
-
|
91
|
+
|
78
92
|
def endpoint
|
79
93
|
@endpoint || (superclass.respond_to?(:endpoint) ? superclass.endpoint : nil)
|
80
94
|
end
|
81
|
-
|
95
|
+
|
82
96
|
def default_criteria
|
83
97
|
if @default_criteria.respond_to?(:call)
|
84
98
|
@default_criteria.call
|
@@ -86,19 +100,19 @@ module Hungry
|
|
86
100
|
@default_criteria || {}
|
87
101
|
end
|
88
102
|
end
|
89
|
-
|
103
|
+
|
90
104
|
def collection
|
91
105
|
Collection.new(self, endpoint, default_criteria)
|
92
106
|
end
|
93
|
-
|
107
|
+
|
94
108
|
def find(id)
|
95
109
|
raise NoEndpointSpecified unless endpoint
|
96
|
-
|
110
|
+
|
97
111
|
uri = "#{endpoint}/#{id}"
|
98
|
-
|
112
|
+
|
99
113
|
Util.log "GET: #{uri}"
|
100
114
|
response = get uri
|
101
|
-
|
115
|
+
|
102
116
|
if response.code == 200
|
103
117
|
attributes = Util.parse_json(response.body)
|
104
118
|
resource = new(attributes)
|
@@ -106,56 +120,56 @@ module Hungry
|
|
106
120
|
resource
|
107
121
|
end
|
108
122
|
end
|
109
|
-
|
123
|
+
|
110
124
|
def first(n = 1)
|
111
125
|
collection.first(n)
|
112
126
|
end
|
113
|
-
|
127
|
+
|
114
128
|
def all(criteria = {})
|
115
129
|
collection.all(criteria)
|
116
130
|
end
|
117
|
-
|
131
|
+
|
118
132
|
def each(&block)
|
119
133
|
all.each(&block)
|
120
134
|
end
|
121
135
|
end
|
122
|
-
|
136
|
+
|
123
137
|
### INSTANCE METHODS:
|
124
|
-
|
138
|
+
|
125
139
|
def initialize(new_attributes = {})
|
126
140
|
self.attributes = {}
|
127
|
-
|
141
|
+
|
128
142
|
new_attributes.each do |key, value|
|
129
143
|
if value.respond_to?(:symbolize_keys)
|
130
144
|
value = value.symbolize_keys
|
131
145
|
end
|
132
|
-
|
146
|
+
|
133
147
|
attributes[key] = value
|
134
|
-
|
148
|
+
|
135
149
|
if respond_to?("#{key}=")
|
136
150
|
send("#{key}=", value)
|
137
151
|
end
|
138
152
|
end
|
139
153
|
end
|
140
|
-
|
154
|
+
|
141
155
|
def canonical_data_source
|
142
156
|
resources && resources[:self]
|
143
157
|
end
|
144
|
-
|
158
|
+
|
145
159
|
def reload
|
146
160
|
resource = self.class.find id
|
147
|
-
|
161
|
+
|
148
162
|
if resource
|
149
163
|
self.data_source = resource.data_source
|
150
164
|
initialize resource.attributes
|
151
165
|
else
|
152
166
|
self.data_source = nil
|
153
|
-
initialize Hash[
|
167
|
+
initialize Hash[attributes.keys.map { |key| [key, nil] }]
|
154
168
|
end
|
155
|
-
|
169
|
+
|
156
170
|
@has_many = {}
|
157
171
|
@belongs_to = {}
|
158
|
-
|
172
|
+
|
159
173
|
self
|
160
174
|
end
|
161
175
|
end
|
data/lib/hungry/response.rb
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
module Hungry
|
2
2
|
class Response < Resource
|
3
|
-
|
3
|
+
|
4
4
|
### RESOURCES:
|
5
|
-
|
5
|
+
|
6
6
|
belongs_to :review, 'Hungry::Review'
|
7
|
-
|
7
|
+
|
8
8
|
### ATTRIBUTES:
|
9
|
-
|
9
|
+
|
10
10
|
### Review:
|
11
11
|
attr_accessor :id, :body, :author,
|
12
|
-
|
12
|
+
|
13
13
|
### Utility:
|
14
14
|
:created_at, :updated_at
|
15
|
-
|
15
|
+
|
16
16
|
end
|
17
17
|
end
|
data/lib/hungry/review.rb
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
module Hungry
|
2
2
|
class Review < Resource
|
3
|
-
|
3
|
+
|
4
4
|
### RESOURCES:
|
5
|
-
|
5
|
+
|
6
6
|
belongs_to :venue, 'Hungry::Venue'
|
7
|
-
|
7
|
+
|
8
8
|
has_many :responses, 'Hungry::Response'
|
9
|
-
|
9
|
+
|
10
10
|
### ATTRIBUTES:
|
11
|
-
|
11
|
+
|
12
12
|
### Review:
|
13
13
|
attr_accessor :id, :body, :rating, :scores, :author,
|
14
|
-
|
14
|
+
|
15
15
|
### Utility:
|
16
16
|
:created_at, :updated_at
|
17
|
-
|
17
|
+
|
18
18
|
end
|
19
19
|
end
|
data/lib/hungry/site.rb
CHANGED
@@ -1,36 +1,37 @@
|
|
1
1
|
module Hungry
|
2
2
|
class Site < Resource
|
3
|
-
|
3
|
+
|
4
4
|
self.endpoint = '/sites'
|
5
|
-
|
5
|
+
|
6
6
|
### FINDERS:
|
7
|
-
|
7
|
+
|
8
8
|
def self.with_hostname(hostname)
|
9
9
|
collection.all(hostname: hostname).first
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
def self.for_country(country)
|
13
13
|
collection.all(country: country.id).first
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
def self.default_site
|
17
17
|
collection.all(default: true).first
|
18
18
|
end
|
19
|
-
|
20
|
-
|
19
|
+
|
20
|
+
|
21
21
|
### ATTRIBUTES:
|
22
|
-
|
22
|
+
|
23
23
|
### Preview:
|
24
24
|
attr_accessor :id, :name, :title, :subtitle, :identifier, :default, :locale,
|
25
|
-
:url, :email, :support_email, :timezone, :country,
|
26
|
-
|
25
|
+
:url, :email, :support_email, :timezone, :country,
|
26
|
+
:newsletter_list, :applications,
|
27
|
+
|
27
28
|
### Utility:
|
28
29
|
:resources, :counters
|
29
|
-
|
30
|
+
|
30
31
|
def hostname
|
31
32
|
uri = URI.parse(url) rescue nil
|
32
33
|
uri && uri.hostname
|
33
34
|
end
|
34
|
-
|
35
|
+
|
35
36
|
end
|
36
37
|
end
|
data/lib/hungry/tag.rb
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
module Hungry
|
2
2
|
class Tag < Resource
|
3
|
-
|
3
|
+
|
4
4
|
self.endpoint = '/tags'
|
5
|
-
|
5
|
+
|
6
6
|
### RESOURCES:
|
7
|
-
|
7
|
+
|
8
8
|
has_many :venues, 'Hungry::Venue'
|
9
|
-
|
9
|
+
|
10
10
|
has_many :tags, 'Hungry::Tag'
|
11
|
-
|
11
|
+
|
12
12
|
### ATTRIBUTES:
|
13
|
-
|
13
|
+
|
14
14
|
### Tag:
|
15
15
|
attr_accessor :id, :name, :context,
|
16
|
-
|
16
|
+
|
17
17
|
### Utility:
|
18
18
|
:resources, :counters
|
19
19
|
end
|
data/lib/hungry/user.rb
CHANGED
@@ -1,77 +1,77 @@
|
|
1
1
|
module Hungry
|
2
2
|
class User < Resource
|
3
|
-
|
3
|
+
|
4
4
|
self.endpoint = '/users'
|
5
|
-
|
5
|
+
|
6
6
|
### ASSOCIATIONS:
|
7
|
-
|
7
|
+
|
8
8
|
has_many :reviews, 'Hungry::Review'
|
9
|
-
|
9
|
+
|
10
10
|
### FINDERS:
|
11
|
-
|
11
|
+
|
12
12
|
def self.with_ip(ip_address)
|
13
13
|
collection.all(ip: ip_address)
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
### CLASS METHODS:
|
17
|
-
|
17
|
+
|
18
18
|
def self.authenticate_with_persistence_token(persistence_token)
|
19
19
|
result = authenticate_via_api 'Cookie' => "persistence_token=#{persistence_token}"
|
20
20
|
return false unless result.present?
|
21
|
-
|
21
|
+
|
22
22
|
from_json(result)
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
def self.authenticate_with_perishable_token(perishable_token)
|
26
26
|
result = authenticate_via_api query: "perishable_token=#{perishable_token}"
|
27
27
|
return false unless result.present?
|
28
|
-
|
28
|
+
|
29
29
|
from_json(result)
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
def self.from_json(json)
|
33
33
|
new Util.parse_json(json)
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
def self.authenticate_via_api(options = {})
|
37
37
|
options = {
|
38
38
|
path: '/account.json',
|
39
39
|
query: nil
|
40
40
|
}.merge(options)
|
41
|
-
|
41
|
+
|
42
42
|
url = URI.parse(Hungry.api_url)
|
43
43
|
url.path = options.delete(:path)
|
44
44
|
url.query = options.delete(:query)
|
45
|
-
|
45
|
+
|
46
46
|
http = Net::HTTP.new(url.host, url.port)
|
47
47
|
if url.scheme == 'https'
|
48
48
|
http.use_ssl = true
|
49
49
|
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
request = Net::HTTP::Get.new(url.request_uri, options)
|
53
53
|
response = http.request request
|
54
|
-
|
54
|
+
|
55
55
|
if response.code.to_i == 200
|
56
56
|
response.body
|
57
57
|
else
|
58
58
|
false
|
59
59
|
end
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
### ATTRIBUTES:
|
63
|
-
|
63
|
+
|
64
64
|
### Preview:
|
65
65
|
attr_accessor :id, :name, :avatar, :slug, :profile_url, :score, :bio,
|
66
66
|
:location, :email,
|
67
|
-
|
67
|
+
|
68
68
|
### FULL:
|
69
69
|
:gender, :birth_date, :website_url, :persistence_token,
|
70
70
|
:single_access_token, :maintainer_of, :connections,
|
71
71
|
:device_tokens, :admin,
|
72
|
-
|
72
|
+
|
73
73
|
### Utility:
|
74
74
|
:resources, :counters, :created_at, :updated_at, :activated_at
|
75
|
-
|
75
|
+
|
76
76
|
end
|
77
77
|
end
|