full_circle 0.2.0 → 0.3.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.
Files changed (37) hide show
  1. checksums.yaml +6 -14
  2. data/.gitignore +1 -0
  3. data/.rspec +1 -0
  4. data/.ruby-version +1 -0
  5. data/full_circle.gemspec +6 -8
  6. data/lib/full_circle.rb +1 -0
  7. data/lib/full_circle/api.rb +1 -1
  8. data/lib/full_circle/parsed_response.rb +1 -1
  9. data/lib/full_circle/response.rb +1 -1
  10. data/lib/full_circle/response_builder.rb +2 -2
  11. data/lib/full_circle/upcoming_event_builder.rb +1 -1
  12. data/lib/full_circle/version.rb +1 -1
  13. data/spec/fixtures/vcr_cassettes/empty_event_area_response.yml +2 -2
  14. data/spec/fixtures/vcr_cassettes/empty_get_coupons_response.yml +1 -1
  15. data/spec/fixtures/vcr_cassettes/empty_get_events_response.yml +1 -1
  16. data/spec/fixtures/vcr_cassettes/empty_get_upcoming_events_response.yml +2 -2
  17. data/spec/fixtures/vcr_cassettes/multiple_event_areas_response.yml +2 -2
  18. data/spec/fixtures/vcr_cassettes/multiple_get_coupons_response.yml +1 -1
  19. data/spec/fixtures/vcr_cassettes/multiple_get_upcoming_events_response.yml +2 -2
  20. data/spec/fixtures/vcr_cassettes/multple_get_events_response.yml +1 -1
  21. data/spec/fixtures/vcr_cassettes/single_event_areas_response.yml +2 -2
  22. data/spec/fixtures/vcr_cassettes/single_get_coupons_response.yml +1 -1
  23. data/spec/fixtures/vcr_cassettes/single_get_events_response.yml +1 -1
  24. data/spec/fixtures/vcr_cassettes/single_get_upcoming_events_response.yml +1 -1
  25. data/spec/full_circle/api_spec.rb +28 -34
  26. data/spec/full_circle/connection_spec.rb +25 -11
  27. data/spec/full_circle/object_builder_spec.rb +5 -5
  28. data/spec/full_circle/parsed_response_spec.rb +45 -33
  29. data/spec/full_circle/response_builder_spec.rb +8 -8
  30. data/spec/full_circle/response_spec.rb +61 -14
  31. data/spec/spec_helper.rb +1 -1
  32. data/spec/support/shared/cacher_examples.rb +9 -0
  33. data/spec/support/shared/{event_spec.rb → event_examples.rb} +4 -2
  34. data/spec/support/shared/{object_builder_spec.rb → object_builder_examples.rb} +0 -0
  35. metadata +33 -60
  36. data/Guardfile +0 -24
  37. data/spec/support/shared/cacher_spec.rb +0 -9
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- YTEwOGEyZGIxMWMyODc4Y2M5ZDEyNDZhODEzMTczNTUwN2VhNjJmMg==
5
- data.tar.gz: !binary |-
6
- YmRkNjQ4NjA5MTdmNzUyYjFhOTZjNGQ2YTZkNjU3ZmViMTM3MzVjNQ==
7
- !binary "U0hBNTEy":
8
- metadata.gz: !binary |-
9
- NGIyMzMwNDFkOGQxZDk3YjljNjMxYmQ1ZDkzMTcwMDFkYmQ5N2JhNzFhZWJl
10
- MGNlMzliYmRlNzA3OWNjNDYxYjBiMjRjYzgwZTdkMmM1MDk1ZjA4NjA0ZTFi
11
- NTIyODM1NTI4ZDRjZjQ2NjhhNDVjNTdhYjc4ZGU5NjZiYjg4Mzk=
12
- data.tar.gz: !binary |-
13
- Zjk0YTY1YWY4ODA5NzA3Yjc1ODJkMTQ2ZDhiMDIxZmRjNGY2MmEzMjI1NTY4
14
- OWRiNTFlOWEyZmNjZjE2MTZjZTI4YTZmZmExMzNlNzhmZGM2N2VmMTY1NDAz
15
- NWFiODg1NDE0ZTY2OGJiY2NmMGI2Njc5MmVlYWM5OTY2YTc0ZmY=
2
+ SHA1:
3
+ metadata.gz: 921cd25b80f85aafb4855127c71c39e4ac619f80
4
+ data.tar.gz: 6e21e8a35e78320ff841a338d631a312c15aafc5
5
+ SHA512:
6
+ metadata.gz: 880020a8f93b69e06007d171a2b72b9befa6a999936c63250cd4e9f839e8e9eb72435c535aa6b48b7ffd5fbc22fd3d326ec80f31f69e719985f164793a592d6d
7
+ data.tar.gz: add1359cd220d2bb26458fb716672a73d3dcb2ff21e8bd091b32fe3b30ca212d471dad35b91bc72e71565df946cdf5d2e3c7701a86ac2ddbbca96915b9f0d24e
data/.gitignore CHANGED
@@ -16,3 +16,4 @@ spec/reports
16
16
  test/tmp
17
17
  test/version_tmp
18
18
  tmp
19
+ bin/
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.0.0-p643
data/full_circle.gemspec CHANGED
@@ -10,8 +10,8 @@ Gem::Specification.new do |gem|
10
10
  gem.email = ["aaron@animascodelabs.com"]
11
11
  gem.description = %q{Library for interfacing with the 360Directories API}
12
12
  gem.summary = %q{Library for interfacing with the 360Directories API}
13
- gem.homepage = "https://github.com/aaronrenner/full_circle"
14
- gem.required_ruby_version = ">= 1.9.2"
13
+ gem.homepage = "https://github.com/animascodelabs/full_circle"
14
+ gem.required_ruby_version = ">= 2.0.0"
15
15
 
16
16
  gem.files = `git ls-files`.split($/)
17
17
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
@@ -19,11 +19,9 @@ Gem::Specification.new do |gem|
19
19
  gem.require_paths = ["lib"]
20
20
 
21
21
  gem.add_dependency "multi_xml"
22
- gem.add_dependency "activesupport", "~>3.2.12"
23
- gem.add_development_dependency "rspec"
24
- gem.add_development_dependency "vcr"
25
- gem.add_development_dependency "webmock", "~> 1.8.0"
22
+ gem.add_dependency "activesupport", ">= 3.2"
23
+ gem.add_development_dependency "rspec", '~> 3.2'
24
+ gem.add_development_dependency "vcr", '~> 2.9'
25
+ gem.add_development_dependency "webmock"
26
26
  gem.add_development_dependency "rake"
27
- gem.add_development_dependency "guard-rspec"
28
- gem.add_development_dependency "rb-inotify", "~> 0.9"
29
27
  end
data/lib/full_circle.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'multi_xml'
2
+ require "active_support"
2
3
  require "active_support/core_ext"
3
4
 
4
5
  require_relative 'full_circle/version'
@@ -1,6 +1,6 @@
1
1
  module FullCircle
2
2
  class API
3
-
3
+
4
4
  attr_reader :connection
5
5
 
6
6
  def initialize(connection)
@@ -18,7 +18,7 @@ module FullCircle
18
18
  collection_array
19
19
  end
20
20
 
21
-
21
+
22
22
  private
23
23
 
24
24
  def response_hash
@@ -1,7 +1,7 @@
1
1
  module FullCircle
2
2
  class Response
3
3
  attr_reader :results, :page, :total_pages, :total_results, :results_per_page
4
-
4
+
5
5
  def initialize(results, metadata)
6
6
  @results = results
7
7
  @page = metadata.fetch(:page){1}
@@ -6,7 +6,7 @@ module FullCircle
6
6
  # Creates a new response builder
7
7
  # api_results - collection of objects to be built into the response
8
8
  # args
9
- # metadata: hash of metadata
9
+ # metadata: hash of metadata
10
10
  # object_builder: The object builder to use for building api objects
11
11
  def initialize(api_results, args={})
12
12
  @api_results = api_results
@@ -21,6 +21,6 @@ module FullCircle
21
21
 
22
22
  Response.new(objects,metadata)
23
23
  end
24
-
24
+
25
25
  end
26
26
  end
@@ -39,6 +39,6 @@ module FullCircle
39
39
  def ad_id
40
40
  hash.fetch("ad"){{}}["id"]
41
41
  end
42
-
42
+
43
43
  end
44
44
  end
@@ -1,3 +1,3 @@
1
1
  module FullCircle
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -2,7 +2,7 @@
2
2
  http_interactions:
3
3
  - request:
4
4
  method: get
5
- uri: http://api.1019thewave.com/1.0/city.getEventAreas?
5
+ uri: http://api.1019thewave.com/1.0/city.getEventAreas
6
6
  body:
7
7
  encoding: US-ASCII
8
8
  string: ''
@@ -42,6 +42,6 @@ http_interactions:
42
42
  <city-getEventAreasResponse page="1" resultsPerPage="20" totalPages="0" totalResults="0"><eventAreas></eventAreas></city-getEventAreasResponse>
43
43
 
44
44
  '
45
- http_version:
45
+ http_version:
46
46
  recorded_at: Tue, 26 Mar 2013 19:29:44 GMT
47
47
  recorded_with: VCR 2.4.0
@@ -42,6 +42,6 @@ http_interactions:
42
42
  <ad-getCouponsResponse><coupons></coupons></ad-getCouponsResponse>
43
43
 
44
44
  '
45
- http_version:
45
+ http_version:
46
46
  recorded_at: Mon, 18 Mar 2013 04:25:35 GMT
47
47
  recorded_with: VCR 2.4.0
@@ -42,6 +42,6 @@ http_interactions:
42
42
  <ad-getEventsResponse><events></events></ad-getEventsResponse>
43
43
 
44
44
  '
45
- http_version:
45
+ http_version:
46
46
  recorded_at: Wed, 12 Dec 2012 17:31:42 GMT
47
47
  recorded_with: VCR 2.3.0
@@ -2,7 +2,7 @@
2
2
  http_interactions:
3
3
  - request:
4
4
  method: get
5
- uri: http://api.boatersbluepages.com/1.0/city.getUpcomingEvents?
5
+ uri: http://api.boatersbluepages.com/1.0/city.getUpcomingEvents
6
6
  body:
7
7
  encoding: US-ASCII
8
8
  string: ''
@@ -43,6 +43,6 @@ http_interactions:
43
43
  totalResults="0"><events></events></city-getUpcomingEventsResponse>
44
44
 
45
45
  '
46
- http_version:
46
+ http_version:
47
47
  recorded_at: Tue, 26 Mar 2013 22:31:50 GMT
48
48
  recorded_with: VCR 2.4.0
@@ -2,7 +2,7 @@
2
2
  http_interactions:
3
3
  - request:
4
4
  method: get
5
- uri: http://api.360durango.com/1.0/city.getEventAreas?
5
+ uri: http://api.360durango.com/1.0/city.getEventAreas
6
6
  body:
7
7
  encoding: US-ASCII
8
8
  string: ''
@@ -46,6 +46,6 @@ http_interactions:
46
46
  id="591" name="Historic Downtown"></eventArea><eventArea id="735" name="Vallecito"></eventArea></eventAreas></city-getEventAreasResponse>
47
47
 
48
48
  '
49
- http_version:
49
+ http_version:
50
50
  recorded_at: Tue, 26 Mar 2013 19:19:20 GMT
51
51
  recorded_with: VCR 2.4.0
@@ -55,6 +55,6 @@ http_interactions:
55
55
  other coupons for products.</restrictions></coupon></coupons></ad-getCouponsResponse>
56
56
 
57
57
  '
58
- http_version:
58
+ http_version:
59
59
  recorded_at: Mon, 18 Mar 2013 04:30:36 GMT
60
60
  recorded_with: VCR 2.4.0
@@ -2,7 +2,7 @@
2
2
  http_interactions:
3
3
  - request:
4
4
  method: get
5
- uri: http://api.360durango.com/1.0/city.getUpcomingEvents?
5
+ uri: http://api.360durango.com/1.0/city.getUpcomingEvents
6
6
  body:
7
7
  encoding: US-ASCII
8
8
  string: ''
@@ -272,6 +272,6 @@ http_interactions:
272
272
  addr1=\"1911 Main Ave., Suite 100\" city=\"Durango\" state=\"CO\" zipCode=\"81301\"
273
273
  phone=\"970.247.1240\" fax=\"970.247.1771\"></address><logoImage url=\"http://tours.360durango.com/152054/logo.gif\"
274
274
  width=\"300\" height=\"263\"></logoImage></ad></event></events></city-getUpcomingEventsResponse>\n"
275
- http_version:
275
+ http_version:
276
276
  recorded_at: Tue, 26 Mar 2013 22:30:11 GMT
277
277
  recorded_with: VCR 2.4.0
@@ -91,6 +91,6 @@ http_interactions:
91
91
  appetizers" imageURL="http://tours.360durango.com/89690/event_58652.jpg"></event></events></ad-getEventsResponse>
92
92
 
93
93
  '
94
- http_version:
94
+ http_version:
95
95
  recorded_at: Wed, 12 Dec 2012 17:31:41 GMT
96
96
  recorded_with: VCR 2.3.0
@@ -2,7 +2,7 @@
2
2
  http_interactions:
3
3
  - request:
4
4
  method: get
5
- uri: http://api.360durango.com/1.0/city.getEventAreas?
5
+ uri: http://api.360durango.com/1.0/city.getEventAreas
6
6
  body:
7
7
  encoding: US-ASCII
8
8
  string: ''
@@ -44,6 +44,6 @@ http_interactions:
44
44
  </eventAreas></city-getEventAreasResponse>
45
45
 
46
46
  '
47
- http_version:
47
+ http_version:
48
48
  recorded_at: Tue, 26 Mar 2013 19:22:34 GMT
49
49
  recorded_with: VCR 2.4.0
@@ -46,6 +46,6 @@ http_interactions:
46
46
  of Booking. No Refunds.</restrictions></coupon></coupons></ad-getCouponsResponse>
47
47
 
48
48
  '
49
- http_version:
49
+ http_version:
50
50
  recorded_at: Mon, 18 Mar 2013 04:30:35 GMT
51
51
  recorded_with: VCR 2.4.0
@@ -47,6 +47,6 @@ http_interactions:
47
47
  and 7p.m. to receive your second entree FREE." imageURL="http://tours.360durango.com/81213/event_58794.jpg"></event></events></ad-getEventsResponse>
48
48
 
49
49
  '
50
- http_version:
50
+ http_version:
51
51
  recorded_at: Wed, 12 Dec 2012 03:35:57 GMT
52
52
  recorded_with: VCR 2.3.0
@@ -56,6 +56,6 @@ http_interactions:
56
56
  width="250" height="218"></logoImage></ad></event></events></city-getUpcomingEventsResponse>
57
57
 
58
58
  '
59
- http_version:
59
+ http_version:
60
60
  recorded_at: Tue, 26 Mar 2013 23:05:54 GMT
61
61
  recorded_with: VCR 2.4.0
@@ -6,9 +6,9 @@ describe FullCircle::API do
6
6
  let!(:api){FullCircle::API.new(FullCircle::Connection.new("360durango.com"))}
7
7
 
8
8
  describe "#fetch_events_for_ad" do
9
- pending "calls the appropriate method on call_api_method" do
9
+ skip "calls the appropriate method on call_api_method" do
10
10
  mock_connection = double()
11
- mock_connection.should_receive(:call_api_method).with("ad.getEvents",{adId: "1"}) do
11
+ expect(mock_connection).to receive(:call_api_method).with("ad.getEvents",{adId: "1"}) do
12
12
  class ResponseDouble
13
13
  def body
14
14
  end
@@ -19,8 +19,7 @@ describe FullCircle::API do
19
19
  described_class.new(mock_connection).fetch_events_for_ad("1")
20
20
  end
21
21
 
22
- describe "event object" do
23
- use_vcr_cassette "single_get_events_response"
22
+ describe "event object", :vcr => {cassette_name: "single_get_events_response"} do
24
23
  subject {api.fetch_events_for_ad("81213").first}
25
24
  it_behaves_like "an event"
26
25
  end
@@ -29,19 +28,19 @@ describe FullCircle::API do
29
28
  it "returns an array of one event" do
30
29
  VCR.use_cassette "single_get_events_response" do
31
30
  results = api.fetch_events_for_ad "81213"
32
- results.should be_a Array
31
+ expect(results).to be_a Array
33
32
  results
34
33
  end
35
34
  end
36
35
 
37
36
  end
38
-
37
+
39
38
  context "with multiple events" do
40
39
  it "returns an array of multiple events" do
41
40
  VCR.use_cassette "multple_get_events_response" do
42
41
  results = api.fetch_events_for_ad "89690"
43
- results.should be_a Array
44
- (results.length > 1).should be_true
42
+ expect(results).to be_a Array
43
+ expect(results.length > 1).to eq(true)
45
44
  end
46
45
  end
47
46
  end
@@ -50,7 +49,7 @@ describe FullCircle::API do
50
49
  it "returns an empty array" do
51
50
  VCR.use_cassette "empty_get_events_response" do
52
51
  results = api.fetch_events_for_ad "1"
53
- results.should eq []
52
+ expect(results).to eq([])
54
53
  end
55
54
  end
56
55
  end
@@ -60,19 +59,19 @@ describe FullCircle::API do
60
59
 
61
60
  describe "#fetch_coupons_for_ad" do
62
61
 
63
- pending "calls the appropriate method on call_api_method" do
62
+ skip "calls the appropriate method on call_api_method" do
64
63
  mock_connection = double()
65
- mock_connection.should_receive(:call_api_method).with("ad.getCoupons",{adId: "1"})
64
+ expect(mock_connection).to receive(:call_api_method).with("ad.getCoupons",{adId: "1"})
66
65
 
67
66
  described_class.new(mock_connection).fetch_coupons_for_ad("1")
68
67
  end
69
-
68
+
70
69
  context "with one coupon" do
71
70
  it "returns an array of one coupon" do
72
71
  VCR.use_cassette "single_get_coupons_response" do
73
72
  results = api.fetch_coupons_for_ad "123094"
74
- results.should be_a Array
75
- results.length.should eq 1
73
+ expect(results).to be_an(Array)
74
+ expect(results.length).to eq(1)
76
75
  end
77
76
  end
78
77
  end
@@ -81,8 +80,8 @@ describe FullCircle::API do
81
80
  it "returns an array of multiple coupons" do
82
81
  VCR.use_cassette "multiple_get_coupons_response" do
83
82
  results = api.fetch_coupons_for_ad "82196"
84
- results.should be_a Array
85
- results.length.should eq 3
83
+ expect(results).to be_a(Array)
84
+ expect(results.length).to eq(3)
86
85
  end
87
86
  end
88
87
  end
@@ -91,16 +90,16 @@ describe FullCircle::API do
91
90
  it "returns an empty array" do
92
91
  VCR.use_cassette "empty_get_coupons_response" do
93
92
  results = api.fetch_coupons_for_ad "1"
94
- results.should eq []
93
+ expect(results).to eq([])
95
94
  end
96
95
  end
97
96
  end
98
97
  end
99
98
 
100
99
  describe "#fetch_event_areas" do
101
- pending "calls the appropriate method on call_api_method" do
100
+ skip "calls the appropriate method on call_api_method" do
102
101
  mock_connection = double()
103
- mock_connection.should_receive(:call_api_method).with("city.getEventAreas")
102
+ expect(mock_connection).to receive(:call_api_method).with("city.getEventAreas")
104
103
 
105
104
  described_class.new(mock_connection).fetch_event_areas
106
105
  end
@@ -109,8 +108,7 @@ describe FullCircle::API do
109
108
  it "returns an array of one event area" do
110
109
  VCR.use_cassette "single_event_areas_response" do
111
110
  results = api.fetch_event_areas
112
- results.should be_a Array
113
- results.length.should eq 1
111
+ expect(results.length).to eq(1)
114
112
  end
115
113
  end
116
114
  end
@@ -119,8 +117,7 @@ describe FullCircle::API do
119
117
  it "returns an array of multiple event areas" do
120
118
  VCR.use_cassette "multiple_event_areas_response" do
121
119
  results = api.fetch_event_areas
122
- results.should be_a Array
123
- results.length.should eq 7
120
+ expect(results.length).to eq(7)
124
121
  end
125
122
  end
126
123
  end
@@ -130,7 +127,7 @@ describe FullCircle::API do
130
127
  it "returns an empty array" do
131
128
  VCR.use_cassette "empty_event_area_response" do
132
129
  results = api.fetch_event_areas
133
- results.should eq []
130
+ expect(results).to eq([])
134
131
  end
135
132
  end
136
133
  end
@@ -139,15 +136,14 @@ describe FullCircle::API do
139
136
 
140
137
  describe "#fetch_upcoming_events" do
141
138
 
142
- pending "calls the appropriate method on call_api_method" do
139
+ skip "calls the appropriate method on call_api_method" do
143
140
  mock_connection = double()
144
- mock_connection.should_receive(:call_api_method).with("city.getUpcomingEvents",{})
141
+ expect(mock_connection).to receive(:call_api_method).with("city.getUpcomingEvents",{})
145
142
 
146
143
  described_class.new(mock_connection).fetch_upcoming_events
147
144
  end
148
145
 
149
- describe "event object" do
150
- use_vcr_cassette "single_get_upcoming_events_response"
146
+ describe "event object", vcr: {cassette_name: "single_get_upcoming_events_response"} do
151
147
 
152
148
  subject {api.fetch_upcoming_events(areaId:"592").first}
153
149
  it_behaves_like "an event"
@@ -157,19 +153,17 @@ describe FullCircle::API do
157
153
  it "returns an array of one event" do
158
154
  VCR.use_cassette "single_get_upcoming_events_response" do
159
155
  results = api.fetch_upcoming_events areaId: "592"
160
- results.should be_a Array
161
- results.length.should be 1
156
+ expect(results.length).to eq(1)
162
157
  end
163
158
  end
164
159
 
165
160
  end
166
-
161
+
167
162
  context "with multiple events" do
168
163
  it "returns an array of multiple events" do
169
164
  VCR.use_cassette "multiple_get_upcoming_events_response" do
170
165
  results = api.fetch_upcoming_events
171
- results.should be_a Array
172
- (results.length > 1).should be_true
166
+ expect(results.length > 1).to eq(true)
173
167
  end
174
168
  end
175
169
  end
@@ -179,7 +173,7 @@ describe FullCircle::API do
179
173
  it "returns an empty array" do
180
174
  VCR.use_cassette "empty_get_upcoming_events_response" do
181
175
  results = api.fetch_upcoming_events
182
- results.should eq []
176
+ expect(results).to eq([])
183
177
  end
184
178
  end
185
179
  end
@@ -4,43 +4,57 @@ describe FullCircle::Connection do
4
4
 
5
5
  subject {FullCircle::Connection.new "360durango.com"}
6
6
 
7
- its(:domain) {should == "360durango.com"}
8
- its(:base_uri) {should == "http://api.360durango.com/1.0/"}
7
+ describe "#domain" do
8
+ it "returns the value set in the constructor" do
9
+ conn = described_class.new "360durango.com"
9
10
 
10
- let!(:req_stub) {stub_http_request(:get, "api.360durango.com/1.0/ad.getCoupons").with(query: {adId: "81304"})
11
+ expect(conn.domain).to eq('360durango.com')
12
+ end
13
+ end
14
+
15
+ describe "#base_uri" do
16
+ it "returns formats the domain into the proper uri" do
17
+ conn = described_class.new "360durango.com"
18
+
19
+ expect(conn.base_uri).to eq('http://api.360durango.com/1.0/')
20
+ end
21
+ end
22
+
23
+
24
+ let!(:req_stub) {stub_request(:get, "api.360durango.com/1.0/ad.getCoupons").with(query: {adId: "81304"})
11
25
  .to_return(body: "abc")
12
26
  }
13
27
 
14
28
  describe ".call_api_method" do
15
29
 
16
- it "should request the correct uri" do
30
+ it "requests the correct uri" do
17
31
  subject.call_api_method "ad.getCoupons", adId: "81304"
18
32
 
19
- req_stub.should have_been_requested
33
+ expect(req_stub).to have_been_requested
20
34
  end
21
35
 
22
- it "should return the correct data" do
36
+ it "returns the correct data" do
23
37
  response = subject.call_api_method "ad.getCoupons", adId: "81304"
24
- response.body.should eq("abc")
38
+ expect(response.body).to eq("abc")
25
39
  end
26
40
 
27
41
  context "without cache" do
28
- it "should make the http request each time" do
42
+ it "makes the http request each time" do
29
43
  subject.call_api_method "ad.getCoupons", adId: "81304"
30
44
  subject.call_api_method "ad.getCoupons", adId: "81304"
31
45
 
32
- req_stub.should have_been_requested.twice
46
+ expect(req_stub).to have_been_requested.twice
33
47
  end
34
48
  end
35
49
 
36
50
  context "with cache" do
37
51
  subject {FullCircle::Connection.new "360durango.com", cache: {}}
38
52
 
39
- it "should make the http request each time" do
53
+ it "does not make the http request each time" do
40
54
  subject.call_api_method "ad.getCoupons", adId: "81304"
41
55
  subject.call_api_method "ad.getCoupons", adId: "81304"
42
56
 
43
- req_stub.should have_been_requested.once
57
+ expect(req_stub).to have_been_requested.once
44
58
  end
45
59
  end
46
60
 
@@ -9,14 +9,14 @@ describe FullCircle::ObjectBuilder do
9
9
 
10
10
  it "builds a new event with the appropriate attribute set" do
11
11
  object = builder.from_api_hash("id" => "123", "title" => "Hello World")
12
- object.id.should eq "123"
13
- object.title.should eq "Hello World"
12
+ expect(object.id).to eq("123")
13
+ expect(object.title).to eq("Hello World")
14
14
  end
15
-
15
+
16
16
  it "builds a new event with camelcased attributes converted to underscored attributes" do
17
17
  object = builder.from_api_hash("linkUrl" => "http://www.google.com", "siteId" => "77")
18
- object.link_url.should eq "http://www.google.com"
19
- object.site_id.should eq "77"
18
+ expect(object.link_url).to eq("http://www.google.com")
19
+ expect(object.site_id).to eq("77")
20
20
  end
21
21
 
22
22
  end
@@ -9,14 +9,14 @@ describe FullCircle::ParsedResponse do
9
9
  <?xml version="1.0"?>
10
10
  <ad-getListResponse page="2" resultsPerPage="2" totalPages="541" totalResults="1081">
11
11
  <ads>
12
- <ad id="81009" name="4Core" url="http://360Durango.com/Environmental/4core.html"
13
- eventCount="0" couponCount="0" jobCount="0" locationCount="1" popupCount="0"
12
+ <ad id="81009" name="4Core" url="http://360Durango.com/Environmental/4core.html"
13
+ eventCount="0" couponCount="0" jobCount="0" locationCount="1" popupCount="0"
14
14
  slideshowCount="0" linkCount="0">
15
15
  <address addr1="949 E 2ND AV" city="DURANGO" state="CO" zipCode="81301"></address>
16
16
  </ad>
17
- <ad id="123760" name="4x4 Auto " url="http://360Durango.com/Automotive/4x4Auto.html"
18
- description="Used Car Dealership Cortez 360Durango Colorado" eventCount="0"
19
- couponCount="0" jobCount="0" locationCount="0" popupCount="0" slideshowCount="0"
17
+ <ad id="123760" name="4x4 Auto " url="http://360Durango.com/Automotive/4x4Auto.html"
18
+ description="Used Car Dealership Cortez 360Durango Colorado" eventCount="0"
19
+ couponCount="0" jobCount="0" locationCount="0" popupCount="0" slideshowCount="0"
20
20
  linkCount="0">
21
21
  </ad>
22
22
  </ads>
@@ -24,15 +24,16 @@ describe FullCircle::ParsedResponse do
24
24
  EOS
25
25
  end
26
26
 
27
- subject { described_class.new(xml).metadata }
28
-
29
- its([:page]){should eq 2}
30
- its([:results_per_page]){should eq 2}
31
- its([ :total_pages ]){should eq 541 }
32
- its([ :total_results ]){should eq 1081}
33
-
34
-
27
+ it 'sets the appropriate kes and values in the hash' do
28
+ response = described_class.new(xml)
35
29
 
30
+ expect(response.metadata).to eq({
31
+ page: 2,
32
+ results_per_page: 2,
33
+ total_pages: 541,
34
+ total_results: 1081
35
+ })
36
+ end
36
37
  end
37
38
 
38
39
  context "with no provided metadata" do
@@ -41,12 +42,12 @@ EOS
41
42
  <?xml version="1.0"?>
42
43
  <ad-getCouponsResponse>
43
44
  <coupons>
44
- <coupon id="32025" name="90 for 90!" begin="2013-04-04"
45
+ <coupon id="32025" name="90 for 90!" begin="2013-04-04"
45
46
  expire="2013-04-30" accept_offline="1" accept_online="0" acceptMobile="1" acceptPrint="1">
46
47
  <offer>Get a relaxing and restorative 90 minute massage for just $90!</offer>
47
48
  <restrictions>Service must be booked in the month of April.</restrictions>
48
49
  </coupon>
49
- <coupon id="32025" name="90 for 90!" begin="2013-04-04"
50
+ <coupon id="32025" name="90 for 90!" begin="2013-04-04"
50
51
  expire="2013-04-30" accept_offline="1" accept_online="0" acceptMobile="1" acceptPrint="1">
51
52
  <offer>Get a relaxing and restorative 90 minute massage for just $90!</offer>
52
53
  <restrictions>Service must be booked in the month of April.</restrictions>
@@ -56,13 +57,16 @@ EOS
56
57
  EOS
57
58
  end
58
59
 
59
- subject { described_class.new(xml).metadata }
60
-
61
- its([ :page ]){should eq 1}
62
- its([ :total_pages ]){should eq 1 }
63
- its([ :total_results ]) {should eq 2}
64
- its([ :results_per_page ]) {should eq 2 }
60
+ it 'sets the appropriate kes and values in the hash' do
61
+ response = described_class.new(xml)
65
62
 
63
+ expect(response.metadata).to eq({
64
+ page: 1,
65
+ results_per_page: 2,
66
+ total_pages: 1,
67
+ total_results: 2
68
+ })
69
+ end
66
70
  end
67
71
  end
68
72
 
@@ -79,8 +83,11 @@ EOS
79
83
  EOS
80
84
  end
81
85
 
82
- subject{described_class.new(xml).results}
83
- it { should eq [] }
86
+ it 'returns an empty results array' do
87
+ response = described_class.new(xml)
88
+
89
+ expect(response.results).to eq([])
90
+ end
84
91
  end
85
92
 
86
93
  context "with one result" do
@@ -90,7 +97,7 @@ EOS
90
97
  <?xml version="1.0"?>
91
98
  <ad-getCouponsResponse>
92
99
  <coupons>
93
- <coupon id="32025" name="90 for 90!" begin="2013-04-04"
100
+ <coupon id="32025" name="90 for 90!" begin="2013-04-04"
94
101
  expire="2013-04-30" accept_offline="1" accept_online="0" acceptMobile="1" acceptPrint="1">
95
102
  <offer>Get a relaxing and restorative 90 minute massage for just $90!</offer>
96
103
  <restrictions>Service must be booked in the month of April.</restrictions>
@@ -100,8 +107,11 @@ EOS
100
107
  EOS
101
108
  end
102
109
 
103
- subject{described_class.new(xml).results}
104
- its(:length){should eq 1 }
110
+ it 'returns one object in the results array' do
111
+ response = described_class.new(xml)
112
+
113
+ expect(response.results.length).to eq(1)
114
+ end
105
115
 
106
116
  end
107
117
 
@@ -111,14 +121,14 @@ EOS
111
121
  <?xml version="1.0"?>
112
122
  <ad-getListResponse page="2" resultsPerPage="2" totalPages="541" totalResults="1081">
113
123
  <ads>
114
- <ad id="81009" name="4Core" url="http://360Durango.com/Environmental/4core.html"
115
- eventCount="0" couponCount="0" jobCount="0" locationCount="1" popupCount="0"
124
+ <ad id="81009" name="4Core" url="http://360Durango.com/Environmental/4core.html"
125
+ eventCount="0" couponCount="0" jobCount="0" locationCount="1" popupCount="0"
116
126
  slideshowCount="0" linkCount="0">
117
127
  <address addr1="949 E 2ND AV" city="DURANGO" state="CO" zipCode="81301"></address>
118
128
  </ad>
119
- <ad id="123760" name="4x4 Auto " url="http://360Durango.com/Automotive/4x4Auto.html"
120
- description="Used Car Dealership Cortez 360Durango Colorado" eventCount="0"
121
- couponCount="0" jobCount="0" locationCount="0" popupCount="0" slideshowCount="0"
129
+ <ad id="123760" name="4x4 Auto " url="http://360Durango.com/Automotive/4x4Auto.html"
130
+ description="Used Car Dealership Cortez 360Durango Colorado" eventCount="0"
131
+ couponCount="0" jobCount="0" locationCount="0" popupCount="0" slideshowCount="0"
122
132
  linkCount="0">
123
133
  </ad>
124
134
  </ads>
@@ -126,9 +136,11 @@ EOS
126
136
  EOS
127
137
  end
128
138
 
129
- subject { described_class.new(xml).results }
139
+ it 'returns an array with all results' do
140
+ response = described_class.new(xml)
130
141
 
131
- its(:length){should eq 2}
142
+ expect(response.results.length).to eq(2)
143
+ end
132
144
  end
133
145
 
134
146
  end
@@ -14,13 +14,13 @@ describe FullCircle::ResponseBuilder do
14
14
  subject {object_builder_double}
15
15
  it_behaves_like "an object builder"
16
16
  end
17
-
17
+
18
18
  describe "#build" do
19
19
  context "with empty array of api_results" do
20
20
  subject{ described_class.new [], object_builder: object_builder_double }
21
-
21
+
22
22
  it "calls object_builder.from_api_hash" do
23
- object_builder_double.should_not_receive(:from_api_hash)
23
+ expect(object_builder_double).not_to receive(:from_api_hash)
24
24
  subject.build
25
25
  end
26
26
 
@@ -28,18 +28,18 @@ describe FullCircle::ResponseBuilder do
28
28
 
29
29
  context "with an array of multiple api_results" do
30
30
  subject{ described_class.new [{},{}], object_builder: object_builder_double }
31
-
31
+
32
32
  it "calls object_builder.from_api_hash" do
33
- object_builder_double.should_receive(:from_api_hash).with({}).exactly(2).times
33
+ expect(object_builder_double).to receive(:from_api_hash).with({}).exactly(2).times
34
34
  subject.build
35
35
  end
36
36
  end
37
37
 
38
38
  describe "response outgoing messages" do
39
39
  subject{ described_class.new [{},{}], object_builder: object_builder_double }
40
-
41
- it "should create a response with the correct arguments" do
42
- FullCircle::Response.should_receive(:new).with([nil,nil],{})
40
+
41
+ it "creates a response with the correct arguments" do
42
+ expect(FullCircle::Response).to receive(:new).with([nil,nil],{})
43
43
 
44
44
  subject.build
45
45
  end
@@ -2,28 +2,75 @@ require 'spec_helper'
2
2
 
3
3
  describe FullCircle::Response do
4
4
 
5
- describe "defaults" do
6
- subject{described_class.new([],{})}
5
+ describe '#results' do
6
+ it 'defaults to an empty array' do
7
+ response = described_class.new([], {})
7
8
 
8
- its(:results){should eq []}
9
- its(:page){should eq 1}
10
- its(:total_pages){should eq 1}
11
- its(:results_per_page){should eq 0 }
12
- its(:total_results){should eq 0 }
9
+ expect(response.results).to eq([])
10
+ end
13
11
 
12
+ it 'can be set to the first argument in the constructor' do
13
+ results = double('results', length: 0)
14
+
15
+ response = described_class.new(results, {})
16
+
17
+ expect(response.results).to eq(results)
18
+ end
19
+ end
20
+
21
+ describe '#page' do
22
+ it 'defaults to 1' do
23
+ response = described_class.new([], {})
24
+
25
+ expect(response.page).to eq(1)
26
+ end
27
+
28
+ it 'can be set in the metadata hash' do
29
+ response = described_class.new([], {page: 2 })
30
+
31
+ expect(response.page).to eq(2)
32
+ end
14
33
  end
15
34
 
16
- describe "with metadata" do
17
- subject{described_class.new([],{page: 2, total_pages:5, results_per_page: 5, total_results: 25})}
35
+ describe '#total_pages' do
36
+ it 'defaults to 1' do
37
+ response = described_class.new([], {})
38
+
39
+ expect(response.total_pages).to eq(1)
40
+ end
18
41
 
19
- its(:results){should eq []}
20
- its(:page){should eq 2}
21
- its(:total_pages){should eq 5}
22
- its(:results_per_page){should eq 5 }
23
- its(:total_results){should eq 25 }
42
+ it 'can be set in the metadata hash' do
43
+ response = described_class.new([], {total_pages: 5 })
24
44
 
45
+ expect(response.total_pages).to eq(5)
46
+ end
25
47
  end
26
48
 
49
+ describe '#results_per_page' do
50
+ it 'defaults to 0' do
51
+ response = described_class.new([], {})
27
52
 
53
+ expect(response.results_per_page).to eq(0)
54
+ end
28
55
 
56
+ it 'can be set in the metadata hash' do
57
+ response = described_class.new([], {results_per_page: 5 })
58
+
59
+ expect(response.results_per_page).to eq(5)
60
+ end
61
+ end
62
+
63
+ describe '#total_results' do
64
+ it 'defaults to 0' do
65
+ response = described_class.new([], {})
66
+
67
+ expect(response.total_results).to eq(0)
68
+ end
69
+
70
+ it 'can be set in the metadata hash' do
71
+ response = described_class.new([], {total_results: 25 })
72
+
73
+ expect(response.total_results).to eq(25)
74
+ end
75
+ end
29
76
  end
data/spec/spec_helper.rb CHANGED
@@ -10,8 +10,8 @@ Dir["./spec/support/**/*.rb"].sort.each {|f| require f}
10
10
  VCR.configure do |c|
11
11
  c.cassette_library_dir = "spec/fixtures/vcr_cassettes"
12
12
  c.hook_into :webmock
13
+ c.configure_rspec_metadata!
13
14
  end
14
15
 
15
16
  RSpec.configure do |c|
16
- c.extend VCR::RSpec::Macros
17
17
  end
@@ -0,0 +1,9 @@
1
+ shared_examples_for "a cacher" do
2
+ it { expect(subject).to respond_to(:fetch).with(1).argument }
3
+
4
+ describe "#store" do
5
+ it "returns the value that is stored" do
6
+ expect(subject.store("key","value")).to eq("value")
7
+ end
8
+ end
9
+ end
@@ -2,8 +2,10 @@ shared_examples_for "an event" do
2
2
  required_attrs = :id, :date, :time, :title, :all_day_event, :date_mode, :site_id,
3
3
  :type, :description
4
4
 
5
- for attr in required_attrs
6
- its(attr){should_not be_blank}
5
+ required_attrs.each do |field|
6
+ it "does not have a blank #{field}" do
7
+ expect(subject.send("#{field}")).to be_present
8
+ end
7
9
  end
8
10
 
9
11
 
metadata CHANGED
@@ -1,127 +1,99 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: full_circle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aaron Renner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-04-29 00:00:00.000000000 Z
11
+ date: 2015-03-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: multi_xml
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ! '>='
17
+ - - '>='
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ! '>='
24
+ - - '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activesupport
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - '>='
32
32
  - !ruby/object:Gem::Version
33
- version: 3.2.12
33
+ version: '3.2'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - '>='
39
39
  - !ruby/object:Gem::Version
40
- version: 3.2.12
40
+ version: '3.2'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ! '>='
45
+ - - ~>
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: '3.2'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ! '>='
52
+ - - ~>
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: '3.2'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: vcr
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ! '>='
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ! '>='
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: webmock
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
59
  - - ~>
74
60
  - !ruby/object:Gem::Version
75
- version: 1.8.0
61
+ version: '2.9'
76
62
  type: :development
77
63
  prerelease: false
78
64
  version_requirements: !ruby/object:Gem::Requirement
79
65
  requirements:
80
66
  - - ~>
81
67
  - !ruby/object:Gem::Version
82
- version: 1.8.0
68
+ version: '2.9'
83
69
  - !ruby/object:Gem::Dependency
84
- name: rake
70
+ name: webmock
85
71
  requirement: !ruby/object:Gem::Requirement
86
72
  requirements:
87
- - - ! '>='
73
+ - - '>='
88
74
  - !ruby/object:Gem::Version
89
75
  version: '0'
90
76
  type: :development
91
77
  prerelease: false
92
78
  version_requirements: !ruby/object:Gem::Requirement
93
79
  requirements:
94
- - - ! '>='
80
+ - - '>='
95
81
  - !ruby/object:Gem::Version
96
82
  version: '0'
97
83
  - !ruby/object:Gem::Dependency
98
- name: guard-rspec
84
+ name: rake
99
85
  requirement: !ruby/object:Gem::Requirement
100
86
  requirements:
101
- - - ! '>='
87
+ - - '>='
102
88
  - !ruby/object:Gem::Version
103
89
  version: '0'
104
90
  type: :development
105
91
  prerelease: false
106
92
  version_requirements: !ruby/object:Gem::Requirement
107
93
  requirements:
108
- - - ! '>='
94
+ - - '>='
109
95
  - !ruby/object:Gem::Version
110
96
  version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: rb-inotify
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - ~>
116
- - !ruby/object:Gem::Version
117
- version: '0.9'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - ~>
123
- - !ruby/object:Gem::Version
124
- version: '0.9'
125
97
  description: Library for interfacing with the 360Directories API
126
98
  email:
127
99
  - aaron@animascodelabs.com
@@ -130,8 +102,9 @@ extensions: []
130
102
  extra_rdoc_files: []
131
103
  files:
132
104
  - .gitignore
105
+ - .rspec
106
+ - .ruby-version
133
107
  - Gemfile
134
- - Guardfile
135
108
  - LICENSE.txt
136
109
  - README.md
137
110
  - Rakefile
@@ -165,10 +138,10 @@ files:
165
138
  - spec/full_circle/response_spec.rb
166
139
  - spec/full_circle/upcoming_event_builder_spec.rb
167
140
  - spec/spec_helper.rb
168
- - spec/support/shared/cacher_spec.rb
169
- - spec/support/shared/event_spec.rb
170
- - spec/support/shared/object_builder_spec.rb
171
- homepage: https://github.com/aaronrenner/full_circle
141
+ - spec/support/shared/cacher_examples.rb
142
+ - spec/support/shared/event_examples.rb
143
+ - spec/support/shared/object_builder_examples.rb
144
+ homepage: https://github.com/animascodelabs/full_circle
172
145
  licenses: []
173
146
  metadata: {}
174
147
  post_install_message:
@@ -177,17 +150,17 @@ require_paths:
177
150
  - lib
178
151
  required_ruby_version: !ruby/object:Gem::Requirement
179
152
  requirements:
180
- - - ! '>='
153
+ - - '>='
181
154
  - !ruby/object:Gem::Version
182
- version: 1.9.2
155
+ version: 2.0.0
183
156
  required_rubygems_version: !ruby/object:Gem::Requirement
184
157
  requirements:
185
- - - ! '>='
158
+ - - '>='
186
159
  - !ruby/object:Gem::Version
187
160
  version: '0'
188
161
  requirements: []
189
162
  rubyforge_project:
190
- rubygems_version: 2.0.3
163
+ rubygems_version: 2.0.14
191
164
  signing_key:
192
165
  specification_version: 4
193
166
  summary: Library for interfacing with the 360Directories API
@@ -212,6 +185,6 @@ test_files:
212
185
  - spec/full_circle/response_spec.rb
213
186
  - spec/full_circle/upcoming_event_builder_spec.rb
214
187
  - spec/spec_helper.rb
215
- - spec/support/shared/cacher_spec.rb
216
- - spec/support/shared/event_spec.rb
217
- - spec/support/shared/object_builder_spec.rb
188
+ - spec/support/shared/cacher_examples.rb
189
+ - spec/support/shared/event_examples.rb
190
+ - spec/support/shared/object_builder_examples.rb
data/Guardfile DELETED
@@ -1,24 +0,0 @@
1
- # A sample Guardfile
2
- # More info at https://github.com/guard/guard#readme
3
-
4
- guard 'rspec', :cli => "--color" do
5
- watch(%r{^spec/.+_spec\.rb$})
6
- watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
7
- watch('spec/spec_helper.rb') { "spec" }
8
-
9
- # Rails example
10
- # watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
11
- # watch(%r{^app/(.*)(\.erb|\.haml)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
12
- # watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
13
- # watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
14
- # watch('config/routes.rb') { "spec/routing" }
15
- # watch('app/controllers/application_controller.rb') { "spec/controllers" }
16
-
17
- # Capybara features specs
18
- # watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) { |m| "spec/features/#{m[1]}_spec.rb" }
19
-
20
- # Turnip features and steps
21
- # watch(%r{^spec/acceptance/(.+)\.feature$})
22
- # watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
23
- end
24
-
@@ -1,9 +0,0 @@
1
- shared_examples_for "a cacher" do
2
- it {should respond_to(:fetch).with(1).argument}
3
-
4
- describe "#store" do
5
- it "should return the value that is stored" do
6
- subject.store("key","value").should eq "value"
7
- end
8
- end
9
- end