actv 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. data/.gitignore +30 -0
  2. data/.rspec +2 -0
  3. data/.ruby-gemset +1 -0
  4. data/.ruby-version +1 -0
  5. data/CHANGELOG.md +64 -0
  6. data/Gemfile +4 -0
  7. data/Guardfile +20 -0
  8. data/LICENSE +22 -0
  9. data/README.md +63 -0
  10. data/Rakefile +17 -0
  11. data/actv.gemspec +34 -0
  12. data/lib/actv.rb +48 -0
  13. data/lib/actv/address.rb +9 -0
  14. data/lib/actv/article.rb +89 -0
  15. data/lib/actv/article_search_results.rb +15 -0
  16. data/lib/actv/asset.rb +186 -0
  17. data/lib/actv/asset_channel.rb +13 -0
  18. data/lib/actv/asset_component.rb +8 -0
  19. data/lib/actv/asset_description.rb +15 -0
  20. data/lib/actv/asset_description_type.rb +12 -0
  21. data/lib/actv/asset_image.rb +13 -0
  22. data/lib/actv/asset_legacy_data.rb +20 -0
  23. data/lib/actv/asset_price.rb +11 -0
  24. data/lib/actv/asset_seo_url.rb +5 -0
  25. data/lib/actv/asset_status.rb +17 -0
  26. data/lib/actv/asset_tag.rb +9 -0
  27. data/lib/actv/asset_topic.rb +11 -0
  28. data/lib/actv/base.rb +148 -0
  29. data/lib/actv/channel.rb +13 -0
  30. data/lib/actv/client.rb +330 -0
  31. data/lib/actv/configurable.rb +39 -0
  32. data/lib/actv/default.rb +87 -0
  33. data/lib/actv/error.rb +32 -0
  34. data/lib/actv/error/bad_gateway.rb +11 -0
  35. data/lib/actv/error/bad_request.rb +10 -0
  36. data/lib/actv/error/client_error.rb +39 -0
  37. data/lib/actv/error/enhance_your_calm.rb +10 -0
  38. data/lib/actv/error/forbidden.rb +10 -0
  39. data/lib/actv/error/internal_server_error.rb +11 -0
  40. data/lib/actv/error/not_acceptable.rb +10 -0
  41. data/lib/actv/error/not_found.rb +10 -0
  42. data/lib/actv/error/server_error.rb +19 -0
  43. data/lib/actv/error/service_unavailable.rb +11 -0
  44. data/lib/actv/error/unauthorized.rb +10 -0
  45. data/lib/actv/event.rb +213 -0
  46. data/lib/actv/event_result.rb +8 -0
  47. data/lib/actv/event_search_results.rb +11 -0
  48. data/lib/actv/evergreen.rb +53 -0
  49. data/lib/actv/facet.rb +16 -0
  50. data/lib/actv/facet_term.rb +5 -0
  51. data/lib/actv/facet_value.rb +7 -0
  52. data/lib/actv/identity.rb +28 -0
  53. data/lib/actv/interest.rb +39 -0
  54. data/lib/actv/null_object.rb +19 -0
  55. data/lib/actv/phone_number.rb +9 -0
  56. data/lib/actv/place.rb +24 -0
  57. data/lib/actv/popular_interest.rb +18 -0
  58. data/lib/actv/popular_interest_search_results.rb +12 -0
  59. data/lib/actv/request/multipart_with_file.rb +37 -0
  60. data/lib/actv/response/parse_json.rb +29 -0
  61. data/lib/actv/response/raise_client_error.rb +21 -0
  62. data/lib/actv/response/raise_server_error.rb +18 -0
  63. data/lib/actv/search_results.rb +30 -0
  64. data/lib/actv/sub_event.rb +15 -0
  65. data/lib/actv/tag.rb +9 -0
  66. data/lib/actv/topic.rb +9 -0
  67. data/lib/actv/user.rb +38 -0
  68. data/lib/actv/version.rb +3 -0
  69. data/spec/actv/article_search_results_spec.rb +16 -0
  70. data/spec/actv/article_spec.rb +44 -0
  71. data/spec/actv/asset_channel_spec.rb +17 -0
  72. data/spec/actv/asset_description_spec.rb +17 -0
  73. data/spec/actv/asset_image_spec.rb +27 -0
  74. data/spec/actv/asset_price_spec.rb +23 -0
  75. data/spec/actv/asset_spec.rb +172 -0
  76. data/spec/actv/asset_status_spec.rb +24 -0
  77. data/spec/actv/base_spec.rb +51 -0
  78. data/spec/actv/client/articles_spec.rb +130 -0
  79. data/spec/actv/client/assets_spec.rb +87 -0
  80. data/spec/actv/client/event_results_spec.rb +35 -0
  81. data/spec/actv/client/events_spec.rb +99 -0
  82. data/spec/actv/client/search_spec.rb +58 -0
  83. data/spec/actv/client/system_health_spec.rb +16 -0
  84. data/spec/actv/client/users_spec.rb +31 -0
  85. data/spec/actv/client_spec.rb +140 -0
  86. data/spec/actv/event_spec.rb +331 -0
  87. data/spec/actv/evergreen_spec.rb +33 -0
  88. data/spec/actv/identifiable_spec.rb +31 -0
  89. data/spec/actv/null_object_spec.rb +24 -0
  90. data/spec/actv/place_spec.rb +25 -0
  91. data/spec/actv/search_results_spec.rb +44 -0
  92. data/spec/actv/user_spec.rb +25 -0
  93. data/spec/actv_spec.rb +60 -0
  94. data/spec/faraday/response_spec.rb +0 -0
  95. data/spec/fixtures/me.json +21 -0
  96. data/spec/fixtures/system_health.json +1 -0
  97. data/spec/fixtures/valid_article.json +187 -0
  98. data/spec/fixtures/valid_asset.json +185 -0
  99. data/spec/fixtures/valid_event.json +188 -0
  100. data/spec/fixtures/valid_event_results.json +23 -0
  101. data/spec/fixtures/valid_evergreen.json +1 -0
  102. data/spec/fixtures/valid_evergreen_child_1.json +1 -0
  103. data/spec/fixtures/valid_search.json +1282 -0
  104. data/spec/fixtures/valid_search_no_event_results.json +5 -0
  105. data/spec/fixtures/valid_search_no_results.json +9 -0
  106. data/spec/spec_helper.rb +15 -0
  107. data/spec/support/helper.rb +43 -0
  108. metadata +432 -0
@@ -0,0 +1,13 @@
1
+ require 'actv/channel'
2
+
3
+ module ACTV
4
+ class AssetChannel < Base
5
+
6
+ attr_reader :sequence
7
+
8
+ def channel
9
+ @channel ||= ACTV::Channel.new(@attrs[:channel]) unless @attrs[:channel].nil?
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ module ACTV
2
+ class AssetComponent < Base
3
+
4
+ attr_reader :assetGuid
5
+
6
+ alias asset_guid assetGuid
7
+ end
8
+ end
@@ -0,0 +1,15 @@
1
+ require 'actv/asset_description_type'
2
+
3
+ module ACTV
4
+ class AssetDescription < Base
5
+
6
+ attr_reader :description
7
+
8
+ def type
9
+ @description_type ||= ACTV::AssetDescriptionType.new(@attrs[:descriptionType]) unless @attrs[:descriptionType].nil?
10
+ end
11
+ alias description_type type
12
+ alias descriptionType type
13
+
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ require 'actv/identity'
2
+
3
+ module ACTV
4
+ class AssetDescriptionType < ACTV::Identity
5
+
6
+ attr_reader :descriptionTypeId, :descriptionTypeName
7
+
8
+ alias id descriptionTypeId
9
+ alias name descriptionTypeName
10
+
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ module ACTV
2
+ class AssetImage < Base
3
+
4
+ attr_reader :imageUrlAdr, :imageName, :imageCaptionTxt, :linkUrl, :linkTarget
5
+
6
+ alias url imageUrlAdr
7
+ alias name imageName
8
+ alias caption imageCaptionTxt
9
+ alias link linkUrl
10
+ alias target linkTarget
11
+
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ require 'actv/identity'
2
+
3
+ module ACTV
4
+ class AssetLegacyData < Base
5
+
6
+ attr_reader :assetTypeId, :typeName, :onlineRegistration, :seoUrl,
7
+ :substitutionUrl, :isSearchable, :createdDate, :modifiedDate
8
+
9
+ alias id assetTypeId
10
+ alias type_name typeName
11
+ alias online_registration? onlineRegistration
12
+ alias online_registration onlineRegistration
13
+ alias seo_url seoUrl
14
+ alias substitution_url substitutionUrl
15
+ alias is_searchable? isSearchable
16
+ alias created_at createdDate
17
+ alias updated_at modifiedDate
18
+
19
+ end
20
+ end
@@ -0,0 +1,11 @@
1
+ module ACTV
2
+ class AssetPrice < Base
3
+
4
+ attr_reader :effectiveDate, :priceAmt, :maxPriceAmt, :minPriceAmt
5
+
6
+ alias effective_date effectiveDate
7
+ alias amount priceAmt
8
+ alias max_amount maxPriceAmt
9
+ alias min_amount minPriceAmt
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ module ACTV
2
+ class AssetSeoUrl < Base
3
+ attr_reader :seoSystemName, :statusCode, :urlAdr
4
+ end
5
+ end
@@ -0,0 +1,17 @@
1
+ require 'actv/identity'
2
+
3
+ module ACTV
4
+ class AssetStatus < ACTV::Identity
5
+
6
+ attr_reader :assetStatusId, :assetStatusName, :isSearchable, :isDeleted,
7
+ :createdDate, :modifiedDate
8
+
9
+ alias id assetStatusId
10
+ alias name assetStatusName
11
+ alias is_searchable? isSearchable
12
+ alias is_deleted? isDeleted
13
+ alias created_at createdDate
14
+ alias updated_at modifiedDate
15
+
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ require 'actv/tag'
2
+
3
+ module ACTV
4
+ class AssetTag < Base
5
+ def tag
6
+ @tag ||= ACTV::Tag.new(@attrs[:tag]) unless @attrs[:tag].nil?
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ require 'actv/topic'
2
+
3
+ module ACTV
4
+ class AssetTopic < Base
5
+ attr_reader :sequence
6
+
7
+ def topic
8
+ @topic ||= ACTV::Topic.new(@attrs[:topic]) unless @attrs[:topic].nil?
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,148 @@
1
+ require 'forwardable'
2
+ require 'actv/null_object'
3
+ require 'uri'
4
+
5
+ module ACTV
6
+ class Base
7
+ extend Forwardable
8
+ attr_reader :attrs
9
+ alias body attrs
10
+ def_delegators :attrs, :delete, :update
11
+
12
+ # Define methods that retrieve the value from an initialized instance variable Hash, using the attribute as a key
13
+ #
14
+ # @overload self. attr_reader(attr)
15
+ # @param attr [Symbol]
16
+ # @overload self. attr_reader(attrs)
17
+ # @param attrs [Array<Symbol>]
18
+ def self.attr_reader(*attrs)
19
+ attrs.each do |attribute|
20
+ define_attribute_method(attribute)
21
+ define_predicate_method(attribute)
22
+ end
23
+ end
24
+
25
+ def self.object_attr_reader(klass, key1, key2=nil)
26
+ define_attribute_method(key1, kass, key2)
27
+ define_predicate_method(key1)
28
+ end
29
+
30
+ def self.uri_attr_reader(*attrs)
31
+ attrs.each do |uri_key|
32
+ array = uri_key.to_s.split("_")
33
+ index = array.index("uri")
34
+ array[index] = "url"
35
+ url_key = array.join("_").to_sym
36
+ define_uri_method(uri_key, url_key)
37
+ define_predicate_method(uri_key, url_key)
38
+
39
+ alias_method(url_key, uri_key)
40
+ alias_method("#{url_key}?", "#{uri_key}?")
41
+ end
42
+ end
43
+
44
+ def self.define_uri_method(key1, key2)
45
+ define_method(key1) do
46
+ memoize(key1) do
47
+ ::URI.parse(@attrs[key2]) if @attrs[key2]
48
+ end
49
+ end
50
+ end
51
+
52
+ def self.define_attribute_method(key1, klass=nil, key2=nil)
53
+ define_method(key1) do
54
+ memoize(key1) do
55
+ if klass.nil?
56
+ @attrs[key1]
57
+ else
58
+ if @attrs[key1]
59
+ if key2.nil?
60
+ ACTV.const_get(klass).new(@attrs[key1])
61
+ else
62
+ attrs = @attrs.dup
63
+ value = attrs.delete(key1)
64
+ ACTV.const_get(klass).new(value.update(key2 => attrs))
65
+ end
66
+ else
67
+ ACTV::NullObject.instance
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ def self.define_predicate_method(key1, key2=key1)
75
+ define_method(:"#{key1}?") do
76
+ !!@attrs[key2]
77
+ end
78
+ end
79
+
80
+ def self.from_response(response={})
81
+ new(response[:body])
82
+ end
83
+
84
+ def initialize(attrs={})
85
+ @attrs = attrs || {}
86
+ end
87
+
88
+ def [](method)
89
+ send(method)
90
+ rescue NoMethodError
91
+ nil
92
+ end
93
+
94
+ def memoize(key, &block)
95
+ ivar = :"@#{key}"
96
+ return instance_variable_get(ivar) if instance_variable_defined?(ivar)
97
+ result = block.call
98
+ instance_variable_set(ivar, result)
99
+ end
100
+
101
+ def method_missing(meth, *args, &block)
102
+ if @attrs && @attrs.has_key?(meth)
103
+ @attrs[meth]
104
+ elsif meth.to_s.include?('=') and !args.empty?
105
+ @attrs[meth[0..-2].to_sym] = args.first
106
+ else
107
+ super
108
+ end
109
+ end
110
+
111
+ def respond_to?(meth, *args)
112
+ if @attrs && @attrs.has_key?(meth)
113
+ true
114
+ else
115
+ super
116
+ end
117
+ end
118
+
119
+ # Creation of object hash when sending request to soap
120
+ def to_hash
121
+ hash = {}
122
+ hash["attrs"] = @attrs
123
+
124
+ self.instance_variables.keep_if { |key| key != :@attrs }.each do |var|
125
+ val = self.instance_variable_get(var)
126
+ hash["attrs"][var.to_s.delete("@").to_sym] = val.to_hash if val.is_a? ACTV::Base
127
+ end
128
+
129
+ hash["attrs"]
130
+ end
131
+
132
+ protected
133
+
134
+ # @param attr [Symbol]
135
+ # @param other [ACTV::Base]
136
+ # @return [Boolean]
137
+ def attr_equal(attr, other)
138
+ self.class == other.class && !other.send(attr).nil? && send(attr) == other.send(attr)
139
+ end
140
+
141
+ # @param other [ACTV::Base]
142
+ # @return [Boolean]
143
+ def attrs_equal(other)
144
+ self.class == other.class && !other.attrs.empty? && attrs == other.attrs
145
+ end
146
+
147
+ end
148
+ end
@@ -0,0 +1,13 @@
1
+ require 'actv/identity'
2
+
3
+ module ACTV
4
+ class Channel < ACTV::Identity
5
+
6
+ attr_reader :channelId, :channelName, :channelDsc
7
+
8
+ alias id channelId
9
+ alias name channelName
10
+ alias description channelDsc
11
+
12
+ end
13
+ end
@@ -0,0 +1,330 @@
1
+ require 'faraday'
2
+ require 'actv/article'
3
+ require 'actv/article_search_results'
4
+ require 'actv/asset'
5
+ require 'actv/configurable'
6
+ require 'actv/error/forbidden'
7
+ require 'actv/error/not_found'
8
+ require 'actv/event'
9
+ require 'actv/event_result'
10
+ require 'actv/evergreen'
11
+ require 'actv/sub_event'
12
+ require 'actv/search_results'
13
+ require 'actv/event_search_results'
14
+ require 'actv/popular_interest_search_results'
15
+ require 'actv/user'
16
+ require 'simple_oauth'
17
+
18
+ module ACTV
19
+ # Wrapper for the ACTV REST API
20
+ #
21
+ # @note
22
+ class Client
23
+ include ACTV::Configurable
24
+
25
+ attr_reader :oauth_token
26
+
27
+ # Initialized a new Client object
28
+ #
29
+ # @param options [Hash]
30
+ # @return[ACTV::Client]
31
+ def initialize(options={})
32
+ ACTV::Configurable.keys.each do |key|
33
+ instance_variable_set("@#{key}", options[key] || ACTV.options[key])
34
+ end
35
+ end
36
+
37
+ # Returns assets that match a specified query.
38
+ #
39
+ # @authentication_required No
40
+ # @param q [String] A search term.
41
+ # @param options [Hash] A customizable set of options.
42
+ # @return [ACTV::SearchResults] Return assets that match a specified query with search metadata
43
+ # @example Returns assets related to running
44
+ # ACTV.assets('running')
45
+ # ACTV.search('running')
46
+ def assets(q, params={})
47
+ response = get("/v2/search.json", params.merge(query: q))
48
+ ACTV::SearchResults.from_response(response)
49
+ end
50
+ alias search assets
51
+
52
+ # Returns an asset with the specified ID in an array
53
+ #
54
+ # @authentication_required No
55
+ # @return [ACTV::Asset] The requested asset.
56
+ # @param id [String] An assset ID.
57
+ # @param options [Hash] A customizable set of options.
58
+ # @example Return the asset with the id BA288960-2718-4B20-B380-8F939596B123
59
+ # ACTV.asset("BA288960-2718-4B20-B380-8F939596B123")
60
+ def asset(id, params={})
61
+ response = get("/v2/assets/#{id}.json", params)
62
+
63
+ if response[:body].is_a? Array
64
+ results = []
65
+ response[:body].each do |item|
66
+ results << ACTV::Asset.from_response({body: item})
67
+ end
68
+ results
69
+ else
70
+ [ACTV::Asset.from_response(response)]
71
+ end
72
+ end
73
+
74
+ # Returns an asset with the specified url path
75
+ #
76
+ # @authentication_required No
77
+ # @return [ACTV::Asset] The requested asset
78
+ # @param path [String]
79
+ # @example Return an asset with the url http://www.active.com/miami-fl/running/miami-marathon-and-half-marathon-2014
80
+ # ACTV.asset_by_path("http://www.active.com/miami-fl/running/miami-marathon-and-half-marathon-2014")
81
+ def find_asset_by_url(url)
82
+ url_md5 = Digest::MD5.hexdigest(url)
83
+ response = get("/v2/seourls/#{url_md5}?load_asset=true")
84
+
85
+ ACTV::Asset.from_response(response)
86
+ end
87
+
88
+ # Returns articles that match a specified query.
89
+ #
90
+ # @authentication_required No
91
+ # @param q [String] A search term.
92
+ # @param options [Hash] A customizable set of options.
93
+ # @return [ACTV::SearchResults] Return articles that match a specified query with search metadata
94
+ # @example Returns articles related to running
95
+ # ACTV.articles('running')
96
+ # ACTV.articles('running')
97
+ def articles(q, params={})
98
+ response = get("/v2/search.json", params.merge({query: q, category: 'articles'}))
99
+ ACTV::ArticleSearchResults.from_response(response)
100
+ end
101
+
102
+ # Returns an article with the specified ID
103
+ #
104
+ # @authentication_required No
105
+ # @return [ACTV::Article] The requested article.
106
+ # @param id [String] An article ID.
107
+ # @param options [Hash] A customizable set of options.
108
+ # @example Return the article with the id BA288960-2718-4B20-B380-8F939596B123
109
+ # ACTV.article("BA288960-2718-4B20-B380-8F939596B123")
110
+ def article(id)
111
+ response = get("/v2/assets/#{id}.json")
112
+ article = ACTV::Article.from_response(response)
113
+ article.is_article? ? article : nil
114
+ end
115
+
116
+ def events(q, params={})
117
+ response = get("/v2/search.json", params.merge({query: q, category: 'event'}))
118
+ ACTV::EventSearchResults.from_response(response)
119
+ end
120
+
121
+ def event(id)
122
+ response = get("/v2/assets/#{id}.json")
123
+ event = ACTV::Event.from_response(response)
124
+ event = ACTV::Evergreen.new(event) if event.evergreen?
125
+ event.is_article? ? nil : event
126
+ end
127
+
128
+ # Returns popular assets that match a specified query.
129
+ #
130
+ # @authentication_required No
131
+ # @param options [Hash] A customizable set of options.
132
+ # @return [ACTV::SearchResults] Return events that match a specified query with search metadata
133
+ # @example Returns articles related to running
134
+ # ACTV.popular_events()
135
+ # ACTV.popular_events("topic:running")
136
+ def popular_events(params={})
137
+ response = get("/v2/events/popular", params)
138
+ ACTV::SearchResults.from_response(response)
139
+ end
140
+
141
+ # Returns upcoming assets that match a specified query.
142
+ #
143
+ # @authentication_required No
144
+ # @param options [Hash] A customizable set of options.
145
+ # @return [ACTV::SearchResults] Return events that match a specified query with search metadata
146
+ # @example Returns articles related to running
147
+ # ACTV.upcoming_events()
148
+ # ACTV.upcoming_events("topic:running")
149
+ def upcoming_events(params={})
150
+ response = get("/v2/events/upcoming", params)
151
+ ACTV::SearchResults.from_response(response)
152
+ end
153
+
154
+ # Returns popular assets that match a specified query.
155
+ #
156
+ # @authentication_required No
157
+ # @param options [Hash] A customizable set of options.
158
+ # @return [ACTV::SearchResults] Return events that match a specified query with search metadata
159
+ # @example Returns articles related to running
160
+ # ACTV.popular_articles()
161
+ # ACTV.popular_articles("topic:running")
162
+ def popular_articles(params={})
163
+ response = get("/v2/articles/popular", params)
164
+ ACTV::ArticleSearchResults.from_response(response)
165
+ end
166
+
167
+ # Returns popular interests
168
+ #
169
+ # @authentication_required No
170
+ # @param options [Hash] A customizable set of options.
171
+ # @return [ACTV::PopularInterestSearchResults] Return intersts
172
+ # @example Returns most popular interests
173
+ # ACTV.popular_interests()
174
+ # ACTV.popular_interests({per_page: 8})
175
+ def popular_interests(params={}, options={})
176
+ response = get("/interest/_search", params, options)
177
+ ACTV::PopularInterestSearchResults.from_response(response)
178
+ end
179
+
180
+ # Returns popular searches
181
+ #
182
+ # @authentication_required No
183
+ # @param options [Hash] A customizable set of options.
184
+ # @return [ACTV::PopularSearchSearchResults] Return searches
185
+ # @example Returns most popular searches
186
+ # ACTV.popular_searches()
187
+ # ACTV.popular_searches({per_page: 8})
188
+ def popular_searches(options={})
189
+ #response = get("/v2/articles/popular", params)
190
+ #ACTV::ArticleSearchResults.from_response(response)
191
+ ["Couch to 5k","Kids' Camps","Swimming Classes","Half Marathons in Southern CA","Gyms in Solana Beach","Dignissim Qui Blandit","Dolore Te Feugait","Lorem Ipsum","Convnetio Ibidem","Aliquam Jugis"]
192
+ end
193
+
194
+ # Returns a result with the specified asset ID and asset type ID
195
+ #
196
+ # @authentication_required No
197
+ # @return [ACTV::EventResult] The requested event result.
198
+ # @param assetId [String] An asset ID.
199
+ # @param assetTypeId [String] An asset type ID.
200
+ # @example Return the result with the assetId 286F5731-9800-4C6E-ADD5-0E3B72392CA7 and assetTypeId 3BF82BBE-CF88-4E8C-A56F-78F5CE87E4C6
201
+ # ACTV.event_results("286F5731-9800-4C6E-ADD5-0E3B72392CA7","3BF82BBE-CF88-4E8C-A56F-78F5CE87E4C6")
202
+ def event_results(assetId, assetTypeId, options={})
203
+ begin
204
+ response = get("/api/v1/events/#{assetId}/#{assetTypeId}.json", {}, options)
205
+ ACTV::EventResult.from_response(response)
206
+ rescue
207
+ nil
208
+ end
209
+ end
210
+
211
+ # Returns the currently logged in user
212
+ #
213
+ # @authentication_required Yes
214
+ # @return [ACTV::User] The requested current user.
215
+ # @param options [Hash] A customizable set of options.
216
+ # @example Return current_user if authentication was susccessful
217
+ # ACTV.me
218
+ def me(params={})
219
+ response = get("/v2/me.json", params)
220
+ user = ACTV::User.from_response(response)
221
+ user.access_token = @oauth_token
222
+ user
223
+ end
224
+
225
+ def update_me(user, params={})
226
+ response = put("/v2/me.json", params.merge(user))
227
+ user = ACTV::User.from_response(response)
228
+ user.access_token = @oauth_token
229
+ user
230
+ end
231
+
232
+ def user_name_exists?(user_name, params={})
233
+ get("/v2/users/user_name/#{user_name}", params)[:body][:exists]
234
+ end
235
+
236
+ def display_name_exists?(display_name, params={})
237
+ get("/v2/users/display_name/#{URI.escape(display_name)}", params)[:body][:exists]
238
+ end
239
+
240
+ def is_advantage_member?(options={})
241
+ get("/v2/me/is_advantage_member", options)[:body][:is_advantage_member]
242
+ end
243
+
244
+ def avatar_url(options={})
245
+ get("/v2/me/avatar_url", options)[:body][:avatar_url]
246
+ end
247
+
248
+ # Perform an HTTP GET request
249
+ def get(path, params={}, options={})
250
+ request(:get, path, params, options)
251
+ end
252
+
253
+ # Perform an HTTP POST request
254
+ def post(path, params={}, options={})
255
+ request(:post, path, params, options)
256
+ end
257
+
258
+ # Perform an HTTP UPDATE request
259
+ def put(path, params={}, options={})
260
+ request(:put, path, params, options)
261
+ end
262
+
263
+ # Perform an HTTP DELETE request
264
+ def delete(path, params={}, options={})
265
+ request(:delete, path, params, options)
266
+ end
267
+
268
+ # Returns a Faraday::Connection object
269
+ #
270
+ # @return [Faraday::Connection]
271
+ def connection
272
+ @connection ||= Faraday.new(@endpoint, @connection_options.merge(:builder => @middleware))
273
+ end
274
+
275
+ # Perform an HTTP Request
276
+ def request(method, path, params, options)
277
+ uri = options[:endpoint] || @endpoint
278
+ uri = URI(uri) unless uri.respond_to?(:host)
279
+ uri += path
280
+ request_headers = {}
281
+ params[:api_key] = @api_key unless @api_key.nil?
282
+
283
+ if self.credentials?
284
+ # When posting a file, don't sign any params
285
+ signature_params = if [:post, :put].include?(method.to_sym) && params.values.any?{|value| value.is_a?(File) || (value.is_a?(Hash) && (value[:io].is_a?(IO) || value[:io].is_a?(StringIO)))}
286
+ {}
287
+ else
288
+ params
289
+ end
290
+ authorization = SimpleOAuth::Header.new(method, uri, signature_params, credentials)
291
+ request_headers[:authorization] = authorization.to_s.sub('OAuth', "Bearer")
292
+ end
293
+ connection.url_prefix = options[:endpoint] || @endpoint
294
+ connection.run_request(method.to_sym, path, nil, request_headers) do |request|
295
+ unless params.empty?
296
+ case request.method
297
+ when :post, :put
298
+ request.body = params
299
+ else
300
+ request.params.update(params)
301
+ end
302
+ end
303
+ yield request if block_given?
304
+ end.env
305
+ rescue Faraday::Error::ClientError
306
+ raise ACTV::Error::ClientError
307
+ end
308
+ # Check whether credentials are present
309
+ #
310
+ # @return [Boolean]
311
+ def credentials?
312
+ credentials.values.all?
313
+ end
314
+
315
+ private
316
+
317
+ # Credentials hash
318
+ #
319
+ # @return [Hash]
320
+ def credentials
321
+ {
322
+ # :consumer_key => @consumer_key,
323
+ # :consumer_secret => @consumer_secret,
324
+ :token => @oauth_token
325
+ # :token_secret => @oauth_token_secret,
326
+ }
327
+ end
328
+
329
+ end
330
+ end