itly-sdk 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rspec +1 -0
- data/Gemfile +12 -0
- data/Steepfile +9 -0
- data/bin/console +15 -0
- data/bin/rspec +18 -0
- data/bin/setup +8 -0
- data/itly-sdk.gemspec +29 -0
- data/lib/itly-sdk.rb +15 -0
- data/lib/itly/event.rb +58 -0
- data/lib/itly/exceptions.rb +10 -0
- data/lib/itly/itly.rb +404 -0
- data/lib/itly/loggers.rb +55 -0
- data/lib/itly/options.rb +114 -0
- data/lib/itly/options/environment.rb +24 -0
- data/lib/itly/options/validation.rb +17 -0
- data/lib/itly/plugin.rb +116 -0
- data/lib/itly/plugin_call_options.rb +18 -0
- data/lib/itly/plugin_options.rb +22 -0
- data/lib/itly/plugins.rb +25 -0
- data/lib/itly/validation_response.rb +41 -0
- data/lib/itly/version.rb +6 -0
- data/sig/aliases.rbs +3 -0
- data/sig/event.rbs +16 -0
- data/sig/exceptions.rbs +11 -0
- data/sig/itly.rbs +32 -0
- data/sig/lib/monitor_mixin.rbs +3 -0
- data/sig/loggers.rbs +8 -0
- data/sig/options.rbs +18 -0
- data/sig/options/environment.rbs +8 -0
- data/sig/options/validation.rbs +10 -0
- data/sig/plugin.rbs +21 -0
- data/sig/plugin_call_options.rbs +4 -0
- data/sig/plugin_options.rbs +10 -0
- data/sig/plugins.rbs +4 -0
- data/sig/validation_response.rbs +13 -0
- metadata +85 -0
data/lib/itly/loggers.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Itly
|
4
|
+
##
|
5
|
+
# Loggers class, provide default usual loggers for convenience
|
6
|
+
#
|
7
|
+
class Loggers
|
8
|
+
##
|
9
|
+
# Logger to log into 'itly.log' file on the current directory
|
10
|
+
#
|
11
|
+
# @return [Logger] the logger
|
12
|
+
#
|
13
|
+
def self.itly_dot_log
|
14
|
+
Logger.new 'itly.log'
|
15
|
+
end
|
16
|
+
|
17
|
+
##
|
18
|
+
# Logger to log to standard out
|
19
|
+
#
|
20
|
+
# @return [Logger] the logger
|
21
|
+
#
|
22
|
+
def self.std_out
|
23
|
+
Logger.new $stdout
|
24
|
+
end
|
25
|
+
|
26
|
+
##
|
27
|
+
# No logger
|
28
|
+
#
|
29
|
+
# @return [NilClass] nothing
|
30
|
+
#
|
31
|
+
def self.nil_logger
|
32
|
+
nil
|
33
|
+
end
|
34
|
+
|
35
|
+
##
|
36
|
+
# Shorthand to filter variables in a log message
|
37
|
+
#
|
38
|
+
# Check if the variable has a value, and return a list for the log message
|
39
|
+
#
|
40
|
+
# @param [Hash] vars: list of variables
|
41
|
+
# @return [String] log message
|
42
|
+
#
|
43
|
+
def self.vars_to_log(vars)
|
44
|
+
vars.collect do |name, value|
|
45
|
+
next if value.nil?
|
46
|
+
|
47
|
+
if value.is_a?(Hash) || value.is_a?(Array)
|
48
|
+
"#{name}: #{value}" if value.any?
|
49
|
+
else
|
50
|
+
"#{name}: #{value}"
|
51
|
+
end
|
52
|
+
end.compact.join ', '
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/itly/options.rb
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
# Itly main class
|
6
|
+
class Itly
|
7
|
+
attr_reader :options
|
8
|
+
|
9
|
+
##
|
10
|
+
# Options class for Itly object initialization
|
11
|
+
#
|
12
|
+
# Properties:
|
13
|
+
#
|
14
|
+
# +disabled+: A True/False specifying whether the Itly SDK does any work.
|
15
|
+
# When true, all calls to the Itly SDK will be no-ops. Useful in local or development environments.
|
16
|
+
#
|
17
|
+
# Defaults to false.
|
18
|
+
#
|
19
|
+
# +environment+: A Symbol specifying the environment the Itly SDK is running in.
|
20
|
+
# Can be +Itly::Options::Environment::DEVELOPMENT+ or +Itly::Options::Environment::PRODUCTION+
|
21
|
+
#
|
22
|
+
# Environment determines which Access Token is used to load the underlying analytics provider libraries.
|
23
|
+
# The option also determines safe defaults for handling event validation errors. In production,
|
24
|
+
# when the SDK detects an invalid event, it will log an error but still let the event through.
|
25
|
+
# In development, the SDK will throw an exception to alert you that something is wrong.
|
26
|
+
#
|
27
|
+
# Defaults to +DEVELOPMENT+.
|
28
|
+
#
|
29
|
+
# +plugins+: Pass the list of Plugins object that will receive all events to be tracked.
|
30
|
+
#
|
31
|
+
# Example:
|
32
|
+
# my_plugin = MyPlugin.new api_key: 'abc123'
|
33
|
+
# itly = Itly.new
|
34
|
+
# itly.load do |options|
|
35
|
+
# options.plugins = [my_plugin]
|
36
|
+
# end
|
37
|
+
#
|
38
|
+
# +validation+: Configures the Itly SDK's behavior when events or traits fail validation.
|
39
|
+
# Value can be one of the following:
|
40
|
+
# - +Itly::Options::Validation::DISABLED+: Disables validation altogether.
|
41
|
+
# - +Itly::Options::Validation::TRACK_INVALID+: Specifies whether events that failed validation
|
42
|
+
# should still be tracked. Defaults to false in development, true in production.
|
43
|
+
# - +Itly::Options::Validation::ERROR_ON_INVALID+: Specifies whether the SDK should throw
|
44
|
+
# an exception when validation fails. Defaults to true in development, false in production.
|
45
|
+
#
|
46
|
+
# Defaults to +ERROR_ON_INVALID+ if the environment is set to +DEVELOPMENT+, or +TRACK_INVALID+
|
47
|
+
# if the environment is set to +PRODUCTION+.
|
48
|
+
#
|
49
|
+
# +logger+: Allow to set a custom Logger. Must be a object of the Logger class or child class, and can be nil.
|
50
|
+
# Deflault to nil, to disable Logging.
|
51
|
+
#
|
52
|
+
class Options
|
53
|
+
attr_accessor :disabled, :logger, :plugins, :environment
|
54
|
+
attr_writer :validation
|
55
|
+
|
56
|
+
##
|
57
|
+
# Create a new Options object with default values
|
58
|
+
#
|
59
|
+
def initialize(
|
60
|
+
environment: Itly::Options::Environment::DEVELOPMENT,
|
61
|
+
disabled: false,
|
62
|
+
plugins: [],
|
63
|
+
validation: nil,
|
64
|
+
logger: nil
|
65
|
+
)
|
66
|
+
@environment = environment
|
67
|
+
@disabled = disabled
|
68
|
+
@plugins = plugins
|
69
|
+
@validation = validation
|
70
|
+
@logger = logger
|
71
|
+
end
|
72
|
+
|
73
|
+
##
|
74
|
+
# Returns the options that are passed to plugin #load
|
75
|
+
#
|
76
|
+
# @return [Itly::PluginOptions] plugin options object
|
77
|
+
#
|
78
|
+
def for_plugin
|
79
|
+
::Itly::PluginOptions.new environment: environment, logger: logger
|
80
|
+
end
|
81
|
+
|
82
|
+
##
|
83
|
+
# Return the current validation behavior
|
84
|
+
#
|
85
|
+
# @return [Itly::Options::Validation] validation behavior
|
86
|
+
#
|
87
|
+
def validation
|
88
|
+
if @validation.nil?
|
89
|
+
if development?
|
90
|
+
Itly::Options::Validation::ERROR_ON_INVALID
|
91
|
+
else
|
92
|
+
Itly::Options::Validation::TRACK_INVALID
|
93
|
+
end
|
94
|
+
else
|
95
|
+
@validation
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# Shortcut methods
|
101
|
+
private
|
102
|
+
|
103
|
+
def enabled?
|
104
|
+
!options.disabled
|
105
|
+
end
|
106
|
+
|
107
|
+
def validation_enabled?
|
108
|
+
options.validation != Itly::Options::Validation::DISABLED
|
109
|
+
end
|
110
|
+
|
111
|
+
def logger
|
112
|
+
options.logger
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Itly
|
4
|
+
##
|
5
|
+
# Options class for Itly object initialization
|
6
|
+
#
|
7
|
+
class Options
|
8
|
+
##
|
9
|
+
# This module contains values for the field +environment+ of the +Option+ object
|
10
|
+
#
|
11
|
+
module Environment
|
12
|
+
DEVELOPMENT = :development
|
13
|
+
PRODUCTION = :production
|
14
|
+
end
|
15
|
+
|
16
|
+
def development?
|
17
|
+
@environment == Itly::Options::Environment::DEVELOPMENT
|
18
|
+
end
|
19
|
+
|
20
|
+
def production?
|
21
|
+
@environment == Itly::Options::Environment::PRODUCTION
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Itly
|
4
|
+
##
|
5
|
+
# Options class for Itly object initialization
|
6
|
+
#
|
7
|
+
class Options
|
8
|
+
##
|
9
|
+
# This module contains values for the field +validation+ of the +Option+ object
|
10
|
+
#
|
11
|
+
module Validation
|
12
|
+
DISABLED = 0
|
13
|
+
TRACK_INVALID = 1
|
14
|
+
ERROR_ON_INVALID = 2
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/itly/plugin.rb
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Itly main class
|
4
|
+
class Itly
|
5
|
+
##
|
6
|
+
# Parent class for all plugins
|
7
|
+
#
|
8
|
+
# When creating a custom plugin, you need to create a child class of Itly::Plugin
|
9
|
+
#
|
10
|
+
class Plugin
|
11
|
+
##
|
12
|
+
# Called when the Itly SDK is being loaded and is ready to load your plugin.
|
13
|
+
#
|
14
|
+
# @param [Itly::PluginOptions] options: The option for the plugin
|
15
|
+
#
|
16
|
+
def load(options:); end
|
17
|
+
|
18
|
+
##
|
19
|
+
# Identify a user in your application and associate all future events with
|
20
|
+
# their identity, or to set their traits.
|
21
|
+
#
|
22
|
+
# @param [String] user_id: the id of the user in your application
|
23
|
+
# @param [Hash] properties: the properties containing user's traits to pass to your application
|
24
|
+
# @param [Itly::PluginCallOptions] options: plugin specific options.
|
25
|
+
#
|
26
|
+
def identify(user_id:, properties: nil, options: nil); end
|
27
|
+
|
28
|
+
def post_identify(user_id:, properties:, validation_results:); end
|
29
|
+
|
30
|
+
##
|
31
|
+
# Associate a user with their group (for example, their department or company),
|
32
|
+
# or to set the group's traits.
|
33
|
+
#
|
34
|
+
# @param [String] user_id: the id of the user in your application
|
35
|
+
# @param [String] group_id: the id of the group in your application
|
36
|
+
# @param [Hash] properties: the properties to pass to your application
|
37
|
+
# @param [Itly::PluginCallOptions] options: plugin specific option.
|
38
|
+
#
|
39
|
+
def group(user_id:, group_id:, properties: nil, options: nil); end
|
40
|
+
|
41
|
+
def post_group(user_id:, group_id:, properties:, validation_results:); end
|
42
|
+
|
43
|
+
##
|
44
|
+
# Let record page views, along with optional extra information about the page viewed by the user.
|
45
|
+
#
|
46
|
+
# @param [String] user_id: the id of the user in your application
|
47
|
+
# @param [String] category: the category of the page
|
48
|
+
# @param [String] name: the name of the page.
|
49
|
+
# @param [Hash] properties: the properties to pass to your application
|
50
|
+
# @param [Itly::PluginCallOptions] options: plugin specific option.
|
51
|
+
#
|
52
|
+
def page(user_id:, category: nil, name: nil, properties: nil, options: nil); end
|
53
|
+
|
54
|
+
def post_page(user_id:, category:, name:, properties:, validation_results:); end
|
55
|
+
|
56
|
+
##
|
57
|
+
# Track an event, call the event's corresponding function.
|
58
|
+
#
|
59
|
+
# See +Itly#track+ for more information
|
60
|
+
#
|
61
|
+
# @param [String] user_id: the id of the user in your application
|
62
|
+
# @param [Event] event: the events to track
|
63
|
+
# @param [Itly::PluginCallOptions] options: plugin specific option.
|
64
|
+
#
|
65
|
+
def track(user_id:, event:, options: nil); end
|
66
|
+
|
67
|
+
def post_track(user_id:, event:, validation_results:); end
|
68
|
+
|
69
|
+
##
|
70
|
+
# Associate one user ID with another (typically a known user ID with an anonymous one).
|
71
|
+
#
|
72
|
+
# @param [String] user_id: The ID that the user will be identified by going forward.
|
73
|
+
# @param [String] previous_id: The ID the user has been identified by so far.
|
74
|
+
# @param [Itly::PluginCallOptions] options: plugin specific option.
|
75
|
+
#
|
76
|
+
def alias(user_id:, previous_id:, options: nil); end
|
77
|
+
|
78
|
+
def post_alias(user_id:, previous_id:); end
|
79
|
+
|
80
|
+
##
|
81
|
+
# Flush data
|
82
|
+
#
|
83
|
+
def flush; end
|
84
|
+
|
85
|
+
##
|
86
|
+
# Stop all processes and free resources.
|
87
|
+
#
|
88
|
+
def shutdown; end
|
89
|
+
|
90
|
+
##
|
91
|
+
# Reset the SDK's (and all plugins') state. This method is usually called when a user logs out.
|
92
|
+
#
|
93
|
+
def reset; end
|
94
|
+
|
95
|
+
##
|
96
|
+
# Validate an Event
|
97
|
+
#
|
98
|
+
# See +Itly#validate+ for more information
|
99
|
+
#
|
100
|
+
# Your plugin can return a +Itly::ValidationResponse+ object to provide success status
|
101
|
+
# and validation message; otherwise it can return +nil+ which will be interpreted as valid=true
|
102
|
+
#
|
103
|
+
def validate(event:); end
|
104
|
+
|
105
|
+
##
|
106
|
+
# Get the plugin ID, which is the underscored class name. Use only the child class in case of nested classes
|
107
|
+
#
|
108
|
+
# @return [String] plugin id
|
109
|
+
#
|
110
|
+
def id
|
111
|
+
name = (self.class.name || 'UnknownPluginClass').gsub('::', '-')
|
112
|
+
name = (name || 'UnknownPluginClass').gsub(/([A-Z]+)/, '_\1').gsub(/-_/, '-').sub(/^_/, '').sub(/^itly-/i, '')
|
113
|
+
name.downcase
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Itly
|
4
|
+
##
|
5
|
+
# PluginCallOptions virtual class
|
6
|
+
# Parent class of plugin specific options
|
7
|
+
#
|
8
|
+
class PluginCallOptions
|
9
|
+
##
|
10
|
+
# Inspect the object
|
11
|
+
#
|
12
|
+
# @return [String] the object description
|
13
|
+
#
|
14
|
+
def inspect
|
15
|
+
to_s
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Itly main class
|
4
|
+
class Itly
|
5
|
+
##
|
6
|
+
# PluginOptions class for Itly Plugins #load methods
|
7
|
+
#
|
8
|
+
# +environment+: A Symbol specifying the environment the Itly SDK is running in. #
|
9
|
+
# +logger+: Allow to set a custom Logger.
|
10
|
+
#
|
11
|
+
class PluginOptions
|
12
|
+
attr_reader :environment, :logger
|
13
|
+
|
14
|
+
##
|
15
|
+
# Create a new PluginOptions object
|
16
|
+
#
|
17
|
+
def initialize(environment:, logger:)
|
18
|
+
@environment = environment
|
19
|
+
@logger = logger
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/itly/plugins.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Itly main class
|
4
|
+
class Itly
|
5
|
+
##
|
6
|
+
# Manage list of Plugins
|
7
|
+
#
|
8
|
+
module Plugins
|
9
|
+
private
|
10
|
+
|
11
|
+
# Yield the block with each instanciated plugin
|
12
|
+
def run_on_plugins
|
13
|
+
raise 'Need a block' unless block_given?
|
14
|
+
|
15
|
+
options.plugins.collect do |plugin|
|
16
|
+
yield plugin
|
17
|
+
rescue StandardError => e
|
18
|
+
logger&.error "Itly Error in #{plugin.class.name}. #{e.class.name}: #{e.message}"
|
19
|
+
raise e if options.development?
|
20
|
+
|
21
|
+
nil
|
22
|
+
end.compact
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Itly
|
4
|
+
##
|
5
|
+
# Contains the result of a validation
|
6
|
+
#
|
7
|
+
# +valid+: [True/False] indicating if the validation succeeded or failed
|
8
|
+
# +plugin_id+: [String] an id identifying your plugin
|
9
|
+
# +message+: [String] the message you want to appear in the logs in case of error
|
10
|
+
#
|
11
|
+
class ValidationResponse
|
12
|
+
attr_reader :valid, :plugin_id, :message
|
13
|
+
|
14
|
+
##
|
15
|
+
# Create a new ValidationResponse object
|
16
|
+
#
|
17
|
+
def initialize(valid:, plugin_id:, message: '')
|
18
|
+
@valid = valid
|
19
|
+
@plugin_id = plugin_id
|
20
|
+
@message = message
|
21
|
+
end
|
22
|
+
|
23
|
+
##
|
24
|
+
# Describe the object
|
25
|
+
#
|
26
|
+
# @return [String] the object description
|
27
|
+
#
|
28
|
+
def to_s
|
29
|
+
"#<#{self.class.name}: valid: #{valid}, plugin_id: #{plugin_id}, message: #{message}>"
|
30
|
+
end
|
31
|
+
|
32
|
+
##
|
33
|
+
# Inspect the object
|
34
|
+
#
|
35
|
+
# @return [String] the object description
|
36
|
+
#
|
37
|
+
def inspect
|
38
|
+
to_s
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|