actv 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +30 -0
- data/.rspec +2 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +64 -0
- data/Gemfile +4 -0
- data/Guardfile +20 -0
- data/LICENSE +22 -0
- data/README.md +63 -0
- data/Rakefile +17 -0
- data/actv.gemspec +34 -0
- data/lib/actv.rb +48 -0
- data/lib/actv/address.rb +9 -0
- data/lib/actv/article.rb +89 -0
- data/lib/actv/article_search_results.rb +15 -0
- data/lib/actv/asset.rb +186 -0
- data/lib/actv/asset_channel.rb +13 -0
- data/lib/actv/asset_component.rb +8 -0
- data/lib/actv/asset_description.rb +15 -0
- data/lib/actv/asset_description_type.rb +12 -0
- data/lib/actv/asset_image.rb +13 -0
- data/lib/actv/asset_legacy_data.rb +20 -0
- data/lib/actv/asset_price.rb +11 -0
- data/lib/actv/asset_seo_url.rb +5 -0
- data/lib/actv/asset_status.rb +17 -0
- data/lib/actv/asset_tag.rb +9 -0
- data/lib/actv/asset_topic.rb +11 -0
- data/lib/actv/base.rb +148 -0
- data/lib/actv/channel.rb +13 -0
- data/lib/actv/client.rb +330 -0
- data/lib/actv/configurable.rb +39 -0
- data/lib/actv/default.rb +87 -0
- data/lib/actv/error.rb +32 -0
- data/lib/actv/error/bad_gateway.rb +11 -0
- data/lib/actv/error/bad_request.rb +10 -0
- data/lib/actv/error/client_error.rb +39 -0
- data/lib/actv/error/enhance_your_calm.rb +10 -0
- data/lib/actv/error/forbidden.rb +10 -0
- data/lib/actv/error/internal_server_error.rb +11 -0
- data/lib/actv/error/not_acceptable.rb +10 -0
- data/lib/actv/error/not_found.rb +10 -0
- data/lib/actv/error/server_error.rb +19 -0
- data/lib/actv/error/service_unavailable.rb +11 -0
- data/lib/actv/error/unauthorized.rb +10 -0
- data/lib/actv/event.rb +213 -0
- data/lib/actv/event_result.rb +8 -0
- data/lib/actv/event_search_results.rb +11 -0
- data/lib/actv/evergreen.rb +53 -0
- data/lib/actv/facet.rb +16 -0
- data/lib/actv/facet_term.rb +5 -0
- data/lib/actv/facet_value.rb +7 -0
- data/lib/actv/identity.rb +28 -0
- data/lib/actv/interest.rb +39 -0
- data/lib/actv/null_object.rb +19 -0
- data/lib/actv/phone_number.rb +9 -0
- data/lib/actv/place.rb +24 -0
- data/lib/actv/popular_interest.rb +18 -0
- data/lib/actv/popular_interest_search_results.rb +12 -0
- data/lib/actv/request/multipart_with_file.rb +37 -0
- data/lib/actv/response/parse_json.rb +29 -0
- data/lib/actv/response/raise_client_error.rb +21 -0
- data/lib/actv/response/raise_server_error.rb +18 -0
- data/lib/actv/search_results.rb +30 -0
- data/lib/actv/sub_event.rb +15 -0
- data/lib/actv/tag.rb +9 -0
- data/lib/actv/topic.rb +9 -0
- data/lib/actv/user.rb +38 -0
- data/lib/actv/version.rb +3 -0
- data/spec/actv/article_search_results_spec.rb +16 -0
- data/spec/actv/article_spec.rb +44 -0
- data/spec/actv/asset_channel_spec.rb +17 -0
- data/spec/actv/asset_description_spec.rb +17 -0
- data/spec/actv/asset_image_spec.rb +27 -0
- data/spec/actv/asset_price_spec.rb +23 -0
- data/spec/actv/asset_spec.rb +172 -0
- data/spec/actv/asset_status_spec.rb +24 -0
- data/spec/actv/base_spec.rb +51 -0
- data/spec/actv/client/articles_spec.rb +130 -0
- data/spec/actv/client/assets_spec.rb +87 -0
- data/spec/actv/client/event_results_spec.rb +35 -0
- data/spec/actv/client/events_spec.rb +99 -0
- data/spec/actv/client/search_spec.rb +58 -0
- data/spec/actv/client/system_health_spec.rb +16 -0
- data/spec/actv/client/users_spec.rb +31 -0
- data/spec/actv/client_spec.rb +140 -0
- data/spec/actv/event_spec.rb +331 -0
- data/spec/actv/evergreen_spec.rb +33 -0
- data/spec/actv/identifiable_spec.rb +31 -0
- data/spec/actv/null_object_spec.rb +24 -0
- data/spec/actv/place_spec.rb +25 -0
- data/spec/actv/search_results_spec.rb +44 -0
- data/spec/actv/user_spec.rb +25 -0
- data/spec/actv_spec.rb +60 -0
- data/spec/faraday/response_spec.rb +0 -0
- data/spec/fixtures/me.json +21 -0
- data/spec/fixtures/system_health.json +1 -0
- data/spec/fixtures/valid_article.json +187 -0
- data/spec/fixtures/valid_asset.json +185 -0
- data/spec/fixtures/valid_event.json +188 -0
- data/spec/fixtures/valid_event_results.json +23 -0
- data/spec/fixtures/valid_evergreen.json +1 -0
- data/spec/fixtures/valid_evergreen_child_1.json +1 -0
- data/spec/fixtures/valid_search.json +1282 -0
- data/spec/fixtures/valid_search_no_event_results.json +5 -0
- data/spec/fixtures/valid_search_no_results.json +9 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/support/helper.rb +43 -0
- metadata +432 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
require 'delegate'
|
|
2
|
+
|
|
3
|
+
module ACTV
|
|
4
|
+
class Evergreen < ::SimpleDelegator
|
|
5
|
+
attr_accessor :asset, :current_event, :events
|
|
6
|
+
|
|
7
|
+
def initialize asset
|
|
8
|
+
super asset
|
|
9
|
+
@asset = asset
|
|
10
|
+
@events = []
|
|
11
|
+
@current_event = {}
|
|
12
|
+
asset.evergreenAssets.each do |sub_asset|
|
|
13
|
+
@events << SubEvent.new(sub_asset)
|
|
14
|
+
@current_event = sub_asset if Time.parse(sub_asset.fetch(:activityEndDate, "1970-01-01T00:00:01")) > Time.parse(@current_event.fetch(:activityEndDate, "1970-01-01T00:00:01"))
|
|
15
|
+
end
|
|
16
|
+
@events = @events.sort_by { |event| event.end_date }.reverse
|
|
17
|
+
@current_event = ACTV.event @current_event[:assetGuid]
|
|
18
|
+
|
|
19
|
+
self
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def evergreen?
|
|
23
|
+
true
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def components
|
|
27
|
+
@current_event.components
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def legacy_data
|
|
31
|
+
@current_event.legacy_data
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def description_by_type type
|
|
35
|
+
asset_description = @asset.description_by_type type rescue nil
|
|
36
|
+
|
|
37
|
+
if asset_description.present?
|
|
38
|
+
asset_description
|
|
39
|
+
else
|
|
40
|
+
@current_event.description_by_type type
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def method_missing method, *args, &block
|
|
45
|
+
begin
|
|
46
|
+
@asset.send(method, *args)
|
|
47
|
+
rescue NoMethodError => e
|
|
48
|
+
@current_event.send(method, *args)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
data/lib/actv/facet.rb
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require 'actv/base'
|
|
2
|
+
|
|
3
|
+
module ACTV
|
|
4
|
+
class Identity < ACTV::Base
|
|
5
|
+
|
|
6
|
+
# Initializes a new object
|
|
7
|
+
#
|
|
8
|
+
# @param attrs [Hash]
|
|
9
|
+
# @raise [ArgumentError] Error raised when supplied argument is missing an :id key.
|
|
10
|
+
# @return [ACTV::Base]
|
|
11
|
+
def initialize(attrs={})
|
|
12
|
+
super
|
|
13
|
+
raise ArgumentError, 'argument must have an :id key' unless id
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# @param other [ACTV::Identity]
|
|
17
|
+
# @return [Boolean]
|
|
18
|
+
def ==(other)
|
|
19
|
+
super || attr_equal(:id, other) || attrs_equal(other)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# @return [Integer]
|
|
23
|
+
def id
|
|
24
|
+
@attrs[:id]
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require 'actv/identity'
|
|
2
|
+
require 'actv/asset_tag'
|
|
3
|
+
require 'actv/asset_topic'
|
|
4
|
+
|
|
5
|
+
module ACTV
|
|
6
|
+
class Interest < ACTV::Identity
|
|
7
|
+
|
|
8
|
+
attr_reader :interestGuid, :interestName, :urlAdr, :imgUrlAdr, :sorCreatedBy, :sorModifiedBy, :createdDate,
|
|
9
|
+
:modifiedDate, :interestTags, :interestAttributes, :interestTopics, :assetServiceHostName
|
|
10
|
+
|
|
11
|
+
alias id interestGuid
|
|
12
|
+
alias name interestName
|
|
13
|
+
alias url urlAdr
|
|
14
|
+
alias image_url imgUrlAdr
|
|
15
|
+
alias created_by sorCreatedBy
|
|
16
|
+
alias modified_by sorModifiedBy
|
|
17
|
+
alias created_date createdDate
|
|
18
|
+
alias modified_date modifiedDate
|
|
19
|
+
alias attributes interestAttributes
|
|
20
|
+
alias asset_service_host_name assetServiceHostName
|
|
21
|
+
|
|
22
|
+
def tags
|
|
23
|
+
@asset_tags ||= Array(@attrs[:interestTags]).map do |tag|
|
|
24
|
+
ACTV::AssetTag.new(tag)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
alias interest_tags tags
|
|
28
|
+
alias interestTags tags
|
|
29
|
+
|
|
30
|
+
def topics
|
|
31
|
+
@asset_topics ||= Array(@attrs[:interestTopics]).map do |topic|
|
|
32
|
+
ACTV::AssetTopic.new(topic)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
alias interest_topics topics
|
|
36
|
+
alias interestTopics topics
|
|
37
|
+
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'singleton'
|
|
2
|
+
|
|
3
|
+
module ACTV
|
|
4
|
+
class NullObject
|
|
5
|
+
include Singleton
|
|
6
|
+
|
|
7
|
+
def nil?
|
|
8
|
+
true
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def method_missing(*args, &block)
|
|
12
|
+
self
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def respond_to_missing?(method_name, include_private=false)
|
|
16
|
+
true
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
data/lib/actv/place.rb
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require 'actv/identity'
|
|
2
|
+
|
|
3
|
+
module ACTV
|
|
4
|
+
class Place < ACTV::Identity
|
|
5
|
+
|
|
6
|
+
attr_reader :placeGuid, :placeName, :placeDsc, :placeUrlAdr, :addressLine1Txt, :addressLine2Txt, :cityName,
|
|
7
|
+
:stateProvinceCode, :localityName, :postalCode, :countryName, :countryCode, :latitude, :longitude,
|
|
8
|
+
:directionsTxt
|
|
9
|
+
|
|
10
|
+
alias id placeGuid
|
|
11
|
+
alias name placeName
|
|
12
|
+
alias description placeDsc
|
|
13
|
+
alias url placeUrlAdr
|
|
14
|
+
alias address1 addressLine1Txt
|
|
15
|
+
alias address2 addressLine2Txt
|
|
16
|
+
alias city cityName
|
|
17
|
+
alias state stateProvinceCode
|
|
18
|
+
alias locality localityName
|
|
19
|
+
alias postal_code postalCode
|
|
20
|
+
alias country countryName
|
|
21
|
+
alias country_code countryCode
|
|
22
|
+
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'actv/identity'
|
|
2
|
+
require 'actv/interest'
|
|
3
|
+
|
|
4
|
+
module ACTV
|
|
5
|
+
class PopularInterest < ACTV::Identity
|
|
6
|
+
|
|
7
|
+
attr_reader :_index, :_type, :_id, :_version, :exists, :_source
|
|
8
|
+
|
|
9
|
+
alias index _index
|
|
10
|
+
alias type _type
|
|
11
|
+
alias id _id
|
|
12
|
+
alias version _version
|
|
13
|
+
|
|
14
|
+
def interest
|
|
15
|
+
@interest ||= ACTV::Interest.new(@attrs[:_source][:interest]) unless @attrs[:_source].nil? || @attrs[:_source][:interest].nil?
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require 'actv/search_results'
|
|
2
|
+
require 'actv/popular_interest'
|
|
3
|
+
|
|
4
|
+
module ACTV
|
|
5
|
+
class PopularInterestSearchResults < ACTV::SearchResults
|
|
6
|
+
def results
|
|
7
|
+
@results ||= Array(@attrs[:hits][:hits]).map do |article|
|
|
8
|
+
ACTV::PopularInterest.new(article)
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
require 'faraday'
|
|
2
|
+
|
|
3
|
+
module ACTV
|
|
4
|
+
module Request
|
|
5
|
+
class MultipartWithFile < Faraday::Middleware
|
|
6
|
+
|
|
7
|
+
def call(env)
|
|
8
|
+
if env[:body].is_a?(Hash)
|
|
9
|
+
env[:body].each do |key, value|
|
|
10
|
+
if value.is_a?(File)
|
|
11
|
+
env[:body][key] = Faraday::UploadIO.new(value, mime_type(value.path), value.path)
|
|
12
|
+
elsif value.is_a?(Hash) && (value[:io].is_a?(IO) || value[:io].is_a?(StringIO))
|
|
13
|
+
env[:body][key] = Faraday::UploadIO.new(value[:io], mime_type('.' + value[:type]), '')
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
@app.call(env)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
def mime_type(path)
|
|
23
|
+
case path
|
|
24
|
+
when /\.jpe?g/i
|
|
25
|
+
'image/jpeg'
|
|
26
|
+
when /\.gif$/i
|
|
27
|
+
'image/gif'
|
|
28
|
+
when /\.png$/i
|
|
29
|
+
'image/png'
|
|
30
|
+
else
|
|
31
|
+
'application/octet-stream'
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require 'faraday'
|
|
2
|
+
require 'multi_json'
|
|
3
|
+
|
|
4
|
+
module ACTV
|
|
5
|
+
module Response
|
|
6
|
+
class ParseJson < Faraday::Response::Middleware
|
|
7
|
+
|
|
8
|
+
def parse(body)
|
|
9
|
+
case body
|
|
10
|
+
when ''
|
|
11
|
+
nil
|
|
12
|
+
when 'true'
|
|
13
|
+
true
|
|
14
|
+
when 'false'
|
|
15
|
+
false
|
|
16
|
+
else
|
|
17
|
+
MultiJson.load(body, :symbolize_keys => true)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def on_complete(env)
|
|
22
|
+
if respond_to?(:parse)
|
|
23
|
+
env[:body] = parse(env[:body]) unless [204, 304].include?(env[:status])
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
require 'faraday'
|
|
2
|
+
require 'actv/error/bad_request'
|
|
3
|
+
require 'actv/error/enhance_your_calm'
|
|
4
|
+
require 'actv/error/forbidden'
|
|
5
|
+
require 'actv/error/not_acceptable'
|
|
6
|
+
require 'actv/error/not_found'
|
|
7
|
+
require 'actv/error/unauthorized'
|
|
8
|
+
|
|
9
|
+
module ACTV
|
|
10
|
+
module Response
|
|
11
|
+
class RaiseClientError < Faraday::Response::Middleware
|
|
12
|
+
|
|
13
|
+
def on_complete(env)
|
|
14
|
+
status_code = env[:status].to_i
|
|
15
|
+
error_class = ACTV::Error::ClientError.errors[status_code]
|
|
16
|
+
raise error_class.from_response_body(env[:body]) if error_class
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'faraday'
|
|
2
|
+
require 'actv/error/bad_gateway'
|
|
3
|
+
require 'actv/error/internal_server_error'
|
|
4
|
+
require 'actv/error/service_unavailable'
|
|
5
|
+
|
|
6
|
+
module ACTV
|
|
7
|
+
module Response
|
|
8
|
+
class RaiseServerError < Faraday::Response::Middleware
|
|
9
|
+
|
|
10
|
+
def on_complete(env)
|
|
11
|
+
status_code = env[:status].to_i
|
|
12
|
+
error_class = ACTV::Error::ServerError.errors[status_code]
|
|
13
|
+
raise error_class.new if error_class
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require 'actv/base'
|
|
2
|
+
require 'actv/facet'
|
|
3
|
+
require 'actv/facet_value'
|
|
4
|
+
|
|
5
|
+
module ACTV
|
|
6
|
+
class SearchResults < ACTV::Base
|
|
7
|
+
attr_reader :items_per_page, :start_index, :total_results
|
|
8
|
+
|
|
9
|
+
# @return [Array<ACTV::Asset>]
|
|
10
|
+
def results
|
|
11
|
+
@results ||= Array(@attrs[:results]).map do |asset|
|
|
12
|
+
ACTV::Asset.new(asset)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# @return [Array<ACTV::Facet>]
|
|
17
|
+
def facets
|
|
18
|
+
@facets ||= Array(@attrs[:facets]).map do |facet|
|
|
19
|
+
ACTV::Facet.new(facet)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# @return [Array<ACTV::FacetValue>]
|
|
24
|
+
def facet_values
|
|
25
|
+
@facet_values ||= Array(@attrs[:facet_values]).map do |facet_value|
|
|
26
|
+
ACTV::FacetValue.new(facet_value)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module ACTV
|
|
2
|
+
class SubEvent
|
|
3
|
+
attr_accessor :id, :name, :start_date, :end_date, :url
|
|
4
|
+
|
|
5
|
+
def initialize hsh
|
|
6
|
+
@id = hsh[:assetGuid]
|
|
7
|
+
@name = hsh[:assetName]
|
|
8
|
+
@start_date = Time.parse(hsh.fetch(:activityStartDate, "1970-01-01T00:00:00"))
|
|
9
|
+
@end_date = Time.parse(hsh.fetch(:activityEndDate, "1970-01-01T00:00:00"))
|
|
10
|
+
url = hsh.fetch(:assetSeoUrls, []).first || {}
|
|
11
|
+
@url = url.fetch :urlAdr, "http://www.active.com/asset_service/#{@id}"
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
data/lib/actv/tag.rb
ADDED