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.
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,8 @@
1
+ module ACTV
2
+ class EventResult < Base
3
+
4
+ attr_reader :id, :title, :date, :asset_type_id, :asset_id, :event_type, :latitude, :longitude,
5
+ :address, :url, :user, :sub_events
6
+
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ require 'actv/search_results'
2
+
3
+ module ACTV
4
+ class EventSearchResults < ACTV::SearchResults
5
+ def results
6
+ @results ||= Array(@attrs[:results]).map do |article|
7
+ ACTV::Event.new(article)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -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
+
@@ -0,0 +1,16 @@
1
+ require 'actv/base'
2
+ require 'actv/facet_term'
3
+
4
+ module ACTV
5
+ class Facet < ACTV::Base
6
+ attr_reader :name
7
+
8
+ def terms
9
+ @terms ||= Array(@attrs[:terms]).map do |term|
10
+ ACTV::FacetTerm.new(term)
11
+ end
12
+ end
13
+
14
+ end
15
+
16
+ end
@@ -0,0 +1,5 @@
1
+ module ACTV
2
+ class FacetTerm < ACTV::Base
3
+ attr_reader :term, :count
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ require 'actv/base'
2
+
3
+ module ACTV
4
+ class FacetValue < ACTV::Base
5
+ attr_reader :name, :value, :count
6
+ end
7
+ end
@@ -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
@@ -0,0 +1,9 @@
1
+ require 'actv/identity'
2
+
3
+ module ACTV
4
+ class PhoneNumber < ACTV::Base
5
+
6
+ attr_reader :number, :sms_capable, :status, :verified, :id
7
+
8
+ end
9
+ end
@@ -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
+
@@ -0,0 +1,9 @@
1
+ module ACTV
2
+ class Tag < ACTV::Identity
3
+ attr_reader :tagId, :tagName, :tagDescription
4
+
5
+ alias id tagId
6
+ alias name tagName
7
+ alias description tagDescription
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module ACTV
2
+ class Topic < Base
3
+ attr_reader :topicId, :topicName, :topicTaxonomy
4
+
5
+ alias id topicId
6
+ alias name topicName
7
+ alias taxonomy topicTaxonomy
8
+ end
9
+ end