path-reporting 0.1.3 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 612edf8ed822d34efd5492f054daccdca4c8c1d667968bbbb6792d970f84f48e
4
- data.tar.gz: 87c775d49a7299a74309e0e34ef024027b9d2d36b7e1cd845a83dcf2d473e55e
3
+ metadata.gz: 65674aaa398a650317c350551a9687bc580927ca8c69be1aec45c5888e2135a0
4
+ data.tar.gz: 387f6fe0f5ea344dfa3bda38bdc9caa01ca24f4d99eb56fba464624e54f137bc
5
5
  SHA512:
6
- metadata.gz: 2eccd9730018b5e4e1468229ebc630e39a539dad448b5d7b71a8aa922a63d7912d56dbca08decf109f287710ac282f36d93d0061480f14df871c8c5e3aa614cd
7
- data.tar.gz: c1f436dae888ddd42d396d9b7cd3f7f50e4a6ad6f9767e8eb4b6b9675bc2afc2f2a72016b5d2a1fc51ad90ca159fad08f02d48b3fe9036da7149afd1d299fe49
6
+ metadata.gz: 310a25c14394ac6f910b751ae09ff8aa6d9a49c048fe36724ce4cb42395f7191c550cc223add47ffcda3c4e2c91c2a70d2480b7e7d50e093ff5c92f7eaec7d71
7
+ data.tar.gz: bfe1442c36f0ea3822d9294ac156183b944be879ef39baec1cbca8598e820cca6a1a8f4fb58190843d8d00e7ba94890023e0e8d9471a67ae35550502bc3343a0
data/.rubocop.yml CHANGED
@@ -23,6 +23,10 @@ Metrics/MethodLength:
23
23
  # is difficult to break up reasonably and keep it easy to understand
24
24
  - scrub_pii
25
25
 
26
+ Metrics/AbcSize:
27
+ IgnoredMethods:
28
+ - record
29
+
26
30
  Metrics/ParameterLists:
27
31
  Max: 7
28
32
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- path-reporting (0.1.3)
4
+ path-reporting (0.2.0)
5
5
  amplitude-api
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -42,8 +42,8 @@ Path::Reporting.analytics.record(
42
42
  product_area: Constants::ANALYTICS_PRODUCT_AREA_MATCHING,
43
43
  name: 'Preferred provider multiple valid matches',
44
44
  user: @contact.analytics_friendly_hash,
45
- user_type: Path::Reporting::UserType.PATIENT,
46
- trigger: Path::Reporting::Trigger.PAGE_VIEW,
45
+ user_type: Path::Reporting::UserType::PATIENT,
46
+ trigger: Path::Reporting::Trigger::PAGE_VIEW,
47
47
  metadata: analytics_metadata,
48
48
  )
49
49
  ```
@@ -57,6 +57,8 @@ module Path
57
57
  class Analytics
58
58
  # Amplitude analytics is our primary analytics channel for production
59
59
  class Amplitude
60
+ attr_reader :config
61
+
60
62
  # Setup and configure AmplitudeAPI with the given configuration
61
63
  # @param config [AmplitudeAPI::Config] the configuration for AmplitudeAPI
62
64
  # @see https://www.rubydoc.info/gems/amplitude-api/AmplitudeAPI/Config AmplitudeAPI::Config Documentation
@@ -64,7 +66,7 @@ module Path
64
66
  def initialize(config)
65
67
  @config = config
66
68
 
67
- config.amplitude_config.each do |key, value|
69
+ config.analytics.amplitude_config.each do |key, value|
68
70
  AmplitudeAPI.config.instance_variable_set("@#{key}", value)
69
71
  end
70
72
  end
@@ -81,9 +83,10 @@ module Path
81
83
  metadata = metadata.dup
82
84
  user[:user_type] = user_type
83
85
  metadata[:trigger] = trigger
86
+ metadata[:system_name] = config.system_name
84
87
 
85
88
  event_props = {
86
- user_id: user[:id].to_s,
89
+ user_id: (user[:id] || user["id"]).to_s,
87
90
  user_properties: scrub_pii(user),
88
91
  event_type: name,
89
92
  event_properties: scrub_pii(metadata)
@@ -92,7 +95,10 @@ module Path
92
95
  event_props[key] = metadata[key] if metadata.key? key
93
96
  end
94
97
 
95
- AmplitudeAPI.track AmplitudeAPI::Event.new event_props
98
+ response = AmplitudeAPI.track AmplitudeAPI::Event.new event_props
99
+ raise Error, response.body unless response.success?
100
+
101
+ response
96
102
  end
97
103
 
98
104
  # Scrub known PII keys from a hash
@@ -117,6 +123,8 @@ module Path
117
123
 
118
124
  data
119
125
  end
126
+
127
+ class Error < StandardError; end
120
128
  end
121
129
  end
122
130
  end
@@ -44,7 +44,7 @@ module Path
44
44
  # @return [Hash] amplitude configuration options as passed along to the amplitude-api gem
45
45
  # @see https://www.rubydoc.info/gems/amplitude-api/AmplitudeAPI/Config AmplitudeAPI::Config
46
46
  def amplitude_config=(conf)
47
- @amplitude_enabled = !conf.nil?
47
+ @amplitude_enabled = !(conf.nil? || conf.empty?)
48
48
  @amplitude_config = conf
49
49
  end
50
50
 
@@ -10,7 +10,7 @@ module Path
10
10
  # @param config [Analytics::Configuration] the configuration for the reporter
11
11
  # @see Analytics::Configuration
12
12
  def initialize(config)
13
- @config = config
13
+ @config = config.analytics
14
14
  end
15
15
 
16
16
  # Log the analytics event to the configured logger
@@ -36,14 +36,14 @@ module Path
36
36
  # @private
37
37
  def setup_amplitude
38
38
  # Amplitude reporting for metrics
39
- return Path::Reporting::Analytics::Amplitude.new @config if @config.amplitude_enabled?
39
+ return Path::Reporting::Analytics::Amplitude.new @config if @config.analytics.amplitude_enabled?
40
40
 
41
41
  nil
42
42
  end
43
43
 
44
44
  # @private
45
45
  def setup_console
46
- return Path::Reporting::Analytics::Console.new @config if @config.console_enabled?
46
+ return Path::Reporting::Analytics::Console.new @config if @config.analytics.console_enabled?
47
47
 
48
48
  nil
49
49
  end
@@ -122,7 +122,7 @@ module Path
122
122
  # product_area: Constants::ANALYTICS_PRODUCT_AREA_MATCHING,
123
123
  # name: 'Preferred provider multiple valid matches',
124
124
  # user: @contact.analytics_friendly_hash,
125
- # user_type: PathReporting::UserType.PATIENT,
125
+ # user_type: PathReporting::UserType::PATIENT,
126
126
  # trigger: PathReporting::Trigger.PAGE_VIEW,
127
127
  # metadata: analytics_metadata,
128
128
  # )
@@ -132,12 +132,12 @@ module Path
132
132
  # product_area: Constants::ANALYTICS_PRODUCT_AREA_MATCHING,
133
133
  # name: 'No preferred provider',
134
134
  # user: @contact.analytics_friendly_hash,
135
- # user_type: PathReporting::UserType.PATIENT,
135
+ # user_type: PathReporting::UserType::PATIENT,
136
136
  # trigger: PathReporting::Trigger.PAGE_VIEW,
137
137
  # )
138
138
  #
139
139
  # analytics_reported.each do |status|
140
- # Rails.logger.warn("#{status.reporter} failed") unless status.result.nil?
140
+ # Rails.logger.warn("#{status.reporter} failed") unless status[:result].nil?
141
141
  # end
142
142
  #
143
143
  # @raise [StandardError] if no user is provided or user does not have id
@@ -146,8 +146,8 @@ module Path
146
146
  #
147
147
  # @return [Array] An array of result hashes with two keys:
148
148
  #
149
- # - `reporter` [String] the analytics reporter the result is for
150
- # - `result` [nil | StandardError] what the result of running this
149
+ # - `:reporter` [String] the analytics reporter the result is for
150
+ # - `:result` [nil | StandardError] what the result of running this
151
151
  # reporter was. If it did not run, it will always be `nil`
152
152
  #
153
153
  # @see https://docs.google.com/document/d/1axnk1EkKCb__sxtvMomrPNup3wsviDOAefQWwXU3Z3U/edit# Analytics Guide
@@ -158,13 +158,13 @@ module Path
158
158
  product_area:,
159
159
  name:,
160
160
  user:,
161
- user_type: UserType.PATIENT,
162
- trigger: Trigger.INTERACTION,
161
+ user_type: UserType::PATIENT,
162
+ trigger: Trigger::INTERACTION,
163
163
  metadata: {}
164
164
  )
165
- throw Error("No user provided when reporting analytics") if !user || !user[:id]
166
- throw Error("Invalid UserType #{user_type}") unless UserType.valid?(user_type)
167
- throw Error("Invalid Trigger #{trigger}") unless Trigger.valid?(trigger)
165
+ throw Error.new("No user hash provided when reporting analytics") if !user.is_a?(Hash) || !(user[:id] || user["id"])
166
+ throw Error.new("Invalid UserType #{user_type}") unless UserType.valid?(user_type)
167
+ throw Error.new("Invalid Trigger #{trigger}") unless Trigger.valid?(trigger)
168
168
 
169
169
  clients.map do |reporter, client|
170
170
  {
@@ -185,7 +185,6 @@ module Path
185
185
  # @private
186
186
  def send_event_to_client(client, event)
187
187
  client&.record(**event)
188
- nil
189
188
  rescue StandardError => e
190
189
  e
191
190
  end
@@ -9,6 +9,7 @@ module Path
9
9
  # @return [Analytics::Configuration] the configuration for analytics reporting
10
10
  class Configuration
11
11
  attr_reader :analytics
12
+ attr_accessor :system_name
12
13
 
13
14
  # Create a new configuration. Sub configuration's will be used by the
14
15
  # various reporting sections.
@@ -4,22 +4,22 @@ module Path
4
4
  module Reporting
5
5
  # The trigger or cause of reporting events
6
6
  class Trigger
7
- class << self
8
- # Interaction: When a direct intentional user action is the cause of
9
- # this event that is not a simple navigation. E.g. Submitted form or
10
- # changed password
11
- INTERACTION = "Interaction"
12
- # Page view: When the event was an indirect result of viewing something.
13
- # E.g. auto-assigning a provider or appointment because the user has an
14
- # existing provider already
15
- # @note Because of usage limits, we do not want to record page views
16
- # as a separate action, this is only for indirect consequences that
17
- # result in a change in something either for the user or for our
18
- # systems
19
- PAGE_VIEW = "Page view"
20
- # Automation: Some automation or tool was the cause of this event
21
- AUTOMATION = "Automation"
7
+ # Interaction: When a direct intentional user action is the cause of
8
+ # this event that is not a simple navigation. E.g. Submitted form or
9
+ # changed password
10
+ INTERACTION = "Interaction"
11
+ # Page view: When the event was an indirect result of viewing something.
12
+ # E.g. auto-assigning a provider or appointment because the user has an
13
+ # existing provider already
14
+ # @note Because of usage limits, we do not want to record page views
15
+ # as a separate action, this is only for indirect consequences that
16
+ # result in a change in something either for the user or for our
17
+ # systems
18
+ PAGE_VIEW = "Page view"
19
+ # Automation: Some automation or tool was the cause of this event
20
+ AUTOMATION = "Automation"
22
21
 
22
+ class << self
23
23
  # @private
24
24
  def triggers
25
25
  [
@@ -32,7 +32,7 @@ module Path
32
32
  # Check if a given item is a valid Trigger
33
33
  # @param maybe_trigger [Any] item to check
34
34
  def valid?(maybe_trigger)
35
- triggers.includes? maybe_trigger
35
+ triggers.include? maybe_trigger
36
36
  end
37
37
  end
38
38
  end
@@ -4,20 +4,20 @@ module Path
4
4
  module Reporting
5
5
  # User types that data may be recorded for or on
6
6
  class UserType
7
- class << self
8
- # Patient or potential patient
9
- PATIENT = "Patient"
10
- # Provider, which can be any sub-type (e.g. therapist)
11
- PROVIDER = "Provider"
12
- # Insurer, not currently in-use
13
- INSURER = "Insurer"
14
- # Operator or any internal non-developer
15
- OPERATOR = "Operator"
16
- # Developer; mostly relevant for backfills or manual intervention
17
- DEVELOPER = "Developer"
18
- # System, either first-party or third-party
19
- SYSTEM = "System"
7
+ # Patient or potential patient
8
+ PATIENT = "Patient"
9
+ # Provider, which can be any sub-type (e.g. therapist)
10
+ PROVIDER = "Provider"
11
+ # Insurer, not currently in-use
12
+ INSURER = "Insurer"
13
+ # Operator or any internal non-developer
14
+ OPERATOR = "Operator"
15
+ # Developer; mostly relevant for backfills or manual intervention
16
+ DEVELOPER = "Developer"
17
+ # System, either first-party or third-party
18
+ SYSTEM = "System"
20
19
 
20
+ class << self
21
21
  # @private
22
22
  def types
23
23
  [
@@ -33,7 +33,7 @@ module Path
33
33
  # Check if a given item is a valid UserType
34
34
  # @param maybe_type [Any] item to check
35
35
  def valid?(maybe_type)
36
- types.includes? maybe_type
36
+ types.include? maybe_type
37
37
  end
38
38
  end
39
39
  end
@@ -3,6 +3,6 @@
3
3
  module Path
4
4
  module Reporting
5
5
  # Current version of the module
6
- VERSION = "0.1.3"
6
+ VERSION = "0.2.0"
7
7
  end
8
8
  end
@@ -43,7 +43,7 @@ module Path
43
43
  @config = Configuration.new
44
44
  yield(@config) if block_given?
45
45
 
46
- @analytics = Path::Reporting::Analytics.new @config.analytics
46
+ @analytics = Path::Reporting::Analytics.new @config
47
47
  self
48
48
  end
49
49
 
@@ -52,7 +52,7 @@ module Path
52
52
  def analytics
53
53
  raise Error, "Must call init on Path::Reporting library before using" unless @initialized
54
54
 
55
- @analyitcs
55
+ @analytics
56
56
  end
57
57
 
58
58
  # Resets the module to an uninitialized state. Mostly used for testing
@@ -60,7 +60,7 @@ module Path
60
60
  def reset!
61
61
  @initialized = false
62
62
  @config = nil
63
- @analyitcs = nil
63
+ @analytics = nil
64
64
  self
65
65
  end
66
66
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: path-reporting
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexis Hushbeck
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-04-29 00:00:00.000000000 Z
11
+ date: 2022-05-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: amplitude-api