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,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