hungry 0.0.1 → 0.1.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4f382ff7047bd18e021c8c7320fb9a95542cf0ac
4
+ data.tar.gz: a9bd20ca16e736a776b557b32d789987486e71c6
5
+ SHA512:
6
+ metadata.gz: 72012a98730db3ab4c92c5bb72994f0eca7cb25009e27ceb0e3be395cbc86d91d7d860b0719394fee02661cd3ab141c0760456e173caf0e62ad66e5c68fb8830
7
+ data.tar.gz: ca2815e04c8a495f0f168826d49db1d4b9150fc2a0f4864e2568898c9f9ff28ec43a45d0381c6331dcc9cf578ab43c4fe14e09b15e5581b839948a8b799f6cc2
data/.gitignore CHANGED
@@ -1,6 +1,5 @@
1
1
  *.gem
2
2
  .bundle
3
3
  .rvmrc
4
- Gemfile.lock
5
4
  pkg/*
6
5
  tmp/
data/.rspec CHANGED
@@ -1,2 +1,2 @@
1
1
  --color
2
- --format s
2
+ --format documentation
@@ -0,0 +1 @@
1
+ ruby-2.3.0
@@ -0,0 +1,19 @@
1
+ # SSH Key to pull private repositories:
2
+ source_key: "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBM0MySG13YUFIOTQrOW9pb1NSU2I4enk3OHlQemxuL0hxcEdEVjhWREllR1NseTFPCi9VUmVpRnpkcEY2eEN1Y3RRWFkvVHA3QTBxKzMrMWd5cnBuZW00SWNVYUZTZ1kxelYxZ2JQY0VWVzJlWDIxVlEKN1pDdVBIYzFkbDI1K2gvbzQ3Z0l6aWwrT3dyUTNvdFVjdE9KNzk1ckxYZlp3SVAxMDZGcU9UTEhiWVluRGJjZgptYnZzSlllQmJtcEs3YlZndGs1cTdSUW5qWHlzRE0rWndObTZmamlOZWh5QTFCdlZrVWlpM2VQN3N1Q0g0ZHVUCkNVa3hKcFg2S3RKMzRxcHhvMDhlSDBvUUdSRDkrSEZjcDdYTEdJQmhCSzZhMzJTUURJci9KRy9CSWZnSTBYVkcKL1BsbU1wUmZpdlZkaGNXQUVNQmgzVzA4VkFLbmVpTUFXVUZYMFFJREFRQUJBb0lCQUJwVzJBSVRwUUFxOWgxSAorOW5DUFdXN3ZrQTM3TXYwUFU2S1djd0dMU0hBZW1qYllyZXBsaVY1OW9uVFNocWp6U1lubnlzb2txaWhuTURVCnJEdDI3TXB0cGpXZHR1RUlxdU9vQnBvOG52RndVeHBKK29SdzZtY1JXN1B0UW5KSm52S2U4VzY0U0FHSUtiUjEKdG9TR0NkcElJVW92TEQxN2k4emxZbSsxUTJZMmpXVVRoQ1VUMDh3WE1GWlZqd3BZaWdWeGNxYXQ1NWtNcUw0RwpRZGJXam1Ldm9UMkZMbDVWVCtqOERuRStlbEFhL2plamJVbURVNkRFVVZpYzdMNTM5ZG1ZNjBZVzhxSnkvajNUCkJlbHREK252RUhQTmZEY01UMkoxQks2TVpZQjBSNXpxVmdyY0d4dkJNV3pxeUNTRTczODdpYm1Lb054OTlyV3MKT1dPTlBvRUNnWUVBOGhhbjdoWkxvalpyT3Z3UGtVOTUvckI3YWZHcFdCbkFQcUtLdUFwNTgwd3M1SmJLeXZEdwo2bWlhVFJrcW5SWU93c081ZTV4aU5teXZqVlpoZ245Wml5VGxvZWI4Y3ZkeWFPeGhqMjYxKzI4TXltYkxGcnN3CmptMEJucCswUVdKNERzbHRtT255WG1MTUdjQ2xGTDROWkRFZWZDVmJiNVlhRGNRYTdUN0lIbDhDZ1lFQTZOU00KUjdLNG5wTE0rc1hBOHhjeFVGTkxiTjBZMTVXT1pMVUREcnprVDBDOUtnYWkwd2VlYitxa0tuNUxSeVlNM0lxLwp0ZFBOL3NXb0wwZjFmRlNJcVZEL3lwNmhjWFlTaXhnSmFRZEUvZTV5dWd5M0c0RHJzc1lOMkpDMnFpdFQwOXFECloxL0IzMU9QYXZJa3dYMGF1SGpmUVB0U3hDWnZ6MmVSZ21SeDE4OENnWUJ1YUZqRUk5VHdzUUxzanNLRzBnbGcKVjVxaGNiNTYySnV0dFRHd3g4NWdZSkJrM0VTMmszWThZZUpsWVNIbkxJVWszR0MrZUU3dVpWa1hDNXREQ2RPTAp1eE1qYUpZZjFLeVFINlpLNVFJSUh0aGxnc1lDb3ZKOU1rZTMwVHhEU2FaWmtCSDAyRlZhS0pMTzkrWVI5SzlrCnoyWUkxbnpDQW1IMWYwZU1oY0o4M3dLQmdRQzkvRG9mZ3psY3c4TVpXZVpSTmZxYVplMWsvcUQzd1dTNHptK1oKUmc4eWtFd0xEL0VySzh0ZjNXSnAvallrNzJxTlIzYVp3eVFUSVd4VWNHNWpMb041VGN2N3BTZHRjd0E4bWJlTQpDVStGdVYzS2JQZTVMS0NuZHk3ektWcTBUcmlQWlgzV0MzQWljSWZWcDVMUWcrb2EzeDZsWXE2dHVnT0FoUzFaCjdlWnJSd0tCZ0F0eUdBTlkrektRa285R2lNOU9ISCtIc1ErMCtwRE5PZE5lOE4va3RLR25XSDI0bzJzTzNXWjkKMS84amtKR3MyNnhnUUg1TitQKzZXZXk4dDA5MFhyRHFFSHA1bEUyd0d4eGJSN3kwSTk5NUV2enYyU3d0c2ViUwo2STRLYXpVTTJMblJBbG5IOWdMWDhWaGJBZWIvN2xhQk9KODloQjROZGF2Y1gxZkRjcFd0Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg=="
3
+
4
+ # Project settings:
5
+ language: ruby
6
+ rvm:
7
+ - "2.3.0"
8
+
9
+ # CI process:
10
+ script: bundle exec rspec spec
11
+
12
+ # Notification settings:
13
+ notifications:
14
+ webhooks: https://eetnu.slack.com/services/hooks/travis?token=YC3xwKe1gu65ikh1XOaLrUEh
15
+ campfire:
16
+ on_success: change
17
+ on_failure: always
18
+ rooms:
19
+ - "eetnu:bb17e8d4e843938b4b32ee4c1809f2f90b8456ae@316993"
data/Gemfile CHANGED
@@ -1,8 +1,10 @@
1
- source 'http://rubygems.org'
1
+ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in eet.nu.gemspec
4
4
  gemspec
5
5
 
6
+ gem 'rake'
7
+
6
8
  # Support for guard:
7
9
  gem 'guard'
8
10
  gem 'guard-bundler'
@@ -10,4 +12,8 @@ gem 'guard-rspec'
10
12
  gem 'guard-spork'
11
13
  gem 'rb-fsevent'
12
14
  gem 'rb-readline'
15
+
16
+ # RSpec:
17
+ gem 'rspec'
13
18
  gem 'fuubar'
19
+ gem 'fakeweb'
@@ -0,0 +1,104 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ hungry (0.0.1)
5
+ httparty
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ childprocess (0.5.9)
11
+ ffi (~> 1.0, >= 1.0.11)
12
+ coderay (1.1.1)
13
+ diff-lcs (1.2.5)
14
+ fakeweb (1.3.0)
15
+ ffi (1.9.10)
16
+ formatador (0.2.5)
17
+ fuubar (2.0.0)
18
+ rspec (~> 3.0)
19
+ ruby-progressbar (~> 1.4)
20
+ guard (2.14.0)
21
+ formatador (>= 0.2.4)
22
+ listen (>= 2.7, < 4.0)
23
+ lumberjack (~> 1.0)
24
+ nenv (~> 0.1)
25
+ notiffany (~> 0.0)
26
+ pry (>= 0.9.12)
27
+ shellany (~> 0.0)
28
+ thor (>= 0.18.1)
29
+ guard-bundler (2.1.0)
30
+ bundler (~> 1.0)
31
+ guard (~> 2.2)
32
+ guard-compat (~> 1.1)
33
+ guard-compat (1.2.1)
34
+ guard-rspec (4.7.2)
35
+ guard (~> 2.1)
36
+ guard-compat (~> 1.1)
37
+ rspec (>= 2.99.0, < 4.0)
38
+ guard-spork (2.1.0)
39
+ childprocess (>= 0.2.3)
40
+ guard (~> 2.0)
41
+ guard-compat (~> 1.0)
42
+ spork (>= 0.8.4)
43
+ httparty (0.13.7)
44
+ json (~> 1.8)
45
+ multi_xml (>= 0.5.2)
46
+ json (1.8.3)
47
+ listen (3.1.5)
48
+ rb-fsevent (~> 0.9, >= 0.9.4)
49
+ rb-inotify (~> 0.9, >= 0.9.7)
50
+ ruby_dep (~> 1.2)
51
+ lumberjack (1.0.10)
52
+ method_source (0.8.2)
53
+ multi_xml (0.5.5)
54
+ nenv (0.3.0)
55
+ notiffany (0.1.0)
56
+ nenv (~> 0.1)
57
+ shellany (~> 0.0)
58
+ pry (0.10.3)
59
+ coderay (~> 1.1.0)
60
+ method_source (~> 0.8.1)
61
+ slop (~> 3.4)
62
+ rake (11.2.2)
63
+ rb-fsevent (0.9.7)
64
+ rb-inotify (0.9.7)
65
+ ffi (>= 0.5.0)
66
+ rb-readline (0.5.3)
67
+ rspec (3.4.0)
68
+ rspec-core (~> 3.4.0)
69
+ rspec-expectations (~> 3.4.0)
70
+ rspec-mocks (~> 3.4.0)
71
+ rspec-core (3.4.4)
72
+ rspec-support (~> 3.4.0)
73
+ rspec-expectations (3.4.0)
74
+ diff-lcs (>= 1.2.0, < 2.0)
75
+ rspec-support (~> 3.4.0)
76
+ rspec-mocks (3.4.1)
77
+ diff-lcs (>= 1.2.0, < 2.0)
78
+ rspec-support (~> 3.4.0)
79
+ rspec-support (3.4.1)
80
+ ruby-progressbar (1.8.1)
81
+ ruby_dep (1.3.1)
82
+ shellany (0.0.1)
83
+ slop (3.6.0)
84
+ spork (0.9.2)
85
+ thor (0.19.1)
86
+
87
+ PLATFORMS
88
+ ruby
89
+
90
+ DEPENDENCIES
91
+ fakeweb
92
+ fuubar
93
+ guard
94
+ guard-bundler
95
+ guard-rspec
96
+ guard-spork
97
+ hungry!
98
+ rake
99
+ rb-fsevent
100
+ rb-readline
101
+ rspec
102
+
103
+ BUNDLED WITH
104
+ 1.12.5
data/Rakefile CHANGED
@@ -1 +1,15 @@
1
1
  require 'bundler/gem_tasks'
2
+
3
+ task :console do
4
+ require 'logger'
5
+ require 'irb'
6
+ require 'irb/completion'
7
+ require_relative './lib/hungry'
8
+
9
+ Hungry.logger = Logger.new(STDOUT).tap do |logger|
10
+ logger.level = Logger::DEBUG
11
+ end
12
+
13
+ ARGV.clear
14
+ IRB.start
15
+ end
@@ -18,9 +18,4 @@ Gem::Specification.new do |s|
18
18
 
19
19
  # specify any dependencies here:
20
20
  s.add_dependency 'httparty'
21
- s.add_dependency 'rack'
22
-
23
- # specify any development dependencies here:
24
- s.add_development_dependency 'rspec'
25
- s.add_development_dependency 'fakeweb'
26
21
  end
@@ -1,30 +1,42 @@
1
1
  $LOAD_PATH << File.expand_path('..', __FILE__)
2
-
2
+
3
3
  require 'support/presence'
4
4
  require 'support/symbolize_keys'
5
5
 
6
6
  module Hungry
7
- VERSION = '0.0.1'
7
+ VERSION = '0.1.0'
8
8
 
9
9
  class << self
10
- attr_accessor :api_url
10
+ attr_accessor :api_url, :json_parser, :logger
11
11
  end
12
12
 
13
- self.api_url = 'http://api.eet.nu/'
13
+ self.api_url = 'https://api.eet.nu/'
14
+ self.json_parser = lambda do |json|
15
+ require 'json'
16
+ JSON.parse(json)
17
+ end
14
18
 
15
19
  ### LIBRARY:
16
20
 
17
- autoload :City, 'hungry/city'
21
+ # Utility:
18
22
  autoload :Collection, 'hungry/collection'
19
- autoload :Country, 'hungry/country'
23
+ autoload :Resource, 'hungry/resource'
24
+ autoload :Util, 'hungry/util'
25
+
26
+ # Helpers:
20
27
  autoload :Geolocation, 'hungry/geolocation'
21
28
  autoload :Location, 'hungry/location'
29
+
30
+ # Models:
31
+ autoload :City, 'hungry/city'
32
+ autoload :Country, 'hungry/country'
33
+ autoload :Menu, 'hungry/menu'
22
34
  autoload :Region, 'hungry/region'
23
- autoload :Resource, 'hungry/resource'
24
35
  autoload :Review, 'hungry/review'
36
+ autoload :Response, 'hungry/response'
25
37
  autoload :Site, 'hungry/site'
26
38
  autoload :Tag, 'hungry/tag'
27
- autoload :Util, 'hungry/util'
39
+ autoload :User, 'hungry/user'
28
40
  autoload :Venue, 'hungry/venue'
29
41
 
30
42
  ### EXCEPTIONS:
@@ -1,5 +1,4 @@
1
- require 'httparty'
2
- require 'cgi'
1
+ require 'httparty' unless defined? HTTParty
3
2
 
4
3
  module Hungry
5
4
  class Collection
@@ -13,7 +12,6 @@ module Hungry
13
12
  ### CLASS METHODS:
14
13
 
15
14
  def self.get(*args)
16
- puts "[Collection]: GET #{args.map(&:inspect).join(', ')}"
17
15
  self.base_uri Hungry.api_url
18
16
  super
19
17
  end
@@ -37,28 +35,64 @@ module Hungry
37
35
  self.class.new(klass, endpoint, criteria.merge(new_criteria))
38
36
  end
39
37
 
38
+ def [](index)
39
+ build_resource results[index]
40
+ end
41
+
42
+ def first(n = 1)
43
+ if n == 1 && (value = results.first)
44
+ build_resource value
45
+ elsif n > 1
46
+ results.first(n).map do |result|
47
+ build_resource result
48
+ end
49
+ end
50
+ end
51
+
40
52
  def count(*args)
41
53
  if args.present?
42
54
  super
43
55
  else
44
- response['results'].count
56
+ results.count
45
57
  end
46
58
  end
47
59
 
48
60
  def each(&block)
49
- response['results'].each do |result|
50
- yield klass.new(result)
61
+ results.each do |result|
62
+ yield build_resource(result)
51
63
  end
52
64
  end
53
65
 
54
- private
66
+ def results
67
+ @results ||= json['results']
68
+ end
69
+
70
+ def results=(results)
71
+ @results = results
72
+ end
73
+
74
+ protected
75
+
76
+ def build_resource(result)
77
+ resource = klass.new(result)
78
+ resource.data_source = data_source
79
+ resource
80
+ end
81
+
82
+ def data_source
83
+ Util.uri_with_params(endpoint, criteria)
84
+ end
85
+
86
+ def json
87
+ @json ||= Util.parse_json(response.body)
88
+ end
55
89
 
56
90
  def response
57
91
  raise NoEndpointSpecified unless endpoint
58
92
 
59
93
  @response ||= begin
60
- uri = Util.uri_with_params(endpoint, criteria)
61
- self.class.get uri
94
+ Util.log "GET: #{data_source}"
95
+ self.class.get data_source
62
96
  end
63
97
  end
64
98
  end
@@ -7,6 +7,23 @@ module Hungry
7
7
  all options.merge(page: page)
8
8
  end
9
9
 
10
+ def first(n = 1)
11
+ scope = all(per_page: n, page: 1)
12
+ results = scope.results
13
+
14
+ if n == 1 && (value = results.first)
15
+ resource = klass.new results.first
16
+ resource.data_source = scope.data_source
17
+ resource
18
+ elsif n > 1
19
+ results.first(n).map do |result|
20
+ resource = klass.new result
21
+ resource.data_source = scope.data_source
22
+ resource
23
+ end
24
+ end
25
+ end
26
+
10
27
  def paginated?
11
28
  pagination.present?
12
29
  end
@@ -27,8 +27,8 @@ module Hungry
27
27
  #
28
28
  # input is a String, so we can use a regular expression to extract
29
29
  # latitude and longitude:
30
- if match = input.match(/^(?<latitude>[0-9\.]+),\s?(?<longitude>[0-9\.]+)$/)
31
- coordinates = [match[:latitude], match[:longitude]]
30
+ if match = input.match(/^([0-9\.]+),\s?([0-9\.]+)$/)
31
+ coordinates = [match[1], match[2]]
32
32
  end
33
33
 
34
34
  elsif input.respond_to?(:keys)
@@ -59,5 +59,25 @@ module Hungry
59
59
  def to_s
60
60
  [latitude, longitude].join(',')
61
61
  end
62
+
63
+ def [](key)
64
+ to_h.send(:[], key)
65
+ end
66
+
67
+ def []=(key, value)
68
+ case key.to_sym
69
+ when :latitude
70
+ self.latitude = value.to_f
71
+ when :longitude
72
+ self.longitude = value.to_f
73
+ end
74
+ end
75
+
76
+ def to_h
77
+ {
78
+ latitude: latitude,
79
+ longitude: longitude
80
+ }
81
+ end
62
82
  end
63
83
  end
@@ -3,6 +3,14 @@ module Hungry
3
3
 
4
4
  self.endpoint = '/locations'
5
5
 
6
+ ### RESOURCES:
7
+
8
+ has_many :venues, 'Hungry::Venue'
9
+
10
+ has_many :nearby_venues, 'Hungry::Venue'
11
+
12
+ has_many :tags, 'Hungry::Tag'
13
+
6
14
  ### ATTRIBUTES:
7
15
 
8
16
  ### Location:
@@ -11,13 +19,10 @@ module Hungry
11
19
  ### Utility:
12
20
  :resources, :counters
13
21
 
14
- ### RESOURCES:
15
-
16
- has_many :venues, Venue
17
-
18
- has_many :nearby_venues, Venue
19
-
20
- has_many :tags, Tag
21
-
22
+ def geolocation=(new_coordinates)
23
+ @geolocation = Geolocation.parse(new_coordinates).tap do |geo|
24
+ attributes[:geolocation] = geo
25
+ end
26
+ end
22
27
  end
23
28
  end
@@ -0,0 +1,53 @@
1
+ module Hungry
2
+ class Menu < Resource
3
+ autoload :Category, 'hungry/menu/category'
4
+ autoload :Dish, 'hungry/menu/dish'
5
+ autoload :Option, 'hungry/menu/option'
6
+
7
+ self.endpoint = '/menus'
8
+
9
+ ### RESOURCES:
10
+
11
+ belongs_to :venue, 'Hungry::Venue'
12
+
13
+ ### ATTRIBUTES:
14
+
15
+ ### Menu:
16
+ attr_accessor :id, :name, :type, :attachment,
17
+
18
+ ### Associations:
19
+ :categories, :venue,
20
+
21
+ ### Utility:
22
+ :created_at, :updated_at
23
+
24
+ lazy_load :venue
25
+
26
+ def managed?
27
+ type == 'managed' || categories.present?
28
+ end
29
+
30
+ def download?
31
+ type == 'download'
32
+ end
33
+
34
+ def venue=(venue_attributes)
35
+ @venue = Hungry::Venue.new(venue_attributes)
36
+ end
37
+
38
+ def categories
39
+ @categories ||= []
40
+ end
41
+ lazy_load :categories
42
+
43
+ def categories=(new_categories)
44
+ @categories = new_categories.map do |attributes|
45
+ category = Menu::Category.new(attributes)
46
+ category.menu = self
47
+ category.data_source = data_source
48
+ category
49
+ end
50
+ end
51
+
52
+ end
53
+ end