amplitude-api 0.1.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bf75d44cb2ccfb90961a3aa3875a245a8231edbb68d941325b6980ea10cf63d2
4
- data.tar.gz: 7da5804bd41daa7c6dee8839119ad5640725b241ef8170f37919f5109f566855
3
+ metadata.gz: 59e87e342af629c6e87369ef210a272186236ec4e4ef9f9a101a2a590da59204
4
+ data.tar.gz: 7e207b30db0550982c4280aa0da2d3c225b1598cfd2bcba1971e8a75238e142e
5
5
  SHA512:
6
- metadata.gz: 4979e1f81be283bf3324de9269ce36131ce16f3bd3dbb6bd257eb98d7f8e0e30e669bfb8cc6738eed1e29f2543eddf34b19448fb379814c63fb273ab25726863
7
- data.tar.gz: 4301bb508042b66a85b4754e352bca971a3acb0cdee00b81ce6b1bb9359f1120770f70c16e59c71a9e4279d38b32ac5904108b8a4ddf2fe69767fea77ad0fd87
6
+ metadata.gz: 42aa5d35506dcaebb8a9db1e973081f38d0259eacc1da1eeeae6d530fc92055dfc70f749e4b19a4e28e3b726e92abae52e575207f1fadfa483bd2b6d6abba771
7
+ data.tar.gz: 7e97e56ac203bee46e1740e937c0869cb310d8c4edbc88ce6c2603446c5ad0989e52ffbf327be61680813ff2e92808a9ae91e09d0de9e4de5f4cedae590c2415
data/.rubocop.yml CHANGED
@@ -1,8 +1,26 @@
1
1
  require: rubocop-rspec
2
+
3
+ AllCops:
4
+ TargetRubyVersion: 2.4
5
+
2
6
  Metrics/LineLength:
3
7
  Max: 120
4
8
 
9
+ Style/StringLiterals:
10
+ EnforcedStyle: double_quotes
11
+ SupportedStyles:
12
+ - single_quotes
13
+ - double_quotes
14
+
15
+ Style/BlockDelimiters:
16
+ Enabled: true
17
+ Exclude:
18
+ - spec/**/*
19
+
5
20
  # Disable some failing rspec cops that fail from upgrading gems until we can clean things up a bit.
21
+ Naming/FileName:
22
+ Exclude:
23
+ - lib/amplitude-api.rb
6
24
  RSpec/ExampleLength:
7
25
  Enabled: false
8
26
  Metrics/BlockLength:
@@ -14,4 +32,4 @@ RSpec/NestedGroups:
14
32
  RSpec/MessageSpies:
15
33
  Enabled: false
16
34
  RSpec/ContextWording:
17
- Enabled: false
35
+ Enabled: false
data/.travis.yml CHANGED
@@ -1,7 +1,5 @@
1
1
  language: ruby
2
2
  cache: bundler
3
3
  rvm:
4
- - 2.6.1
5
- - 2.4.6
6
- - 2.3.8
7
- - 2.2.10
4
+ - 2.6
5
+ - 2.4
data/Changelog.md CHANGED
@@ -3,6 +3,16 @@
3
3
  We would like to think our many [contributors](https://github.com/toothrot/amplitude-api/graphs/contributors) for
4
4
  suggestions, ideas and improvements to Amplitude API.
5
5
 
6
+ ## 0.3.0 (2021-02-22)
7
+
8
+ * Changes Typhoeus to Faraday to launch requests
9
+ * Adds new API fields to Event
10
+ * Event can now include arbitrary properties, so it could be used if the API adds new ones.
11
+
12
+ ## 0.2.0 (2021-02-14)
13
+
14
+ * Updates gem to use HTTP API V2.
15
+
6
16
  ## 0.1.1 (2019-01-01)
7
17
 
8
18
  * Fix #41 - Delete API now correctly handles Arrays of IDs.
@@ -10,7 +20,7 @@ suggestions, ideas and improvements to Amplitude API.
10
20
  ## 0.1.0 (2019-01-01)
11
21
 
12
22
  * Update Gem dependencies (thanks @kolorahl, @itamar, @krettan)
13
- * Minimum ruby version is now 2.2
23
+ * Minimum ruby version is now 2.2
14
24
  * Support Delete API (thanks @samjohn)
15
25
  * Fix bundle Inline (thanks @jonduarte)
16
26
  * Many fixes from @kolorahl
data/Gemfile CHANGED
@@ -1,12 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Generated from /Users/alex/development/amplitude-api/amplitude-api.gemspec
2
- source 'https://rubygems.org'
4
+ source "https://rubygems.org"
3
5
 
4
- gem 'typhoeus', '~> 1.1'
6
+ gem "faraday", "~> 1.3"
5
7
 
6
8
  group :development, :test do
7
- gem 'pry', '~> 0.12.2'
8
- gem 'rake', '>= 12.0'
9
- gem 'rspec', '>= 2.99.0'
10
- gem 'rubocop', '~> 0.66.0', require: false
11
- gem 'rubocop-rspec'
9
+ gem "pry", "~> 0.12.2"
10
+ gem "rake", ">= 12.0"
11
+ gem "rspec", ">= 2.99.0"
12
+ gem "rubocop", "~> 0.66.0", require: false
13
+ gem "rubocop-rspec"
12
14
  end
data/Gemfile.lock CHANGED
@@ -4,11 +4,14 @@ GEM
4
4
  ast (2.4.0)
5
5
  coderay (1.1.2)
6
6
  diff-lcs (1.3)
7
- ethon (0.12.0)
8
- ffi (>= 1.3.0)
9
- ffi (1.10.0)
7
+ faraday (1.3.0)
8
+ faraday-net_http (~> 1.0)
9
+ multipart-post (>= 1.2, < 3)
10
+ ruby2_keywords
11
+ faraday-net_http (1.0.1)
10
12
  jaro_winkler (1.5.2)
11
13
  method_source (0.9.2)
14
+ multipart-post (2.1.1)
12
15
  parallel (1.17.0)
13
16
  parser (2.6.2.0)
14
17
  ast (~> 2.4.0)
@@ -17,7 +20,7 @@ GEM
17
20
  method_source (~> 0.9.0)
18
21
  psych (3.1.0)
19
22
  rainbow (3.0.0)
20
- rake (12.3.2)
23
+ rake (12.3.3)
21
24
  rspec (3.8.0)
22
25
  rspec-core (~> 3.8.0)
23
26
  rspec-expectations (~> 3.8.0)
@@ -42,20 +45,19 @@ GEM
42
45
  rubocop-rspec (1.32.0)
43
46
  rubocop (>= 0.60.0)
44
47
  ruby-progressbar (1.10.0)
45
- typhoeus (1.3.1)
46
- ethon (>= 0.9.0)
48
+ ruby2_keywords (0.0.4)
47
49
  unicode-display_width (1.5.0)
48
50
 
49
51
  PLATFORMS
50
52
  ruby
51
53
 
52
54
  DEPENDENCIES
55
+ faraday (~> 1.3)
53
56
  pry (~> 0.12.2)
54
57
  rake (>= 12.0)
55
58
  rspec (>= 2.99.0)
56
59
  rubocop (~> 0.66.0)
57
60
  rubocop-rspec
58
- typhoeus (~> 1.1)
59
61
 
60
62
  BUNDLED WITH
61
- 1.17.2
63
+ 1.17.3
data/Rakefile CHANGED
@@ -1,14 +1,16 @@
1
- require 'bundler/gem_tasks'
2
- require 'rubocop/rake_task'
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rubocop/rake_task"
3
5
 
4
6
  RuboCop::RakeTask.new
5
7
 
6
8
  begin
7
- require 'rspec/core/rake_task'
9
+ require "rspec/core/rake_task"
8
10
  RSpec::Core::RakeTask.new(:spec)
9
11
  rescue LoadError
10
- puts 'Unable to load rspec. Have you run `bundle install`?'
12
+ puts "Unable to load rspec. Have you run `bundle install`?"
11
13
  end
12
14
 
13
15
  task(:default).clear
14
- task default: ['rubocop:auto_correct', :spec]
16
+ task default: ["rubocop:auto_correct", :spec]
@@ -1,25 +1,27 @@
1
- lib = File.expand_path('lib', __dir__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path("lib", __dir__)
2
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
- require 'amplitude_api/version'
5
+ require "amplitude_api/version"
4
6
 
5
7
  Gem::Specification.new do |spec|
6
- spec.name = 'amplitude-api'
8
+ spec.name = "amplitude-api"
7
9
  spec.version = AmplitudeAPI::VERSION
8
- spec.authors = ['Alex Rakoczy']
9
- spec.email = ['arakoczy@gmail.com']
10
- spec.summary = 'Send events to the Amplitude API'
11
- spec.description = 'Provides an integration for sending events to Amplitude'
12
- spec.homepage = 'https://github.com/toothrot/amplitude-api'
13
- spec.license = 'MIT'
10
+ spec.authors = ["Alex Rakoczy"]
11
+ spec.email = ["arakoczy@gmail.com"]
12
+ spec.summary = "Send events to the Amplitude API"
13
+ spec.description = "Provides an integration for sending events to Amplitude"
14
+ spec.homepage = "https://github.com/toothrot/amplitude-api"
15
+ spec.license = "MIT"
14
16
 
15
17
  spec.files = `git ls-files -z`.split("\x0")
16
18
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
- spec.require_paths = ['lib']
20
+ spec.require_paths = ["lib"]
19
21
 
20
- spec.add_development_dependency 'pry', '~> 0.12.2'
21
- spec.add_development_dependency 'rake', '~> 12.0', '>= 12.0'
22
- spec.add_development_dependency 'rspec', '~> 2.99', '>= 2.99.0'
23
- spec.add_dependency 'typhoeus', '~> 1.0'
24
- spec.required_ruby_version = '~> 2.2'
22
+ spec.add_development_dependency "pry", "~> 0.12.2"
23
+ spec.add_development_dependency "rake", "~> 12.0", ">= 12.0"
24
+ spec.add_development_dependency "rspec", "~> 2.99", ">= 2.99.0"
25
+ spec.add_dependency "faraday", "~> 1.3"
26
+ spec.required_ruby_version = ">= 2.4"
25
27
  end
data/lib/amplitude-api.rb CHANGED
@@ -1,4 +1,3 @@
1
- # rubocop:disable Naming/FileName
2
- require_relative 'amplitude_api'
3
- # rubocop:enable Naming/FileName
4
- # Whoops.
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "amplitude_api"
data/lib/amplitude_api.rb CHANGED
@@ -1,18 +1,20 @@
1
- require 'json'
2
- require 'typhoeus'
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require "faraday"
3
5
 
4
6
  # AmplitudeAPI
5
7
  class AmplitudeAPI
6
- require_relative 'amplitude_api/config'
7
- require_relative 'amplitude_api/event'
8
- require_relative 'amplitude_api/identification'
8
+ require_relative "amplitude_api/config"
9
+ require_relative "amplitude_api/event"
10
+ require_relative "amplitude_api/identification"
9
11
 
10
- TRACK_URI_STRING = 'https://api.amplitude.com/httpapi'.freeze
11
- IDENTIFY_URI_STRING = 'https://api.amplitude.com/identify'.freeze
12
- SEGMENTATION_URI_STRING = 'https://amplitude.com/api/2/events/segmentation'.freeze
13
- DELETION_URI_STRING = 'https://amplitude.com/api/2/deletions/users'.freeze
12
+ TRACK_URI_STRING = "https://api.amplitude.com/2/httpapi"
13
+ IDENTIFY_URI_STRING = "https://api.amplitude.com/identify"
14
+ SEGMENTATION_URI_STRING = "https://amplitude.com/api/2/events/segmentation"
15
+ DELETION_URI_STRING = "https://amplitude.com/api/2/deletions/users"
14
16
 
15
- USER_WITH_NO_ACCOUNT = "user who doesn't have an account".freeze
17
+ USER_WITH_NO_ACCOUNT = "user who doesn't have an account"
16
18
 
17
19
  class << self
18
20
  def config
@@ -43,7 +45,7 @@ class AmplitudeAPI
43
45
  # @option options [ Hash ] user_properties a hash that is serialized to JSON,
44
46
  # and contains user properties to be associated with the user
45
47
  #
46
- # @return [ Typhoeus::Response ]
48
+ # @return [ Faraday::Response ]
47
49
  def send_event(event_name, user, device, options = {})
48
50
  event = AmplitudeAPI::Event.new(
49
51
  user_id: user,
@@ -68,10 +70,10 @@ class AmplitudeAPI
68
70
  def track_body(*events)
69
71
  event_body = events.flatten.map(&:to_hash)
70
72
 
71
- {
73
+ JSON.generate(
72
74
  api_key: api_key,
73
- event: JSON.generate(event_body)
74
- }
75
+ events: event_body
76
+ )
75
77
  end
76
78
 
77
79
  # @overload track(event)
@@ -80,11 +82,11 @@ class AmplitudeAPI
80
82
  # @overload track([events])
81
83
  # @param [ Array<AmplitudeAPI::Event> ] Send an array of events in a single request to Amplitude
82
84
  #
83
- # @return [ Typhoeus::Response ]
85
+ # @return [ Faraday::Response ]
84
86
  #
85
87
  # Send one or more Events to the Amplitude API
86
88
  def track(*events)
87
- Typhoeus.post(TRACK_URI_STRING, body: track_body(events))
89
+ Faraday.post(TRACK_URI_STRING, track_body(events), "Content-Type" => "application/json")
88
90
  end
89
91
 
90
92
  # ==== Identification related methods
@@ -123,11 +125,11 @@ class AmplitudeAPI
123
125
  # @overload identify([identifications])
124
126
  # @param [ Array<AmplitudeAPI::Identify> ] Send an array of identifications in a single request to Amplitude
125
127
  #
126
- # @return [ Typhoeus::Response ]
128
+ # @return [ Faraday::Response ]
127
129
  #
128
130
  # Send one or more Identifications to the Amplitude Identify API
129
131
  def identify(*identifications)
130
- Typhoeus.post(IDENTIFY_URI_STRING, body: identify_body(identifications))
132
+ Faraday.post(IDENTIFY_URI_STRING, identify_body(identifications))
131
133
  end
132
134
 
133
135
  # ==== Event Segmentation related methods
@@ -150,13 +152,13 @@ class AmplitudeAPI
150
152
  # @option options [ Integer ] limit an integer that defines number of Group By values
151
153
  # returned (default: 100). The maximum limit is 1000.
152
154
  #
153
- # @return [ Typhoeus::Response ]
155
+ # @return [ Faraday::Response ]
154
156
  def segmentation(event, start_time, end_time, **options)
155
- Typhoeus.get SEGMENTATION_URI_STRING, userpwd: "#{api_key}:#{secret_key}", params: {
157
+ Faraday.get SEGMENTATION_URI_STRING, userpwd: "#{api_key}:#{secret_key}", params: {
156
158
  e: event.to_json,
157
159
  m: options[:m],
158
- start: start_time.strftime('%Y%m%d'),
159
- end: end_time.strftime('%Y%m%d'),
160
+ start: start_time.strftime("%Y%m%d"),
161
+ end: end_time.strftime("%Y%m%d"),
160
162
  i: options[:i],
161
163
  s: (options[:s] || []).map(&:to_json),
162
164
  g: options[:g],
@@ -174,29 +176,38 @@ class AmplitudeAPI
174
176
  # based on the amplitude database
175
177
  # @param [ String ] requester the email address of the person who
176
178
  # is requesting the deletion, optional but useful for reporting
177
- #
178
- # @return [ Typhoeus::Response ]
179
- def delete(user_ids: nil, amplitude_ids: nil, requester: nil)
179
+ # @param [ Boolean ] (optional) ignore any invalid user IDs(users that do no
180
+ # exist in the project) that were passed in
181
+ # @param [ Boolean ] (optional) delete from the entire org rather than just
182
+ # this project.
183
+ # @return [ Faraday::Response ]
184
+ def delete(user_ids: nil, amplitude_ids: nil, requester: nil, ignore_invalid_id: nil, delete_from_org: nil)
180
185
  user_ids = Array(user_ids)
181
186
  amplitude_ids = Array(amplitude_ids)
182
- Typhoeus.post(
187
+
188
+ faraday = Faraday.new do |conn|
189
+ conn.basic_auth config.api_key, config.secret_key
190
+ end
191
+
192
+ faraday.post(
183
193
  DELETION_URI_STRING,
184
- userpwd: "#{api_key}:#{config.secret_key}",
185
- body: delete_body(user_ids, amplitude_ids, requester),
186
- headers: { 'Content-Type': 'application/json' }
194
+ delete_body(user_ids, amplitude_ids, requester, ignore_invalid_id, delete_from_org),
195
+ "Content-Type" => "application/json"
187
196
  )
188
197
  end
189
198
 
190
199
  private
191
200
 
192
- def delete_body(user_ids, amplitude_ids, requester)
193
- JSON.generate(
194
- {
195
- amplitude_ids: amplitude_ids,
196
- user_ids: user_ids,
197
- requester: requester
198
- }.delete_if { |_, value| value.nil? || value.empty? }
199
- )
201
+ def delete_body(user_ids, amplitude_ids, requester, ignore_invalid_id, delete_from_org)
202
+ body = {
203
+ amplitude_ids: amplitude_ids,
204
+ user_ids: user_ids,
205
+ requester: requester
206
+ }.delete_if { |_, value| value.nil? || value.empty? }
207
+
208
+ body[:ignore_invalid_id] = ignore_invalid_id.to_s if ignore_invalid_id
209
+ body[:delete_from_org] = delete_from_org.to_s if delete_from_org
210
+ JSON.generate(body)
200
211
  end
201
212
  end
202
213
  end
@@ -1,4 +1,6 @@
1
- require 'singleton'
1
+ # frozen_string_literal: true
2
+
3
+ require "singleton"
2
4
 
3
5
  class AmplitudeAPI
4
6
  # AmplitudeAPI::Config
@@ -13,13 +15,32 @@ class AmplitudeAPI
13
15
  end
14
16
 
15
17
  class << self
18
+ def base_properties
19
+ %i[event_type event_properties user_properties user_id device_id]
20
+ end
21
+
22
+ def revenue_properties
23
+ %i[revenue_type product_id revenue price quantity]
24
+ end
25
+
26
+ def optional_properties
27
+ %i[
28
+ time
29
+ ip platform country insert_id
30
+ groups app_version os_name os_version
31
+ device_brand device_manufacturer device_model
32
+ carrier region city dma language
33
+ location_lat location_lng
34
+ idfa idfv adid android_id
35
+ event_id session_id
36
+ ]
37
+ end
38
+
16
39
  def defaults
17
40
  {
18
41
  api_key: nil,
19
42
  secret_key: nil,
20
- whitelist: %i[user_id device_id event_type time
21
- event_properties user_properties time ip platform country insert_id
22
- revenue_type price quantity product_id],
43
+ whitelist: base_properties + revenue_properties + optional_properties,
23
44
  time_formatter: ->(time) { time ? time.to_i * 1_000 : nil },
24
45
  event_properties_formatter: ->(props) { props || {} },
25
46
  user_properties_formatter: ->(props) { props || {} }
@@ -1,3 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This class is 115 lines long. It's on the limit, it should be refactored before
4
+ # including more code.
5
+ #
6
+ # rubocop:disable Metrics/ClassLength
1
7
  class AmplitudeAPI
2
8
  # AmplitudeAPI::Event
3
9
  class Event
@@ -7,13 +13,43 @@ class AmplitudeAPI
7
13
 
8
14
  # Create a new Event
9
15
  #
10
- # See (Amplitude HTTP API Documentation)[https://amplitude.zendesk.com/hc/en-us/articles/204771828-HTTP-API]
16
+ # See (Amplitude HTTP API Documentation)[https://developers.amplitude.com/docs/http-api-v2]
11
17
  # for a list of valid parameters and their types.
12
18
  def initialize(attributes = {})
13
19
  attributes.each do |k, v|
14
20
  send("#{k}=", v) if respond_to?("#{k}=")
15
21
  end
16
22
  validate_arguments
23
+ @extra_properties = []
24
+ end
25
+
26
+ def method_missing(method_name, *args)
27
+ super if block_given?
28
+
29
+ property_name = method_name.to_s.delete_suffix("=")
30
+
31
+ @extra_properties << property_name
32
+
33
+ create_setter property_name
34
+ create_getter property_name
35
+
36
+ send("#{property_name}=".to_sym, *args)
37
+ end
38
+
39
+ def create_setter(attribute_name)
40
+ self.class.send(:define_method, "#{attribute_name}=".to_sym) do |value|
41
+ instance_variable_set("@" + attribute_name.to_s, value)
42
+ end
43
+ end
44
+
45
+ def create_getter(attribute_name)
46
+ self.class.send(:define_method, attribute_name.to_sym) do
47
+ instance_variable_get("@" + attribute_name.to_s)
48
+ end
49
+ end
50
+
51
+ def respond_to_missing?(method_name, *args)
52
+ @extra_properties.include?(method_name) || @extra_properties.include?("#{method_name}=") || super
17
53
  end
18
54
 
19
55
  def user_id=(value)
@@ -36,28 +72,42 @@ class AmplitudeAPI
36
72
  }
37
73
  event[:user_id] = user_id if user_id
38
74
  event[:device_id] = device_id if device_id
39
- event.merge(optional_properties).merge(revenue_hash)
75
+ event.merge(optional_properties).merge(revenue_hash).merge(extra_properties)
40
76
  end
41
77
  alias to_h to_hash
42
78
 
43
79
  # @return [ Hash ] Optional properties
80
+ #
81
+ # Returns optional properties (belong to the API but are optional)
44
82
  def optional_properties
45
- %i[device_id time ip platform country insert_id].map do |prop|
83
+ AmplitudeAPI::Config.optional_properties.map do |prop|
46
84
  val = prop == :time ? formatted_time : send(prop)
47
85
  val ? [prop, val] : nil
48
86
  end.compact.to_h
49
87
  end
50
88
 
89
+ # @return [ Hash ] Extra properties
90
+ #
91
+ # Returns optional properties (not belong to the API, are assigned by the user)
92
+ # This way, if the API is updated with new properties, the gem will be able
93
+ # to work with the new specification until the code is modified
94
+ def extra_properties
95
+ @extra_properties.map do |prop|
96
+ val = send(prop)
97
+ val ? [prop.to_sym, val] : nil
98
+ end.compact.to_h
99
+ end
100
+
51
101
  # @return [ true, false ]
52
102
  #
53
103
  # Returns true if the event type matches one reserved by Amplitude API.
54
104
  def reserved_event?(type)
55
- ['[Amplitude] Start Session',
56
- '[Amplitude] End Session',
57
- '[Amplitude] Revenue',
58
- '[Amplitude] Revenue (Verified)',
59
- '[Amplitude] Revenue (Unverified)',
60
- '[Amplitude] Merged User'].include?(type)
105
+ ["[Amplitude] Start Session",
106
+ "[Amplitude] End Session",
107
+ "[Amplitude] Revenue",
108
+ "[Amplitude] Revenue (Verified)",
109
+ "[Amplitude] Revenue (Unverified)",
110
+ "[Amplitude] Merged User"].include?(type)
61
111
  end
62
112
 
63
113
  # @return [ true, false ]
@@ -89,15 +139,23 @@ class AmplitudeAPI
89
139
  end
90
140
 
91
141
  def validate_required_arguments
92
- raise ArgumentError, 'You must provide user_id or device_id (or both)' unless user_id || device_id
93
- raise ArgumentError, 'You must provide event_type' unless event_type
94
- raise ArgumentError, 'Invalid event_type - cannot match a reserved event name' if reserved_event?(event_type)
142
+ raise ArgumentError, "You must provide user_id or device_id (or both)" unless user_id || device_id
143
+ raise ArgumentError, "You must provide event_type" unless event_type
144
+ raise ArgumentError, "Invalid event_type - cannot match a reserved event name" if reserved_event?(event_type)
95
145
  end
96
146
 
97
147
  def validate_revenue_arguments
98
- return self.quantity ||= 1 if price
99
- raise ArgumentError, 'You must provide a price in order to use the product_id' if product_id
100
- raise ArgumentError, 'You must provide a price in order to use the revenue_type' if revenue_type
148
+ return true if !revenue_type && !product_id
149
+ return true if revenue || price
150
+
151
+ raise ArgumentError, revenue_error_message
152
+ end
153
+
154
+ def revenue_error_message
155
+ error_field = "product_id" if product_id
156
+ error_field = "revenue_type" if revenue_type
157
+
158
+ "You must provide a price or a revenue in order to use the field #{error_field}"
101
159
  end
102
160
 
103
161
  def revenue_hash
@@ -106,6 +164,7 @@ class AmplitudeAPI
106
164
  revenue_hash[:revenueType] = revenue_type if revenue_type
107
165
  revenue_hash[:quantity] = quantity if quantity
108
166
  revenue_hash[:price] = price if price
167
+ revenue_hash[:revenue] = revenue if revenue
109
168
  revenue_hash
110
169
  end
111
170
 
@@ -114,3 +173,4 @@ class AmplitudeAPI
114
173
  end
115
174
  end
116
175
  end
176
+ # rubocop:enable Metrics/ClassLength