access 1.1.7 → 2.0.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 (83) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +2 -0
  4. data/.travis.yml +12 -0
  5. data/Guardfile +7 -0
  6. data/README.md +159 -23
  7. data/Rakefile +13 -0
  8. data/access.gemspec +6 -1
  9. data/bin/console +14 -0
  10. data/bin/setup +7 -0
  11. data/lib/access.rb +21 -10
  12. data/lib/access/api.rb +188 -64
  13. data/lib/access/autocomplete.rb +11 -0
  14. data/lib/access/campaign.rb +24 -0
  15. data/lib/access/category.rb +16 -2
  16. data/lib/access/channel.rb +24 -0
  17. data/lib/access/city_savings.rb +16 -0
  18. data/lib/access/config.rb +8 -7
  19. data/lib/access/error.rb +8 -2
  20. data/lib/access/filter.rb +30 -2
  21. data/lib/access/info.rb +13 -0
  22. data/lib/access/link.rb +17 -0
  23. data/lib/access/location.rb +17 -2
  24. data/lib/access/member.rb +11 -0
  25. data/lib/access/oauth_application.rb +31 -0
  26. data/lib/access/offer.rb +24 -20
  27. data/lib/access/redeem.rb +11 -4
  28. data/lib/access/report.rb +10 -0
  29. data/lib/access/request.rb +25 -20
  30. data/lib/access/response.rb +127 -0
  31. data/lib/access/spot.rb +28 -0
  32. data/lib/access/store.rb +16 -2
  33. data/lib/access/token.rb +18 -0
  34. data/lib/access/verify.rb +11 -2
  35. data/lib/access/version.rb +1 -1
  36. data/test/access/autocomplete_test.rb +53 -0
  37. data/test/access/category_test.rb +64 -0
  38. data/test/access/city_savings_test.rb +5 -0
  39. data/test/access/filter_test.rb +40 -0
  40. data/test/access/location_test.rb +59 -0
  41. data/test/access/member_test.rb +5 -0
  42. data/test/access/oauth_application_test.rb +91 -0
  43. data/test/access/offer_test.rb +71 -0
  44. data/test/access/redeem_test.rb +38 -0
  45. data/test/access/report_test.rb +36 -0
  46. data/test/access/store_test.rb +65 -0
  47. data/test/access/token_test.rb +35 -0
  48. data/test/access/verify_test.rb +29 -0
  49. data/test/access/version_test.rb +9 -0
  50. data/test/fixtures/autocomplete_search.yml +207 -0
  51. data/test/fixtures/autocomplete_search_categories.yml +181 -0
  52. data/test/fixtures/autocomplete_search_locations.yml +173 -0
  53. data/test/fixtures/autocomplete_search_offers.yml +181 -0
  54. data/test/fixtures/autocomplete_search_stores.yml +185 -0
  55. data/test/fixtures/category_find.yml +303 -0
  56. data/test/fixtures/category_search.yml +683 -0
  57. data/test/fixtures/category_search_fail_member_key.yml +102 -0
  58. data/test/fixtures/filter_find.yml +70 -0
  59. data/test/fixtures/filter_search.yml +195 -0
  60. data/test/fixtures/location_find.yml +923 -0
  61. data/test/fixtures/location_search.yml +378 -0
  62. data/test/fixtures/location_search_fail_member_key.yml +367 -0
  63. data/test/fixtures/national_stores.yml +4135 -0
  64. data/test/fixtures/oauth_application_find.yml +163 -0
  65. data/test/fixtures/oauth_application_search.yml +134 -0
  66. data/test/fixtures/oauth_application_search_fail_member_key.yml +268 -0
  67. data/test/fixtures/oauth_application_token_find.yml +249 -0
  68. data/test/fixtures/oauth_application_token_search.yml +98 -0
  69. data/test/fixtures/offer_find.yml +683 -0
  70. data/test/fixtures/offer_search.yml +329 -0
  71. data/test/fixtures/offer_search_fail_member_key.yml +102 -0
  72. data/test/fixtures/redeem_offer_no_redeem_type.yml +423 -0
  73. data/test/fixtures/store_find.yml +333 -0
  74. data/test/fixtures/store_search.yml +227 -0
  75. data/test/fixtures/store_search_fail_member_key.yml +102 -0
  76. data/test/fixtures/subcategory_find.yml +283 -0
  77. data/test/fixtures/token_find.yml +245 -0
  78. data/test/fixtures/token_search.yml +301 -0
  79. data/test/fixtures/verify_filter.yml +290 -0
  80. data/test/fixtures/verify_token.yml +78 -0
  81. data/test/test_helper.rb +15 -0
  82. metadata +183 -11
  83. data/test/offers/offer_test.rb +0 -5
@@ -1,39 +1,44 @@
1
1
  module Access
2
2
  class Request
3
3
  include HTTParty
4
- # debug_output $stdout # enable this to log all the requests
5
4
 
6
-
7
- def get(path, api_type, options={})
8
- set_format
9
- results = self.class.get(set_base(api_type) + path, headers: headers, query: options)
10
- handle_results(results)
5
+ def get(path, api_type, options={}, &block)
6
+ url = set_base(api_type, path)
7
+ results = self.class.get(url, headers: headers(options[:access_token]), query: options)
8
+ if should_return_json?(options[:return_json])
9
+ hashify_results?(options[:hashify]) ? results.hashify : results
10
+ else
11
+ block.call results
12
+ end
11
13
  end
12
14
 
13
- def get_json(path, api_type, options={})
14
- set_format
15
- results = self.class.get(set_base(api_type) + path, headers: headers.merge({ 'Content-Type' => 'application/json', 'Accept' => 'application/json'}), body: options)
16
- handle_results(results)
15
+ def get_for_filter(path, api_type, filter, options={}, &block)
16
+ url = set_base(api_type, path)
17
+ results = self.class.get(url, headers: headers(options[:access_token]), body: filter)
18
+ if should_return_json?(options[:return_json])
19
+ hashify_results?(options[:hashify]) ? results.hashify : results
20
+ else
21
+ block.call results
22
+ end
17
23
  end
18
24
 
19
25
  private
20
26
 
21
- def handle_results(results)
22
- Access.config.hashify == "true" ? results.hashify : results
27
+ def set_base(api_type, path)
28
+ "https://#{ api_type }#{ Access::Config::DOMAINS[Access.config.api_environment] }.adcrws.com/v1#{path}"
23
29
  end
24
30
 
25
- def set_base(api_type)
26
- "https://#{ api_type }#{ Access::Config::DOMAINS[Access.config.api_environment] }.adcrws.com/#{Access.config.api_version}"
31
+ def headers(token_param)
32
+ raise Access::Error::NoAccessToken if (access_token = token_param || Access.config.access_token).nil?
33
+ {"Access-Token" => access_token, 'Content-Type' => 'application/json', 'Accept' => 'application/json'}
27
34
  end
28
35
 
29
- def set_format
30
- raise Access::Error::InvalidResponseFormat unless [:json, :xml].include?(Access.config.format.to_sym)
31
- self.class.format Access.config.format.to_sym
36
+ def should_return_json?(return_json_param)
37
+ return_json_param == 'true' || (return_json_param != 'false' && Access.config.return_json == 'true')
32
38
  end
33
39
 
34
- def headers
35
- raise Access::Error::NoAccessToken unless Access.config.access_token
36
- {"Access-Token" => Access.config.access_token}
40
+ def hashify_results?(hashify_param)
41
+ hashify_param == 'true' || (hashify_param != 'false' && Access.config.hashify == 'true')
37
42
  end
38
43
 
39
44
  end
@@ -0,0 +1,127 @@
1
+ module Access
2
+ class Response
3
+
4
+ attr_accessor :info, :offers, :stores, :locations, :categories, :suggestions, :oauth_applications, :access_tokens, :oauth_tokens, :oauth_token, :verify, :reports, :members, :filters, :links, :dev_node, :message, :status, :success, :error, :response_status, :content_type, :redemption_method, :details, :oauth_access_token
5
+
6
+ def initialize(response)
7
+ response.each { |key, value| instance_variable_set("@#{key}", value) if self.class.instance_methods.include? key.to_sym }
8
+ @response_status = response.message
9
+ @status ||= response.code
10
+ check_success(response)
11
+ if @success
12
+ @info = Access::Info.new(@info) if @info
13
+ (@links = @links.is_a?(Array) ? Access::Link.process_batch(@links) : Access::Link.new(@links)) if @links
14
+ process_data
15
+ end
16
+
17
+ end
18
+
19
+ def check_success(response)
20
+ if response.success?
21
+ @success = true
22
+ else
23
+ create_error
24
+ end
25
+ end
26
+
27
+ def create_error
28
+ @success = false
29
+ @error = Access::Error.new(@response_status, @status, @message)
30
+ remove_instance_variable(:@message) if @message
31
+ remove_instance_variable(:@status)
32
+ end
33
+ end
34
+
35
+ class OfferResponse < Response
36
+ def process_data
37
+ # for when you search and it returns 0
38
+ (@offers = []; create_error) if @message
39
+ @offers = Access::Offer.process_batch(@offers)
40
+ end
41
+ end
42
+
43
+ class StoreResponse < Response
44
+ def process_data
45
+ (@stores = []; create_error) if @message
46
+ @stores = Access::Store.process_batch(@stores)
47
+ end
48
+ end
49
+
50
+ class LocationResponse < Response
51
+ def process_data
52
+ (@locations = []; create_error) if @message
53
+ @locations = Access::Location.process_batch(@locations)
54
+ end
55
+ end
56
+
57
+ class CategoryResponse < Response
58
+ def process_data
59
+ (@categories = []; create_error) if @message
60
+ @categories = Access::Category.process_batch(@categories)
61
+ end
62
+ end
63
+
64
+ class AutocompleteResponse < Response
65
+ def process_data
66
+ # (@suggestions = []; create_error) if @message
67
+ @suggestions = Access::Autocomplete.new(@suggestions)
68
+ end
69
+ end
70
+
71
+ class OauthApplicationResponse < Response
72
+ def process_data
73
+ (@oauth_applications = []; create_error) if @message
74
+ @oauth_applications = Access::OauthApplication.process_batch(@oauth_applications)
75
+ end
76
+ end
77
+
78
+ class TokenResponse < Response
79
+ def process_data
80
+ (create_error) if @message
81
+ @access_tokens = Access::Token.process_batch(@access_tokens) if @access_tokens
82
+ @oauth_tokens = Access::Token.process_batch(@oauth_tokens) if @oauth_tokens
83
+ @oauth_token = Access::Token.new(@oauth_token) if @oauth_token
84
+ end
85
+ end
86
+
87
+ class VerifyResponse < Response
88
+ def process_data
89
+ @oauth_access_token = Access::Verify.new(@oauth_access_token) if @oauth_access_token
90
+ @offers = Access::Verify.new(@offers) if @offers
91
+ @categories = Access::Verify.new(@categories) if @categories
92
+ @locations = Access::Verify.new(@locations) if @locations
93
+ @stores = Access::Verify.new(@stores) if @stores
94
+ end
95
+ end
96
+
97
+ class RedeemResponse < Response
98
+ def process_data
99
+ @details = Access::Redeem.new(@details) if @details
100
+ end
101
+ end
102
+
103
+ class ReportResponse < Response
104
+ def process_data
105
+ @reports = Access::Report.new(@reports)
106
+ end
107
+ end
108
+
109
+ class MemberResponse < Response
110
+ def process_data
111
+ @members = Access::Member.process_batch(@members)
112
+ end
113
+ end
114
+
115
+ class FilterResponse < Response
116
+ def process_data
117
+ @filters = Access::Filter.process_batch(@filters)
118
+ end
119
+ end
120
+
121
+ class CitySavingsResponse < Response
122
+ def process_data
123
+ # something?
124
+ # @members = Access::Member.process_batch(@members)
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,28 @@
1
+ module Access
2
+ class Spot
3
+
4
+ def self.search_by_channel(channel_key, options = {})
5
+ Access::api.new.search_spots_by_channel channel_key, options
6
+ end
7
+
8
+ def self.search_by_campaign(campaign_key, options = {})
9
+ Access::api.new.search_spots_by_campaign campaign_key, options
10
+ end
11
+
12
+ def self.find(spot_key, options = {})
13
+ Access::api.new.find_spot spot_key, options
14
+ end
15
+
16
+ def self.process_batch(chunk)
17
+ chunk.map { |campaign| new(campaign) }
18
+ end
19
+
20
+ def initialize(values)
21
+ self.class.class_eval {attr_reader *values.keys }
22
+ values.each do |attribute_name, attribute_value|
23
+ self.instance_variable_set("@#{attribute_name}", attribute_value)
24
+ end
25
+ end
26
+
27
+ end
28
+ end
@@ -5,13 +5,27 @@ module Access
5
5
  Access::Api.new.search_stores options
6
6
  end
7
7
 
8
- def self.find(key, options = {})
9
- Access::Api.new.find_store key, options
8
+ def self.find(store_key, options = {})
9
+ Access::Api.new.find_store store_key, options
10
10
  end
11
11
 
12
12
  def self.national(options = {})
13
13
  Access::Api.new.national_stores options
14
14
  end
15
15
 
16
+ def self.process_batch(chunk)
17
+ chunk.map { |store| new(store) }
18
+ end
19
+
20
+ def initialize(values)
21
+ self.class.class_eval {attr_reader *values.keys }
22
+ values.each do |attribute_name, attribute_value|
23
+ self.instance_variable_set("@#{attribute_name}", attribute_value)
24
+ end
25
+ @links = Access::Link.new(@links) if @links
26
+ @store_categories = Access::Category.process_batch(@store_categories) if @store_categories
27
+ @physical_location = Access::Location.new(@physical_location) if @physical_location
28
+ end
29
+
16
30
  end
17
31
  end
@@ -2,12 +2,30 @@ module Access
2
2
  class Token
3
3
 
4
4
  def self.search(options = {})
5
+ # Internal Admin only Call
5
6
  Access::Api.new.search_tokens options
6
7
  end
7
8
 
8
9
  def self.find(token, options = {})
10
+ # Internal Admin only Call
9
11
  Access::Api.new.find_token token, options
10
12
  end
11
13
 
14
+ def self.process_batch(chunk)
15
+ chunk.map { |token| new(token) }
16
+ end
17
+
18
+ def initialize(values)
19
+ self.class.class_eval {attr_reader *values.keys }
20
+ values.each do |attribute_name, attribute_value|
21
+ self.instance_variable_set("@#{attribute_name}", attribute_value)
22
+ end
23
+ @links = Access::Link.new(@links) if @links
24
+ end
25
+
26
+ def has_scope?
27
+
28
+ end
29
+
12
30
  end
13
31
  end
@@ -5,8 +5,17 @@ module Access
5
5
  Access::Api.new.verify_token options
6
6
  end
7
7
 
8
- def self.filter(options = {})
9
- Access::Api.new.verify_filter options
8
+ def self.filter(filter, options = {})
9
+ Access::Api.new.verify_filter filter, options
10
+ end
11
+
12
+ def initialize(values)
13
+ self.class.class_eval { attr_reader *values.keys }
14
+ values.each do |attribute_name, attribute_value|
15
+ self.instance_variable_set("@#{attribute_name}", attribute_value)
16
+ end
17
+ @categories = Access::Category.process_batch(@categories) if @categories
18
+ @redemption_methods = Access::Redeem.process_batch(@redemption_methods) if @redemption_methods
10
19
  end
11
20
 
12
21
  end
@@ -1,4 +1,4 @@
1
1
  module Access
2
- VERSION = "1.1.7"
2
+ VERSION = "2.0.0"
3
3
  end
4
4
 
@@ -0,0 +1,53 @@
1
+ require './test/test_helper'
2
+
3
+ class AutocompleteTest < Minitest::Test
4
+
5
+ def test_autocompletes_search
6
+ VCR.use_cassette('autocomplete search') do
7
+ autocompletes_response = Access::Autocomplete.search(member_key: 'API_RUBY_GEM_TEST', per_page: 1)
8
+ assert autocompletes_response.success
9
+ assert_kind_of Access::AutocompleteResponse, autocompletes_response
10
+ assert_kind_of Access::Autocomplete, autocompletes_response.suggestions
11
+ assert_kind_of Access::Store, autocompletes_response.suggestions.stores.first
12
+ assert_kind_of Access::Location, autocompletes_response.suggestions.locations.first
13
+ assert_kind_of Access::Category, autocompletes_response.suggestions.categories.first
14
+ assert_kind_of Access::Offer, autocompletes_response.suggestions.offers.first
15
+ end
16
+ end
17
+
18
+ def test_autocompletes_search_offers
19
+ VCR.use_cassette('autocomplete search offers') do
20
+ autocompletes_response = Access::Autocomplete.search_offers(member_key: 'API_RUBY_GEM_TEST', per_page: 1)
21
+ assert autocompletes_response.success
22
+ assert_kind_of Array, autocompletes_response.suggestions.offers
23
+ assert_kind_of Access::Offer, autocompletes_response.suggestions.offers.first
24
+ end
25
+ end
26
+
27
+ def test_autocompletes_search_stores
28
+ VCR.use_cassette('autocomplete search stores') do
29
+ autocompletes_response = Access::Autocomplete.search_stores(member_key: 'API_RUBY_GEM_TEST', per_page: 1)
30
+ assert autocompletes_response.success
31
+ assert_kind_of Array, autocompletes_response.suggestions.stores
32
+ assert_kind_of Access::Store, autocompletes_response.suggestions.stores.first
33
+ end
34
+ end
35
+
36
+ def test_autocompletes_search_locations
37
+ VCR.use_cassette('autocomplete search locations') do
38
+ autocompletes_response = Access::Autocomplete.search_locations(member_key: 'API_RUBY_GEM_TEST', per_page: 1)
39
+ assert autocompletes_response.success
40
+ assert_kind_of Array, autocompletes_response.suggestions.locations
41
+ assert_kind_of Access::Location, autocompletes_response.suggestions.locations.first
42
+ end
43
+ end
44
+
45
+ def test_autocompletes_search_categories
46
+ VCR.use_cassette('autocomplete search categories') do
47
+ autocompletes_response = Access::Autocomplete.search_categories(member_key: 'API_RUBY_GEM_TEST', per_page: 1)
48
+ assert autocompletes_response.success
49
+ assert_kind_of Array, autocompletes_response.suggestions.categories
50
+ assert_kind_of Access::Category, autocompletes_response.suggestions.categories.first
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,64 @@
1
+ require './test/test_helper'
2
+
3
+ class CategoryTest < Minitest::Test
4
+
5
+ def get_first_category
6
+ VCR.use_cassette('category search') do
7
+ @first_category = Access::Category.search(member_key: 'API_RUBY_GEM_TEST', per_page: 1).categories.first
8
+ @first_subcategory = Access::Category.search(member_key: 'API_RUBY_GEM_TEST', per_page: 1).categories.first.subcategories.first
9
+ end
10
+ end
11
+
12
+ def test_categories_search
13
+ VCR.use_cassette('category search') do
14
+ categories_response = Access::Category.search(member_key: 'API_RUBY_GEM_TEST', per_page: 1)
15
+ assert categories_response.success
16
+ first_category = categories_response.categories.first
17
+ assert_kind_of Access::CategoryResponse, categories_response
18
+ assert_kind_of Access::Link, categories_response.links
19
+ assert_kind_of Array, categories_response.categories
20
+ assert_kind_of Access::Category, first_category
21
+ assert_kind_of Access::Link, first_category.links
22
+ assert_kind_of Access::Category, first_category.subcategories.first
23
+ end
24
+ end
25
+
26
+ def test_categories_find
27
+ get_first_category
28
+ VCR.use_cassette('category find') do
29
+ categories_response = Access::Category.find(@first_category.category_key, member_key: 'API_RUBY_GEM_TEST')
30
+ assert categories_response.success
31
+ first_category = categories_response.categories.first
32
+ assert_kind_of Access::CategoryResponse, categories_response
33
+ assert_kind_of Access::Category, first_category
34
+ assert_kind_of Access::Link, first_category.links
35
+ assert_kind_of Access::Category, first_category.subcategories.first
36
+ end
37
+ end
38
+
39
+ def test_subcategories_find
40
+ get_first_category
41
+ VCR.use_cassette('subcategory find') do
42
+ categories_response = Access::Category.find(@first_subcategory.category_key, member_key: 'API_RUBY_GEM_TEST')
43
+ assert categories_response.success
44
+ first_category = categories_response.categories.first
45
+ assert_kind_of Access::CategoryResponse, categories_response
46
+ assert_kind_of Access::Category, first_category
47
+ assert_kind_of Access::Link, first_category.links
48
+ assert_kind_of Access::Category, first_category.subcategory_siblings.first
49
+ end
50
+ end
51
+
52
+ def test_categories_fail_member_key
53
+ VCR.use_cassette('category search fail member key') do
54
+ subcategories_response = Access::Category.search(query: 'pizza')
55
+ refute subcategories_response.success
56
+ assert_kind_of Access::CategoryResponse, subcategories_response
57
+ assert_kind_of Access::Error, subcategories_response.error
58
+ assert_equal 401, subcategories_response.error.status_code
59
+ assert_equal "Must include a member_key to see details.", subcategories_response.error.message
60
+ assert_equal "Unauthorized", subcategories_response.error.status
61
+ end
62
+ end
63
+
64
+ end
@@ -0,0 +1,5 @@
1
+ require './test/test_helper'
2
+
3
+ class CitySavingsTest < Minitest::Test
4
+
5
+ end
@@ -0,0 +1,40 @@
1
+ require './test/test_helper'
2
+
3
+ class FilterTest < Minitest::Test
4
+
5
+ def get_first_filter
6
+ VCR.use_cassette('filter search') do
7
+ @first_filter = Access::Filter.search(per_page: 1).filters.first
8
+ end
9
+ end
10
+
11
+ def test_filters_search
12
+ VCR.use_cassette('filter search') do
13
+ filters_response = Access::Filter.search(per_page: 1)
14
+ assert filters_response.success
15
+ first_filter = filters_response.filters.first
16
+ assert_kind_of Access::FilterResponse, filters_response
17
+ assert_kind_of Access::Link, filters_response.links
18
+ assert_kind_of Access::Info, filters_response.info
19
+ assert_kind_of Array, filters_response.filters
20
+ assert_kind_of Access::Filter, first_filter
21
+ assert first_filter.json_filter
22
+ assert first_filter.hash_filter
23
+ end
24
+ end
25
+
26
+ def test_filters_find
27
+ get_first_filter
28
+ VCR.use_cassette('filter find') do
29
+ filters_response = Access::Filter.find(@first_filter.filter_id)
30
+ assert filters_response.success
31
+ first_filter = filters_response.filters.first
32
+ assert_kind_of Access::FilterResponse, filters_response
33
+ assert_kind_of Array, filters_response.filters
34
+ assert_kind_of Access::Filter, first_filter
35
+ assert first_filter.json_filter
36
+ assert first_filter.hash_filter
37
+ end
38
+ end
39
+
40
+ end