itly-plugin-amplitude 0.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.
- checksums.yaml +7 -0
- data/.rspec +1 -0
- data/Gemfile +17 -0
- data/Steepfile +9 -0
- data/bin/console +15 -0
- data/bin/rspec +18 -0
- data/bin/setup +8 -0
- data/itly-plugin-amplitude.gemspec +32 -0
- data/lib/itly/plugin-amplitude.rb +11 -0
- data/lib/itly/plugin/amplitude/amplitude.rb +134 -0
- data/lib/itly/plugin/amplitude/call_options.rb +62 -0
- data/lib/itly/plugin/amplitude/options.rb +17 -0
- data/lib/itly/plugin/amplitude/version.rb +9 -0
- data/sig/amplitude.rbs +21 -0
- data/sig/call_options.rbs +31 -0
- data/sig/lib/faraday_response.rbs +7 -0
- data/sig/lib/monitor_mixin.rbs +3 -0
- data/sig/options.rbs +8 -0
- metadata +95 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: d14dad1deaee5525bf9d21dab3f2f661682b4d11f448859511756a2df96962b1
|
4
|
+
data.tar.gz: f8eb63bf513f4b5c9ab24973ff3d5ebea47a10b1dfef5c717152cfbac608d2a2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 356c30953cc309af7d7ccdbaf43674a67632c2a4aab262ce91e875bf228903520535da0e6fc0c72cdcc710de3c4b98fe0b004fd46e4111ddd884dcaa3d2bf59d
|
7
|
+
data.tar.gz: 5e9e0f3682c07c384b7bc6422e263765d90ab0185263336a61ac84dddcc85883118df3c1f8ebd747d5a912241201e58360d81d88746887cade2c678900c8fd3a
|
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--require spec_helper
|
data/Gemfile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
source 'https://rubygems.org'
|
4
|
+
|
5
|
+
# Specify your gem's dependencies in itly-plugin-amplitude.gemspec
|
6
|
+
gemspec
|
7
|
+
|
8
|
+
gem 'rake', '~> 13.0'
|
9
|
+
|
10
|
+
if ENV['LOCAL_ITLY_GEM']
|
11
|
+
# TODO: before publication to RubyGems, switch to version 1
|
12
|
+
gem 'itly-sdk', '~> 0.1', path: '../sdk'
|
13
|
+
end
|
14
|
+
|
15
|
+
gem 'rbs', '~> 1.0'
|
16
|
+
gem 'rspec'
|
17
|
+
gem 'steep', '~> 0.41'
|
data/Steepfile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'itly/plugin-amplitude'
|
6
|
+
|
7
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
8
|
+
# with your gem easier. You can also use a different console, if you like.
|
9
|
+
|
10
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
11
|
+
# require "pry"
|
12
|
+
# Pry.start
|
13
|
+
|
14
|
+
require 'irb'
|
15
|
+
IRB.start(__FILE__)
|
data/bin/rspec
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
# Configure and load RBS
|
5
|
+
unless ENV['DISABLE_TYPE_CHECKING']
|
6
|
+
ENV['RBS_TEST_TARGET'] = 'Itly::*'
|
7
|
+
ENV['RBS_TEST_LOGLEVEL'] = 'warn'
|
8
|
+
ENV['RBS_TEST_DOUBLE_SUITE'] = 'rspec'
|
9
|
+
ENV['RBS_TEST_OPT'] = '-I./sig -I../sdk/sig'
|
10
|
+
|
11
|
+
require 'rbs/test/setup'
|
12
|
+
end
|
13
|
+
|
14
|
+
# Start RSpec
|
15
|
+
require 'rspec/core'
|
16
|
+
|
17
|
+
ENV['RSPEC_RUN_FROM_SCRIPT'] = 'true'
|
18
|
+
RSpec::Core::Runner.invoke
|
data/bin/setup
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'lib/itly/plugin/amplitude/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'itly-plugin-amplitude'
|
7
|
+
spec.version = Itly::Plugin::Amplitude::VERSION
|
8
|
+
spec.authors = ['Iteratively', 'Benjamin Bouchet', 'Justin Fiedler', 'Andrey Sokolov']
|
9
|
+
spec.email = ['support@iterative.ly']
|
10
|
+
|
11
|
+
spec.summary = 'Amplitude plugin for Iteratively SDK for Ruby'
|
12
|
+
spec.description = 'Track and validate analytics with a unified, extensible interface ' \
|
13
|
+
'that works with all your 3rd party analytics providers.'
|
14
|
+
spec.homepage = 'https://github.com/iterativelyhq/itly-sdk-ruby'
|
15
|
+
spec.license = 'MIT'
|
16
|
+
spec.required_ruby_version = Gem::Requirement.new('>= 2.6.0')
|
17
|
+
|
18
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org/'
|
19
|
+
|
20
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
21
|
+
spec.metadata['source_code_uri'] = 'https://github.com/iterativelyhq/itly-sdk-ruby/plugin-amplitude'
|
22
|
+
|
23
|
+
# Specify which files should be added to the gem when it is released.
|
24
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
25
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
26
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
|
27
|
+
end
|
28
|
+
spec.require_paths = ['lib']
|
29
|
+
|
30
|
+
spec.add_dependency 'amplitude-api', '~> 0.3'
|
31
|
+
spec.add_dependency 'itly-sdk', '~> 0.1'
|
32
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
if ENV['LOCAL_ITLY_GEM']
|
4
|
+
lib = File.expand_path('../../../sdk/lib', File.dirname(__FILE__))
|
5
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
6
|
+
end
|
7
|
+
|
8
|
+
require_relative 'plugin/amplitude/amplitude'
|
9
|
+
require_relative 'plugin/amplitude/options'
|
10
|
+
require_relative 'plugin/amplitude/call_options'
|
11
|
+
require_relative 'plugin/amplitude/version'
|
@@ -0,0 +1,134 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'itly-sdk'
|
4
|
+
require 'amplitude-api'
|
5
|
+
|
6
|
+
class Itly
|
7
|
+
class Plugin
|
8
|
+
##
|
9
|
+
# Amplitude plugin class for Itly SDK
|
10
|
+
#
|
11
|
+
class Amplitude < Plugin
|
12
|
+
attr_reader :logger, :disabled
|
13
|
+
|
14
|
+
##
|
15
|
+
# Instantiate a new Plugin::Amplitude
|
16
|
+
#
|
17
|
+
# @param [String] api_key: specify the Amplitude api key
|
18
|
+
# @param [TrueClass/FalseClass] disabled: set to true to disable the plugin. Default to false
|
19
|
+
#
|
20
|
+
def initialize(api_key:, disabled: false)
|
21
|
+
super()
|
22
|
+
@disabled = disabled
|
23
|
+
|
24
|
+
::AmplitudeAPI.config.api_key = api_key
|
25
|
+
end
|
26
|
+
|
27
|
+
##
|
28
|
+
# Initialize AmplitudeApi client
|
29
|
+
#
|
30
|
+
# @param [Itly::PluginOptions] options: plugins options
|
31
|
+
#
|
32
|
+
def load(options:)
|
33
|
+
super
|
34
|
+
# Get options
|
35
|
+
@logger = options.logger
|
36
|
+
|
37
|
+
# Log
|
38
|
+
logger&.info "#{id}: load()"
|
39
|
+
|
40
|
+
logger&.info "#{id}: plugin is disabled!" if @disabled
|
41
|
+
end
|
42
|
+
|
43
|
+
##
|
44
|
+
# Identify a user
|
45
|
+
#
|
46
|
+
# Raise an error if the response is not 200
|
47
|
+
#
|
48
|
+
# @param [String] user_id: the id of the user in your application
|
49
|
+
# @param [Hash] properties: the properties containing user's traits to pass to your application
|
50
|
+
# @param [Itly::Plugin::Amplitude::IdentifyOptions] options: the plugin specific options
|
51
|
+
#
|
52
|
+
def identify(user_id:, properties: nil, options: nil)
|
53
|
+
super
|
54
|
+
return unless enabled?
|
55
|
+
|
56
|
+
# Log
|
57
|
+
log = Itly::Loggers.vars_to_log user_id: user_id, properties: properties, options: options
|
58
|
+
logger&.info "#{id}: identify(#{log})"
|
59
|
+
|
60
|
+
# Send through the client
|
61
|
+
payload = {}
|
62
|
+
payload.merge! options.to_hash if options
|
63
|
+
payload.merge! properties if properties
|
64
|
+
|
65
|
+
call_end_point(options&.callback) do
|
66
|
+
::AmplitudeAPI.send_identify user_id, nil, payload
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
##
|
71
|
+
# Track an event
|
72
|
+
#
|
73
|
+
# Raise an error if the response is not 200
|
74
|
+
#
|
75
|
+
# @param [String] user_id: the id of the user in your application
|
76
|
+
# @param [Event] event: the Event object to pass to your application
|
77
|
+
# @param [Itly::Plugin::Amplitude::TrackOptions] options: the plugin specific options
|
78
|
+
#
|
79
|
+
def track(user_id:, event:, options: nil)
|
80
|
+
super
|
81
|
+
return unless enabled?
|
82
|
+
|
83
|
+
# Log
|
84
|
+
log = Itly::Loggers.vars_to_log(
|
85
|
+
user_id: user_id, event: event&.name, properties: event&.properties, options: options
|
86
|
+
)
|
87
|
+
logger&.info "#{id}: track(#{log})"
|
88
|
+
|
89
|
+
# Send through the client
|
90
|
+
call_end_point(options&.callback) do
|
91
|
+
::AmplitudeAPI.track ::AmplitudeAPI::Event.new(
|
92
|
+
user_id: user_id,
|
93
|
+
event_type: event.name,
|
94
|
+
event_properties: event.properties,
|
95
|
+
**(options&.to_hash || {})
|
96
|
+
)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
##
|
101
|
+
# Get the plugin ID
|
102
|
+
#
|
103
|
+
# @return [String] plugin id
|
104
|
+
#
|
105
|
+
def id
|
106
|
+
'amplitude'
|
107
|
+
end
|
108
|
+
|
109
|
+
private
|
110
|
+
|
111
|
+
def enabled?
|
112
|
+
!@disabled
|
113
|
+
end
|
114
|
+
|
115
|
+
def call_end_point(callback)
|
116
|
+
raise 'You need to give a block' unless block_given?
|
117
|
+
|
118
|
+
# Call remote endpoint (Note: the AmplitudeAPI is using Faraday)
|
119
|
+
response = yield
|
120
|
+
|
121
|
+
# yield to the callback passed in to options
|
122
|
+
callback&.call(response.status, response.body)
|
123
|
+
|
124
|
+
# Return in case of success
|
125
|
+
return if response.status >= 200 && response.status < 300
|
126
|
+
|
127
|
+
# Raise in case of error
|
128
|
+
message = "The remote end-point returned an error. Response status: #{response.status}. "\
|
129
|
+
"Raw body: #{response.body}"
|
130
|
+
raise Itly::RemoteError, message
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Itly
|
4
|
+
class Plugin
|
5
|
+
# Amplitude plugin class for Itly SDK
|
6
|
+
class Amplitude
|
7
|
+
##
|
8
|
+
# Amplitude specific plugin options class
|
9
|
+
#
|
10
|
+
class CallOptions < Itly::PluginCallOptions
|
11
|
+
PROPS = %w[device_id time groups app_version platform os_name os_version device_brand device_manufacturer
|
12
|
+
device_model carrier country region city dma language price quantity revenue productId revenueType
|
13
|
+
location_lat location_lng ip idfa idfv adid android_id event_id session_id insert_id].freeze
|
14
|
+
|
15
|
+
attr_reader :callback, *PROPS
|
16
|
+
|
17
|
+
class_eval(
|
18
|
+
<<-EVAL, __FILE__, __LINE__ + 1
|
19
|
+
def initialize(callback: nil, #{PROPS.collect { |p| "#{p}: nil" }.join ', '}) # def initialize(callback: nil, device_id: nil, ...)
|
20
|
+
super() # super()
|
21
|
+
@callback = callback # @callback = callback
|
22
|
+
#{PROPS.collect { |p| "@#{p} = #{p}" }.join "\n"} # @device_id = device_id
|
23
|
+
end # end
|
24
|
+
EVAL
|
25
|
+
)
|
26
|
+
|
27
|
+
##
|
28
|
+
# Return all properties to be passed to the client
|
29
|
+
# While excluding the `callback` property
|
30
|
+
#
|
31
|
+
# @return [Hash] properties
|
32
|
+
#
|
33
|
+
def to_hash
|
34
|
+
PROPS.each_with_object({}) { |prop, hash| hash[prop.to_sym] = send(prop) unless send(prop).nil? }
|
35
|
+
end
|
36
|
+
|
37
|
+
##
|
38
|
+
# Get the plugin description, for logs
|
39
|
+
#
|
40
|
+
# @return [String] description
|
41
|
+
#
|
42
|
+
def to_s
|
43
|
+
class_name = self.class.name.split('::').last
|
44
|
+
props = PROPS.collect { |prop| " #{prop}: #{send prop}" unless send(prop).nil? }.compact
|
45
|
+
"#<Amplitude::#{class_name} callback: #{callback.nil? ? 'nil' : 'provided'}#{props.join}>"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
##
|
50
|
+
# Amplitude specific plugin options class for calls to plugin methods
|
51
|
+
#
|
52
|
+
%w[Identify Group Page Track Alias].each do |name|
|
53
|
+
class_eval(
|
54
|
+
<<-EVAL, __FILE__, __LINE__ + 1
|
55
|
+
class #{name}Options < CallOptions # class IdentifyOptions < CallOptions
|
56
|
+
end # end
|
57
|
+
EVAL
|
58
|
+
)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'itly-sdk'
|
4
|
+
|
5
|
+
class Itly
|
6
|
+
class Plugin
|
7
|
+
class Amplitude
|
8
|
+
##
|
9
|
+
# Options for the Amplitude plugin class
|
10
|
+
#
|
11
|
+
# rubocop:disable Lint/EmptyClass
|
12
|
+
class Options
|
13
|
+
end
|
14
|
+
# rubocop:enable Lint/EmptyClass
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/sig/amplitude.rbs
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
class Itly
|
2
|
+
class Plugin
|
3
|
+
class Amplitude < Plugin
|
4
|
+
VERSION: String
|
5
|
+
|
6
|
+
attr_reader logger: Logger?
|
7
|
+
attr_reader disabled: bool
|
8
|
+
|
9
|
+
def load: (options: Itly::PluginOptions options) -> void
|
10
|
+
def identify: (user_id: String user_id, ?properties: propertiesHash?, ?options: Itly::Plugin::Amplitude::IdentifyOptions? options) -> void
|
11
|
+
def track: (user_id: String user_id, event: Itly::Event event, ?options: Itly::Plugin::Amplitude::TrackOptions? options) -> void
|
12
|
+
def id: () -> String
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def initialize: (api_key: String api_key, ?disabled: bool disabled) -> void
|
17
|
+
def enabled?: () -> bool
|
18
|
+
def call_end_point: ((^(Integer?, String?) -> void)? callback) ?{ () -> Faraday::Response } -> void
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class Itly
|
2
|
+
class Plugin
|
3
|
+
class Amplitude
|
4
|
+
class CallOptions < Itly::PluginCallOptions
|
5
|
+
attr_reader callback: (^(Integer?, String?) -> void)?
|
6
|
+
|
7
|
+
def to_hash: () -> Hash[Symbol, String | Integer | Float | untypedHash]
|
8
|
+
def to_s: () -> String
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def initialize: (?callback: (^(Integer?, String?) -> void)? callback, ?device_id: String? device_id, ?time: Integer? time, ?groups: untypedHash? groups, ?app_version: String? app_version, ?platform: String? platform, ?os_name: String? os_name, ?os_version: String? os_version, ?device_brand: String? device_brand, ?device_manufacturer: String? device_manufacturer, ?device_model: String? device_model, ?carrier: String? carrier, ?country: String? country, ?region: String? region, ?city: String? city, ?dma: String? dma, ?language: String? language, ?price: Float? price, ?quantity: Integer? quantity, ?revenue: Float? revenue, ?productId: String? productId, ?revenueType: String? revenueType, ?location_lat: Float? location_lat, ?location_lng: Float? location_lng, ?ip: String? ip, ?idfa: String? idfa, ?idfv: String? idfv, ?adid: String? adid, ?android_id: String? android_id, ?event_id: Integer? event_id, ?session_id: Integer? session_id, ?insert_id: String? insert_id) -> void
|
13
|
+
end
|
14
|
+
|
15
|
+
class IdentifyOptions < CallOptions
|
16
|
+
end
|
17
|
+
|
18
|
+
class GroupOptions < CallOptions
|
19
|
+
end
|
20
|
+
|
21
|
+
class PageOptions < CallOptions
|
22
|
+
end
|
23
|
+
|
24
|
+
class TrackOptions < CallOptions
|
25
|
+
end
|
26
|
+
|
27
|
+
class AliasOptions < CallOptions
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/sig/options.rbs
ADDED
metadata
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: itly-plugin-amplitude
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Iteratively
|
8
|
+
- Benjamin Bouchet
|
9
|
+
- Justin Fiedler
|
10
|
+
- Andrey Sokolov
|
11
|
+
autorequire:
|
12
|
+
bindir: bin
|
13
|
+
cert_chain: []
|
14
|
+
date: 2021-06-15 00:00:00.000000000 Z
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: amplitude-api
|
18
|
+
requirement: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - "~>"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0.3'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0.3'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: itly-sdk
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - "~>"
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '0.1'
|
37
|
+
type: :runtime
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - "~>"
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0.1'
|
44
|
+
description: Track and validate analytics with a unified, extensible interface that
|
45
|
+
works with all your 3rd party analytics providers.
|
46
|
+
email:
|
47
|
+
- support@iterative.ly
|
48
|
+
executables: []
|
49
|
+
extensions: []
|
50
|
+
extra_rdoc_files: []
|
51
|
+
files:
|
52
|
+
- ".rspec"
|
53
|
+
- Gemfile
|
54
|
+
- Steepfile
|
55
|
+
- bin/console
|
56
|
+
- bin/rspec
|
57
|
+
- bin/setup
|
58
|
+
- itly-plugin-amplitude.gemspec
|
59
|
+
- lib/itly/plugin-amplitude.rb
|
60
|
+
- lib/itly/plugin/amplitude/amplitude.rb
|
61
|
+
- lib/itly/plugin/amplitude/call_options.rb
|
62
|
+
- lib/itly/plugin/amplitude/options.rb
|
63
|
+
- lib/itly/plugin/amplitude/version.rb
|
64
|
+
- sig/amplitude.rbs
|
65
|
+
- sig/call_options.rbs
|
66
|
+
- sig/lib/faraday_response.rbs
|
67
|
+
- sig/lib/monitor_mixin.rbs
|
68
|
+
- sig/options.rbs
|
69
|
+
homepage: https://github.com/iterativelyhq/itly-sdk-ruby
|
70
|
+
licenses:
|
71
|
+
- MIT
|
72
|
+
metadata:
|
73
|
+
allowed_push_host: https://rubygems.org/
|
74
|
+
homepage_uri: https://github.com/iterativelyhq/itly-sdk-ruby
|
75
|
+
source_code_uri: https://github.com/iterativelyhq/itly-sdk-ruby/plugin-amplitude
|
76
|
+
post_install_message:
|
77
|
+
rdoc_options: []
|
78
|
+
require_paths:
|
79
|
+
- lib
|
80
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: 2.6.0
|
85
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
requirements: []
|
91
|
+
rubygems_version: 3.0.3.1
|
92
|
+
signing_key:
|
93
|
+
specification_version: 4
|
94
|
+
summary: Amplitude plugin for Iteratively SDK for Ruby
|
95
|
+
test_files: []
|