g5_foundation_client 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +2 -2
- data/g5_foundation_client.gemspec +2 -1
- data/lib/g5_foundation_client.rb +5 -0
- data/lib/g5_foundation_client/deserializers/client.rb +25 -0
- data/lib/g5_foundation_client/deserializers/location.rb +30 -7
- data/lib/g5_foundation_client/deserializers/safe_access.rb +12 -0
- data/lib/g5_foundation_client/models/client.rb +16 -0
- data/lib/g5_foundation_client/models/findable_by_uid.rb +7 -0
- data/lib/g5_foundation_client/models/location.rb +18 -6
- data/lib/g5_foundation_client/rspec.rb +11 -0
- data/lib/g5_foundation_client/rspec/factories.rb +4 -0
- data/lib/g5_foundation_client/version.rb +1 -1
- data/spec/fixtures/client_detail.html +150 -0
- data/spec/fixtures/empty_hcard.html +8 -0
- data/spec/fixtures/location_detail.html +59 -6
- data/spec/lib/g5_foundation_client/deserializers/client_spec.rb +31 -0
- data/spec/lib/g5_foundation_client/deserializers/location_spec.rb +27 -6
- data/spec/lib/g5_foundation_client/models/client_spec.rb +58 -0
- data/spec/lib/g5_foundation_client/models/location_spec.rb +29 -3
- metadata +62 -30
- checksums.yaml +0 -7
data/README.md
CHANGED
@@ -38,7 +38,7 @@ require 'g5_foundation_client/rspec'
|
|
38
38
|
|
39
39
|
If your environment includes FactoryGirl, this will also require some factory definitions. You probably want this.
|
40
40
|
|
41
|
-
This will give you a method to stub finding a `G5FoundationClient::Location`. Basic example:
|
41
|
+
This will give you a method to stub finding a `G5FoundationClient::Location` and `G5FoundationClient::Client`. Basic example:
|
42
42
|
```ruby
|
43
43
|
stub_location_for_uid(
|
44
44
|
"http://example.com/location_uid",
|
@@ -46,7 +46,7 @@ stub_location_for_uid(
|
|
46
46
|
)
|
47
47
|
```
|
48
48
|
|
49
|
-
If you have FactoryGirl, you can omit the second argument and it will build one for you. The `stub_location_for_uid` method will return the built
|
49
|
+
If you have FactoryGirl, you can omit the second argument and it will build one for you. The `stub_location_for_uid` method (as well as its counterpart for clients) will return the built model, which can pair nicely with a `let!` call to both build and stub in one shot.
|
50
50
|
|
51
51
|
### Contributing
|
52
52
|
|
@@ -25,7 +25,8 @@ Gem::Specification.new do |spec|
|
|
25
25
|
|
26
26
|
spec.add_development_dependency "bundler", "~> 1.5"
|
27
27
|
spec.add_development_dependency "rake"
|
28
|
-
|
28
|
+
# 2.99+ is a release to help with upgrading, which... thanks, but not now.
|
29
|
+
spec.add_development_dependency "rspec", "< 2.99"
|
29
30
|
spec.add_development_dependency "webmock"
|
30
31
|
spec.add_development_dependency "pry"
|
31
32
|
end
|
data/lib/g5_foundation_client.rb
CHANGED
@@ -19,5 +19,10 @@ end
|
|
19
19
|
|
20
20
|
require 'g5_foundation_client/fetcher'
|
21
21
|
|
22
|
+
require 'g5_foundation_client/models/findable_by_uid'
|
22
23
|
require 'g5_foundation_client/models/location'
|
24
|
+
require 'g5_foundation_client/models/client'
|
25
|
+
|
26
|
+
require 'g5_foundation_client/deserializers/safe_access'
|
23
27
|
require 'g5_foundation_client/deserializers/location'
|
28
|
+
require 'g5_foundation_client/deserializers/client'
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module G5FoundationClient::Deserializers
|
2
|
+
module Client
|
3
|
+
extend SafeAccess
|
4
|
+
|
5
|
+
def self.from_markup(markup)
|
6
|
+
h = Microformats2.parse(markup).cards.first
|
7
|
+
client = G5FoundationClient::Client.new(
|
8
|
+
uid: with_safe_access { h.uid },
|
9
|
+
urn: with_safe_access { h.g5_urn },
|
10
|
+
name: with_safe_access { h.name },
|
11
|
+
vertical: with_safe_access { h.g5_vertical },
|
12
|
+
domain: with_safe_access { h.g5_domain },
|
13
|
+
domain_type: with_safe_access { h.g5_domain_type }
|
14
|
+
)
|
15
|
+
|
16
|
+
location_formats = with_safe_access(stringify: false) { h.orgs.map(&:format) }
|
17
|
+
location_formats ||= []
|
18
|
+
location_formats.each do |hcard|
|
19
|
+
client.locations << G5FoundationClient::Deserializers::Location.from_hcard(hcard)
|
20
|
+
end
|
21
|
+
|
22
|
+
client
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -1,14 +1,37 @@
|
|
1
1
|
module G5FoundationClient::Deserializers
|
2
2
|
module Location
|
3
|
+
extend SafeAccess
|
4
|
+
|
3
5
|
def self.from_markup(markup)
|
4
6
|
hcard = Microformats2.parse(markup).cards.first
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
from_hcard(hcard)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.from_hcard(hcard)
|
11
|
+
G5FoundationClient::Location.new(hcard_to_hash(hcard))
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.hcard_to_hash(h)
|
15
|
+
{
|
16
|
+
uid: with_safe_access { h.uid },
|
17
|
+
urn: with_safe_access { h.g5_urn },
|
18
|
+
client_uid: with_safe_access { h.org.format.uid.to_s},
|
19
|
+
name: with_safe_access { h.name },
|
20
|
+
phone: with_safe_access { h.adr.format.tel },
|
21
|
+
domain: with_safe_access { h.g5_domain },
|
22
|
+
corporate: with_safe_access { h.g5_corporate },
|
23
|
+
floor_plans: with_safe_access { h.g5_floorplan },
|
24
|
+
primary_amenity: with_safe_access { h.g5_aparment_amenity_1 },
|
25
|
+
qualifier: with_safe_access { h.g5_aparment_feature_1 },
|
26
|
+
primary_landmark: with_safe_access { h.g5_landmark_1 },
|
27
|
+
ga_tracking_id: with_safe_access { h.ga_tracking_id },
|
28
|
+
ga_profile_id: with_safe_access { h.ga_profile_id },
|
29
|
+
neighborhood: with_safe_access { h.adr.format.g5_neighborhood },
|
30
|
+
street_address: with_safe_access { h.adr.format.street_address },
|
31
|
+
region: with_safe_access { h.adr.format.region },
|
32
|
+
locality: with_safe_access { h.adr.format.locality },
|
33
|
+
postal_code: with_safe_access { h.adr.format.postal_code }
|
34
|
+
}
|
12
35
|
end
|
13
36
|
end
|
14
37
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module G5FoundationClient::Deserializers
|
2
|
+
module SafeAccess
|
3
|
+
def with_safe_access(options = {}, &block)
|
4
|
+
options[:stringify] = true if options[:stringify] == nil
|
5
|
+
|
6
|
+
result = block.call
|
7
|
+
options[:stringify] ? result.to_s : result
|
8
|
+
rescue NoMethodError
|
9
|
+
nil
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class G5FoundationClient::Client
|
2
|
+
include Virtus.model
|
3
|
+
extend G5FoundationClient::FindableByUid
|
4
|
+
|
5
|
+
def self.deserializer_class
|
6
|
+
G5FoundationClient::Deserializers::Client
|
7
|
+
end
|
8
|
+
|
9
|
+
attribute :locations, Array[G5FoundationClient::Location]
|
10
|
+
attribute :uid, String
|
11
|
+
attribute :urn, String
|
12
|
+
attribute :name, String
|
13
|
+
attribute :vertical, String
|
14
|
+
attribute :domain, String
|
15
|
+
attribute :domain_type, String
|
16
|
+
end
|
@@ -1,15 +1,27 @@
|
|
1
1
|
class G5FoundationClient::Location
|
2
2
|
include Virtus.model
|
3
|
+
extend G5FoundationClient::FindableByUid
|
4
|
+
|
5
|
+
def self.deserializer_class
|
6
|
+
G5FoundationClient::Deserializers::Location
|
7
|
+
end
|
3
8
|
|
4
9
|
attribute :uid, String
|
10
|
+
attribute :urn, String
|
11
|
+
attribute :client_uid, String
|
5
12
|
attribute :name, String
|
6
13
|
attribute :phone, String
|
14
|
+
attribute :domain, String
|
15
|
+
attribute :corporate, Boolean
|
16
|
+
attribute :floor_plans, String
|
17
|
+
attribute :primary_amenity, String
|
18
|
+
attribute :qualifier, String
|
19
|
+
attribute :primary_landmark, String
|
7
20
|
attribute :ga_tracking_id, String
|
8
21
|
attribute :ga_profile_id, String
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
22
|
+
attribute :neighborhood, String
|
23
|
+
attribute :street_address, String
|
24
|
+
attribute :region, String
|
25
|
+
attribute :locality, String
|
26
|
+
attribute :postal_code, String
|
15
27
|
end
|
@@ -9,6 +9,17 @@ module G5FoundationClient::RspecHelpers
|
|
9
9
|
|
10
10
|
location
|
11
11
|
end
|
12
|
+
|
13
|
+
def stub_client_for_uid(uid, client = nil)
|
14
|
+
client ||= FactoryGirl.build(:g5_client)
|
15
|
+
|
16
|
+
G5FoundationClient::Client.
|
17
|
+
stub(:find_by_uid).
|
18
|
+
with(uid).
|
19
|
+
and_return(client)
|
20
|
+
|
21
|
+
client
|
22
|
+
end
|
12
23
|
end
|
13
24
|
|
14
25
|
RSpec.configure do |config|
|
@@ -0,0 +1,150 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head></head>
|
4
|
+
<body>
|
5
|
+
<article>
|
6
|
+
<div class="h-card">
|
7
|
+
<h2>
|
8
|
+
<a class="p-name u-uid u-url" href="http://example.com/clients/g5-c-1234-client">Test Client</a>
|
9
|
+
<small class="p-g5-vertical">Apartments</small> |
|
10
|
+
<small class="u-g5-domain">http://example.com/</small> |
|
11
|
+
<small class="p-g5-domain-type">MultiDomainClient</small>
|
12
|
+
<small class="p-g5-urn">g5-c-1234-client</small>
|
13
|
+
</h2>
|
14
|
+
<p class="p-adr h-adr">
|
15
|
+
<span class="p-street-address">
|
16
|
+
455 NW Franklin
|
17
|
+
|
18
|
+
</span>
|
19
|
+
<span>
|
20
|
+
<span class="p-locality">Bend</span>
|
21
|
+
<span class="p-region">OR</span>
|
22
|
+
<span class="p-postal-code">97701</span>
|
23
|
+
</span>
|
24
|
+
<span class="p-tel p-fax"></span>
|
25
|
+
<span class="u-email"></span>
|
26
|
+
</p>
|
27
|
+
<div>
|
28
|
+
<h4>Locations</h4>
|
29
|
+
<ul class="list-unstyled">
|
30
|
+
<li class="p-org h-card">
|
31
|
+
<a class="p-name u-uid u-url" href="http://example.com/clients/g5-c-1234-client/locations/g5-cl-1234-location">Test Location 1</a>
|
32
|
+
<a class="u-url u-g5-domain" href="http://www.salidadelsolapartments.com">http://www.salidadelsolapartments.com</a>
|
33
|
+
<p class="p-adr h-adr">
|
34
|
+
<span class="p-street-address">
|
35
|
+
1125 Sunrise Blvd.
|
36
|
+
|
37
|
+
</span>
|
38
|
+
<span class="p-g5-neighborhood">West</span>
|
39
|
+
<span>
|
40
|
+
<span class="p-locality">Ventura</span>
|
41
|
+
<span class="p-region">CA</span>
|
42
|
+
<span class="p-postal-code">93001</span>
|
43
|
+
</span>
|
44
|
+
<span class="p-tel">805-798-1256</span>
|
45
|
+
<span class="p-tel p-fax"></span>
|
46
|
+
<span class="u-email">info@salidadelsolapts.com</span>
|
47
|
+
</p>
|
48
|
+
<p>
|
49
|
+
<strong>Corporate:</strong>
|
50
|
+
<br />
|
51
|
+
<span class="p-g5-corporate">false</span>
|
52
|
+
</p>
|
53
|
+
<p>
|
54
|
+
<strong>Floor Plans:</strong>
|
55
|
+
<br />
|
56
|
+
<span class="p-g5-floorplan">1, 2, 3, studio Apartments</span>
|
57
|
+
</p>
|
58
|
+
<p>
|
59
|
+
<strong>Landmarks:</strong>
|
60
|
+
<br />
|
61
|
+
<span class="p-g5-landmark-1">Venture Marina</span>
|
62
|
+
<br />
|
63
|
+
<span class="p-g5-landmark-2">River Ridge Golf Course</span>
|
64
|
+
</p>
|
65
|
+
<p>
|
66
|
+
<strong>Property Features or Qualifiers:</strong>
|
67
|
+
<br />
|
68
|
+
<span class="p-g5-aparment-feature-1">Luxury</span>
|
69
|
+
<br />
|
70
|
+
<span class="p-g5-aparment-feature-2">Gated</span>
|
71
|
+
<br />
|
72
|
+
<span class="p-g5-aparment-feature-3"></span>
|
73
|
+
</p>
|
74
|
+
<p>
|
75
|
+
<strong>Primary Amenities:</strong>
|
76
|
+
<br />
|
77
|
+
<span class="p-g5-aparment-amenity-1">Stainless Steel Appliances</span>
|
78
|
+
<br />
|
79
|
+
<span class="p-g5-community-amenity-1">Fitness Center</span>
|
80
|
+
</p>
|
81
|
+
|
82
|
+
<h4>Client</h4>
|
83
|
+
<p class="p-org h-card">
|
84
|
+
<a class="p-name u-uid u-url" href="http://example.com/clients/g5-c-1234-client">Test Client</a>
|
85
|
+
</p>
|
86
|
+
</li>
|
87
|
+
<li class="p-org h-card">
|
88
|
+
<a class="p-name u-uid u-url" href="http://g5-hub.herokuapp.com/clients/g5-c-1servrzr-luxe-apartment-company/locations/g5-cl-1servrzz-depot-17">Depot 17</a>
|
89
|
+
<a class="u-url u-g5-domain" href="http://www.depot17apartments.com">http://www.depot17apartments.com</a>
|
90
|
+
<p class="p-adr h-adr">
|
91
|
+
<span class="p-street-address">
|
92
|
+
2675 Station St.
|
93
|
+
|
94
|
+
</span>
|
95
|
+
<span class="p-g5-neighborhood">Park Slope</span>
|
96
|
+
<span>
|
97
|
+
<span class="p-locality">Brooklyn</span>
|
98
|
+
<span class="p-region">NY</span>
|
99
|
+
<span class="p-postal-code">11215</span>
|
100
|
+
</span>
|
101
|
+
<span class="p-tel">718-639-3915</span>
|
102
|
+
<span class="p-tel p-fax"></span>
|
103
|
+
<span class="u-email">info@depot17.com</span>
|
104
|
+
</p>
|
105
|
+
<p>
|
106
|
+
<strong>Corporate:</strong>
|
107
|
+
<br />
|
108
|
+
<span class="p-g5-corporate">false</span>
|
109
|
+
</p>
|
110
|
+
<p>
|
111
|
+
<strong>Floor Plans:</strong>
|
112
|
+
<br />
|
113
|
+
<span class="p-g5-floorplan"> Apartments</span>
|
114
|
+
</p>
|
115
|
+
<p>
|
116
|
+
<strong>Landmarks:</strong>
|
117
|
+
<br />
|
118
|
+
<span class="p-g5-landmark-1"></span>
|
119
|
+
<br />
|
120
|
+
<span class="p-g5-landmark-2"></span>
|
121
|
+
</p>
|
122
|
+
<p>
|
123
|
+
<strong>Property Features or Qualifiers:</strong>
|
124
|
+
<br />
|
125
|
+
<span class="p-g5-aparment-feature-1"></span>
|
126
|
+
<br />
|
127
|
+
<span class="p-g5-aparment-feature-2"></span>
|
128
|
+
<br />
|
129
|
+
<span class="p-g5-aparment-feature-3"></span>
|
130
|
+
</p>
|
131
|
+
<p>
|
132
|
+
<strong>Primary Amenities:</strong>
|
133
|
+
<br />
|
134
|
+
<span class="p-g5-aparment-amenity-1"></span>
|
135
|
+
<br />
|
136
|
+
<span class="p-g5-community-amenity-1"></span>
|
137
|
+
</p>
|
138
|
+
|
139
|
+
<h4>Client</h4>
|
140
|
+
<p class="p-org h-card">
|
141
|
+
<a class="p-name u-uid u-url" href="http://example.com/clients/g5-c-1234-client">Test Client</a>
|
142
|
+
</p>
|
143
|
+
</li>
|
144
|
+
</ul>
|
145
|
+
</div>
|
146
|
+
</div>
|
147
|
+
|
148
|
+
</article>
|
149
|
+
</body>
|
150
|
+
</html>
|
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
<!DOCTYPE html>
|
3
2
|
<html>
|
4
3
|
<head></head>
|
@@ -6,24 +5,66 @@
|
|
6
5
|
<section class="h-card">
|
7
6
|
<h2>
|
8
7
|
<a class="p-name u-uid u-url" href="http://example.com/clients/g5-c-1234-client/locations/g5-cl-1234-location">Test Location</a>
|
8
|
+
<small class="p-g5-urn">g5-cl-1234-location</small>
|
9
9
|
</h2>
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
<h4>Domain</h4>
|
12
|
+
<a class="u-url u-g5-domain" href="http://example.com/">http://example.com/</a>
|
13
13
|
|
14
14
|
<h4>Address</h4>
|
15
15
|
<p class="p-adr h-adr">
|
16
16
|
<span class="p-street-address">
|
17
17
|
123 Test Way
|
18
|
+
|
18
19
|
</span>
|
20
|
+
<span class="p-g5-neighborhood">West</span>
|
19
21
|
<span>
|
20
22
|
<span class="p-locality">Testville</span>
|
21
|
-
<span class="p-region">
|
22
|
-
<span class="p-postal-code">
|
23
|
+
<span class="p-region">TK</span>
|
24
|
+
<span class="p-postal-code">31324</span>
|
23
25
|
</span>
|
24
26
|
<span class="p-tel">123-123-1234</span>
|
25
27
|
<span class="p-tel p-fax"></span>
|
26
|
-
<span class="u-email"
|
28
|
+
<span class="u-email">info@salidadelsolapts.com</span>
|
29
|
+
</p>
|
30
|
+
|
31
|
+
<p>
|
32
|
+
<strong>Corporate:</strong>
|
33
|
+
<br />
|
34
|
+
<span class="p-g5-corporate">true</span>
|
35
|
+
</p>
|
36
|
+
<p>
|
37
|
+
<strong>Hours:</strong>
|
38
|
+
<br />
|
39
|
+
<pre class="p-g5-hour">Mon-Fri: 7am - 6pm, Sat: 8am - 3pm, Sunday: Closed</pre>
|
40
|
+
</p>
|
41
|
+
<p>
|
42
|
+
<strong>Floor Plans:</strong>
|
43
|
+
<br />
|
44
|
+
<span class="p-g5-floorplan">1, 2, 3, studio apartments</span>
|
45
|
+
</p>
|
46
|
+
<p>
|
47
|
+
<strong>Landmarks:</strong>
|
48
|
+
<br />
|
49
|
+
<span class="p-g5-landmark-1">Venture Marina</span>
|
50
|
+
<br />
|
51
|
+
<span class="p-g5-landmark-2">River Ridge Golf Course</span>
|
52
|
+
</p>
|
53
|
+
<p>
|
54
|
+
<strong>Property Features or Qualifiers:</strong>
|
55
|
+
<br />
|
56
|
+
<span class="p-g5-aparment-feature-1">Luxury</span>
|
57
|
+
<br />
|
58
|
+
<span class="p-g5-aparment-feature-2">Gated</span>
|
59
|
+
<br />
|
60
|
+
<span class="p-g5-aparment-feature-3"></span>
|
61
|
+
</p>
|
62
|
+
<p>
|
63
|
+
<strong>Primary Amenities:</strong>
|
64
|
+
<br />
|
65
|
+
<span class="p-g5-aparment-amenity-1">Stainless Steel Appliances</span>
|
66
|
+
<br />
|
67
|
+
<span class="p-g5-community-amenity-1">Fitness Center</span>
|
27
68
|
</p>
|
28
69
|
|
29
70
|
<h4>Google Analytics</h4>
|
@@ -35,10 +76,22 @@
|
|
35
76
|
<dd class="p-ga-profile-id">ga:1234</dd>
|
36
77
|
</dl>
|
37
78
|
|
79
|
+
<dl>
|
80
|
+
<dt>Twitter</dt>
|
81
|
+
<dd class="p-nickname p-g5-nickname-twitter">G5Platform</dd>
|
82
|
+
<dt>Facebook</dt>
|
83
|
+
<dd class="p-nickname p-g5-nickname-facebook">GetG5</dd>
|
84
|
+
<dt>Yelp</dt>
|
85
|
+
<dd class="p-nickname p-g5-nickname-yelp">g5-bend</dd>
|
86
|
+
<dt>Foursquare</dt>
|
87
|
+
<dd class="p-nickname p-g5-nickname-foursquare">https://foursquare.com/v/g5-search-marketing/4b720385f964a5201b6a2de3</dd>
|
88
|
+
</dl>
|
89
|
+
|
38
90
|
<h4>Client</h4>
|
39
91
|
<p class="p-org h-card">
|
40
92
|
<a class="p-name u-uid u-url" href="http://example.com/clients/g5-c-1234-client">Test Client</a>
|
41
93
|
</p>
|
42
94
|
</section>
|
95
|
+
|
43
96
|
</body>
|
44
97
|
</html>
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe G5FoundationClient::Deserializers::Client do
|
4
|
+
describe ".from_markup" do
|
5
|
+
subject(:client) { G5FoundationClient::Deserializers::Client.from_markup(markup) }
|
6
|
+
|
7
|
+
context "with many fields provided" do
|
8
|
+
let(:markup) { fixture("client_detail.html") }
|
9
|
+
|
10
|
+
its(:uid) { should eq("http://example.com/clients/g5-c-1234-client") }
|
11
|
+
its(:urn) { should eq("g5-c-1234-client") }
|
12
|
+
its(:name) { should eq("Test Client") }
|
13
|
+
its(:vertical) { should eq("Apartments") }
|
14
|
+
its(:domain) { should eq("http://example.com/") }
|
15
|
+
its(:domain_type) { should eq("MultiDomainClient") }
|
16
|
+
|
17
|
+
describe "#locations" do
|
18
|
+
it "instantiates associated Locations" do
|
19
|
+
expect(client.locations.length).to eq(2)
|
20
|
+
expect(client.locations.first.name).to eq("Test Location 1")
|
21
|
+
expect(client.locations.first.uid).to eq("http://example.com/clients/g5-c-1234-client/locations/g5-cl-1234-location")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context "missing many fields" do
|
27
|
+
let(:markup) { fixture("empty_hcard.html") }
|
28
|
+
its(:uid) { should be_nil }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -2,13 +2,34 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe G5FoundationClient::Deserializers::Location do
|
4
4
|
describe ".from_markup" do
|
5
|
-
let(:markup) { fixture("location_detail.html") }
|
6
5
|
subject { G5FoundationClient::Deserializers::Location.from_markup(markup) }
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
7
|
+
context "with many fields provided" do
|
8
|
+
let(:markup) { fixture("location_detail.html") }
|
9
|
+
|
10
|
+
its(:uid) { should eq("http://example.com/clients/g5-c-1234-client/locations/g5-cl-1234-location") }
|
11
|
+
its(:urn) { should eq("g5-cl-1234-location") }
|
12
|
+
its(:client_uid) { should eq("http://example.com/clients/g5-c-1234-client") }
|
13
|
+
its(:name) { should eq("Test Location") }
|
14
|
+
its(:phone) { should eq("123-123-1234") }
|
15
|
+
its(:domain) { should eq("http://example.com/") }
|
16
|
+
its(:corporate) { should be_true }
|
17
|
+
its(:floor_plans) { should eq("1, 2, 3, studio apartments") }
|
18
|
+
its(:primary_amenity) { should eq("Stainless Steel Appliances") }
|
19
|
+
its(:qualifier) { should eq("Luxury") }
|
20
|
+
its(:primary_landmark) { should eq("Venture Marina") }
|
21
|
+
its(:ga_tracking_id) { should eq("UA-1234-1") }
|
22
|
+
its(:ga_profile_id) { should eq("ga:1234") }
|
23
|
+
its(:neighborhood) { should eq("West") }
|
24
|
+
its(:street_address) { should eq("123 Test Way") }
|
25
|
+
its(:locality) { should eq("Testville") }
|
26
|
+
its(:region) { should eq("TK") }
|
27
|
+
its(:postal_code) { should eq("31324") }
|
28
|
+
end
|
29
|
+
|
30
|
+
context "missing many fields" do
|
31
|
+
let(:markup) { fixture("empty_hcard.html") }
|
32
|
+
its(:uid) { should be_nil }
|
33
|
+
end
|
13
34
|
end
|
14
35
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe G5FoundationClient::Client do
|
4
|
+
before { G5FoundationClient.access_token = "token" }
|
5
|
+
|
6
|
+
describe "instantiating with a hash" do
|
7
|
+
subject do
|
8
|
+
G5FoundationClient::Client.new(
|
9
|
+
uid: "http://example.com/urn",
|
10
|
+
urn: "urn",
|
11
|
+
name: "Test Name",
|
12
|
+
vertical: "Senior",
|
13
|
+
domain: "example.com",
|
14
|
+
domain_type: "MultiDomainClient"
|
15
|
+
)
|
16
|
+
end
|
17
|
+
|
18
|
+
its(:uid) { should eql("http://example.com/urn") }
|
19
|
+
its(:urn) { should eql("urn") }
|
20
|
+
its(:name) { should eql("Test Name") }
|
21
|
+
its(:vertical) { should eql("Senior") }
|
22
|
+
its(:domain) { should eql("example.com") }
|
23
|
+
its(:domain_type) { should eql("MultiDomainClient") }
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "instantiating with nested hash of Locations" do
|
27
|
+
subject(:client) { G5FoundationClient::Client.new(attributes) }
|
28
|
+
|
29
|
+
context "when the nested parameters are correct" do
|
30
|
+
let(:attributes) do
|
31
|
+
{
|
32
|
+
name: "Client Name",
|
33
|
+
locations: [
|
34
|
+
{ name: "Location 1" },
|
35
|
+
{ name: "Location 2" }
|
36
|
+
]
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
its(:name) { should eq("Client Name") }
|
41
|
+
|
42
|
+
it "instantiates associated Locations" do
|
43
|
+
expect(client.locations.length).to eq(2)
|
44
|
+
expect(client.locations.all? { |l| l.is_a?(G5FoundationClient::Location) }).to be_true
|
45
|
+
expect(client.locations.map(&:name)).to eq([ "Location 1", "Location 2" ])
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe ".find_by_uid" do
|
51
|
+
let(:uid) { "http://example.com/clients/g5-c-1234-client" }
|
52
|
+
let(:response) { fixture("client_detail.html") }
|
53
|
+
before { stub_json(uid + "?access_token=token", response) }
|
54
|
+
subject(:find) { G5FoundationClient::Client.find_by_uid(uid) }
|
55
|
+
|
56
|
+
its(:name) { should eq("Test Client") }
|
57
|
+
end
|
58
|
+
end
|
@@ -6,19 +6,45 @@ describe G5FoundationClient::Location do
|
|
6
6
|
describe "instantiating with a hash" do
|
7
7
|
subject do
|
8
8
|
G5FoundationClient::Location.new(
|
9
|
-
uid: "http://example.com/
|
9
|
+
uid: "http://example.com/urn",
|
10
|
+
urn: "urn",
|
11
|
+
client_uid: "http://example.com/client_uid",
|
10
12
|
name: "Test Name",
|
11
13
|
phone: "123-123-1234",
|
14
|
+
domain: "example.com",
|
15
|
+
corporate: "true",
|
16
|
+
floor_plans: "Apartments",
|
17
|
+
primary_amenity: "Pony Rides",
|
18
|
+
primary_landmark: "An enormous bust of Brett Favre",
|
19
|
+
qualifier: "I have no idea what a qualifier is",
|
12
20
|
ga_tracking_id: "UA-1234-5",
|
13
|
-
ga_profile_id: "ga:1234"
|
21
|
+
ga_profile_id: "ga:1234",
|
22
|
+
neighborhood: "Wrong side of the tracks",
|
23
|
+
street_address: "123 Test Way",
|
24
|
+
region: "South Testakota",
|
25
|
+
locality: "Testville",
|
26
|
+
postal_code: "31337"
|
14
27
|
)
|
15
28
|
end
|
16
29
|
|
17
|
-
its(:uid) { should eql("http://example.com/
|
30
|
+
its(:uid) { should eql("http://example.com/urn") }
|
31
|
+
its(:urn) { should eql("urn") }
|
32
|
+
its(:client_uid) { should eql("http://example.com/client_uid") }
|
18
33
|
its(:name) { should eql("Test Name") }
|
19
34
|
its(:phone) { should eql("123-123-1234") }
|
35
|
+
its(:domain) { should eql("example.com") }
|
36
|
+
its(:corporate) { should be_true }
|
37
|
+
its(:floor_plans) { should eql("Apartments") }
|
38
|
+
its(:primary_amenity) { should eql("Pony Rides") }
|
39
|
+
its(:primary_landmark) { should eql("An enormous bust of Brett Favre") }
|
40
|
+
its(:qualifier) { should eql("I have no idea what a qualifier is") }
|
20
41
|
its(:ga_tracking_id) { should eql("UA-1234-5") }
|
21
42
|
its(:ga_profile_id) { should eql("ga:1234") }
|
43
|
+
its(:neighborhood) { should eql("Wrong side of the tracks") }
|
44
|
+
its(:street_address) { should eql("123 Test Way") }
|
45
|
+
its(:region) { should eql("South Testakota") }
|
46
|
+
its(:locality) { should eql("Testville") }
|
47
|
+
its(:postal_code) { should eql("31337") }
|
22
48
|
end
|
23
49
|
|
24
50
|
describe ".find_by_uid" do
|
metadata
CHANGED
@@ -1,139 +1,158 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: g5_foundation_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Don Petersen
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2014-
|
12
|
+
date: 2014-07-10 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: virtus
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
16
18
|
requirements:
|
17
|
-
- -
|
19
|
+
- - ! '>='
|
18
20
|
- !ruby/object:Gem::Version
|
19
21
|
version: '0'
|
20
22
|
type: :runtime
|
21
23
|
prerelease: false
|
22
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
23
26
|
requirements:
|
24
|
-
- -
|
27
|
+
- - ! '>='
|
25
28
|
- !ruby/object:Gem::Version
|
26
29
|
version: '0'
|
27
30
|
- !ruby/object:Gem::Dependency
|
28
31
|
name: httparty
|
29
32
|
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
30
34
|
requirements:
|
31
|
-
- -
|
35
|
+
- - ! '>='
|
32
36
|
- !ruby/object:Gem::Version
|
33
37
|
version: '0'
|
34
38
|
type: :runtime
|
35
39
|
prerelease: false
|
36
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
37
42
|
requirements:
|
38
|
-
- -
|
43
|
+
- - ! '>='
|
39
44
|
- !ruby/object:Gem::Version
|
40
45
|
version: '0'
|
41
46
|
- !ruby/object:Gem::Dependency
|
42
47
|
name: microformats2
|
43
48
|
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
44
50
|
requirements:
|
45
|
-
- -
|
51
|
+
- - ! '>='
|
46
52
|
- !ruby/object:Gem::Version
|
47
53
|
version: '0'
|
48
54
|
type: :runtime
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
51
58
|
requirements:
|
52
|
-
- -
|
59
|
+
- - ! '>='
|
53
60
|
- !ruby/object:Gem::Version
|
54
61
|
version: '0'
|
55
62
|
- !ruby/object:Gem::Dependency
|
56
63
|
name: g5_authentication_client
|
57
64
|
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
58
66
|
requirements:
|
59
|
-
- -
|
67
|
+
- - ! '>='
|
60
68
|
- !ruby/object:Gem::Version
|
61
69
|
version: '0.2'
|
62
70
|
type: :runtime
|
63
71
|
prerelease: false
|
64
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
65
74
|
requirements:
|
66
|
-
- -
|
75
|
+
- - ! '>='
|
67
76
|
- !ruby/object:Gem::Version
|
68
77
|
version: '0.2'
|
69
78
|
- !ruby/object:Gem::Dependency
|
70
79
|
name: bundler
|
71
80
|
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
72
82
|
requirements:
|
73
|
-
- -
|
83
|
+
- - ~>
|
74
84
|
- !ruby/object:Gem::Version
|
75
85
|
version: '1.5'
|
76
86
|
type: :development
|
77
87
|
prerelease: false
|
78
88
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
79
90
|
requirements:
|
80
|
-
- -
|
91
|
+
- - ~>
|
81
92
|
- !ruby/object:Gem::Version
|
82
93
|
version: '1.5'
|
83
94
|
- !ruby/object:Gem::Dependency
|
84
95
|
name: rake
|
85
96
|
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
86
98
|
requirements:
|
87
|
-
- -
|
99
|
+
- - ! '>='
|
88
100
|
- !ruby/object:Gem::Version
|
89
101
|
version: '0'
|
90
102
|
type: :development
|
91
103
|
prerelease: false
|
92
104
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
93
106
|
requirements:
|
94
|
-
- -
|
107
|
+
- - ! '>='
|
95
108
|
- !ruby/object:Gem::Version
|
96
109
|
version: '0'
|
97
110
|
- !ruby/object:Gem::Dependency
|
98
111
|
name: rspec
|
99
112
|
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
100
114
|
requirements:
|
101
|
-
- -
|
115
|
+
- - <
|
102
116
|
- !ruby/object:Gem::Version
|
103
|
-
version: '
|
117
|
+
version: '2.99'
|
104
118
|
type: :development
|
105
119
|
prerelease: false
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
107
122
|
requirements:
|
108
|
-
- -
|
123
|
+
- - <
|
109
124
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
125
|
+
version: '2.99'
|
111
126
|
- !ruby/object:Gem::Dependency
|
112
127
|
name: webmock
|
113
128
|
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
114
130
|
requirements:
|
115
|
-
- -
|
131
|
+
- - ! '>='
|
116
132
|
- !ruby/object:Gem::Version
|
117
133
|
version: '0'
|
118
134
|
type: :development
|
119
135
|
prerelease: false
|
120
136
|
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
121
138
|
requirements:
|
122
|
-
- -
|
139
|
+
- - ! '>='
|
123
140
|
- !ruby/object:Gem::Version
|
124
141
|
version: '0'
|
125
142
|
- !ruby/object:Gem::Dependency
|
126
143
|
name: pry
|
127
144
|
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
128
146
|
requirements:
|
129
|
-
- -
|
147
|
+
- - ! '>='
|
130
148
|
- !ruby/object:Gem::Version
|
131
149
|
version: '0'
|
132
150
|
type: :development
|
133
151
|
prerelease: false
|
134
152
|
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
135
154
|
requirements:
|
136
|
-
- -
|
155
|
+
- - ! '>='
|
137
156
|
- !ruby/object:Gem::Version
|
138
157
|
version: '0'
|
139
158
|
description: Client gem to interact with G5 services.
|
@@ -143,56 +162,69 @@ executables: []
|
|
143
162
|
extensions: []
|
144
163
|
extra_rdoc_files: []
|
145
164
|
files:
|
146
|
-
-
|
147
|
-
-
|
148
|
-
-
|
165
|
+
- .gitignore
|
166
|
+
- .rspec
|
167
|
+
- .travis.yml
|
149
168
|
- Gemfile
|
150
169
|
- LICENSE.txt
|
151
170
|
- README.md
|
152
171
|
- Rakefile
|
153
172
|
- g5_foundation_client.gemspec
|
154
173
|
- lib/g5_foundation_client.rb
|
174
|
+
- lib/g5_foundation_client/deserializers/client.rb
|
155
175
|
- lib/g5_foundation_client/deserializers/location.rb
|
176
|
+
- lib/g5_foundation_client/deserializers/safe_access.rb
|
156
177
|
- lib/g5_foundation_client/fetcher.rb
|
178
|
+
- lib/g5_foundation_client/models/client.rb
|
179
|
+
- lib/g5_foundation_client/models/findable_by_uid.rb
|
157
180
|
- lib/g5_foundation_client/models/location.rb
|
158
181
|
- lib/g5_foundation_client/record_not_found_exception.rb
|
159
182
|
- lib/g5_foundation_client/rspec.rb
|
160
183
|
- lib/g5_foundation_client/rspec/factories.rb
|
161
184
|
- lib/g5_foundation_client/version.rb
|
185
|
+
- spec/fixtures/client_detail.html
|
186
|
+
- spec/fixtures/empty_hcard.html
|
162
187
|
- spec/fixtures/location_detail.html
|
188
|
+
- spec/lib/g5_foundation_client/deserializers/client_spec.rb
|
163
189
|
- spec/lib/g5_foundation_client/deserializers/location_spec.rb
|
164
190
|
- spec/lib/g5_foundation_client/fetcher_spec.rb
|
191
|
+
- spec/lib/g5_foundation_client/models/client_spec.rb
|
165
192
|
- spec/lib/g5_foundation_client/models/location_spec.rb
|
166
193
|
- spec/lib/g5_foundation_client_spec.rb
|
167
194
|
- spec/spec_helper.rb
|
168
195
|
homepage: https://github.com/g5/g5_foundation_client
|
169
196
|
licenses:
|
170
197
|
- MIT
|
171
|
-
metadata: {}
|
172
198
|
post_install_message:
|
173
199
|
rdoc_options: []
|
174
200
|
require_paths:
|
175
201
|
- lib
|
176
202
|
required_ruby_version: !ruby/object:Gem::Requirement
|
203
|
+
none: false
|
177
204
|
requirements:
|
178
|
-
- -
|
205
|
+
- - ! '>='
|
179
206
|
- !ruby/object:Gem::Version
|
180
207
|
version: '0'
|
181
208
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
209
|
+
none: false
|
182
210
|
requirements:
|
183
|
-
- -
|
211
|
+
- - ! '>='
|
184
212
|
- !ruby/object:Gem::Version
|
185
213
|
version: '0'
|
186
214
|
requirements: []
|
187
215
|
rubyforge_project:
|
188
|
-
rubygems_version:
|
216
|
+
rubygems_version: 1.8.23
|
189
217
|
signing_key:
|
190
|
-
specification_version:
|
218
|
+
specification_version: 3
|
191
219
|
summary: Client gem to interact with G5 services.
|
192
220
|
test_files:
|
221
|
+
- spec/fixtures/client_detail.html
|
222
|
+
- spec/fixtures/empty_hcard.html
|
193
223
|
- spec/fixtures/location_detail.html
|
224
|
+
- spec/lib/g5_foundation_client/deserializers/client_spec.rb
|
194
225
|
- spec/lib/g5_foundation_client/deserializers/location_spec.rb
|
195
226
|
- spec/lib/g5_foundation_client/fetcher_spec.rb
|
227
|
+
- spec/lib/g5_foundation_client/models/client_spec.rb
|
196
228
|
- spec/lib/g5_foundation_client/models/location_spec.rb
|
197
229
|
- spec/lib/g5_foundation_client_spec.rb
|
198
230
|
- spec/spec_helper.rb
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 9d3b6df46834c3a8f1250528ac377b77a36f4cd1
|
4
|
-
data.tar.gz: ab362282521fbdba9361ee9a231fe734034f2bbf
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: 7c2f61ee0703f0abf6807391e4c6a63966e6008b3dccd1fa290b0388d0bdbae400fe0849a1ab2b733aaf9b23425872da390d867922ee2274d82c821e619b1dd3
|
7
|
-
data.tar.gz: 308ca96c321105771c4239f897ce9213dc2946506f02f50b4c6547ec4ee71eb77d117ed1811d25f1667492a993f94117376f7732e9557a9ce03387b301675a05
|