evva 0.10.0 → 0.11.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: dec4f42e824897d939df66cc400f64c7d0f8ed0afa61d7c47f90e35a3730593f
4
- data.tar.gz: 46151f2d8987db8501e73c84dd1d7cddf96fa8364d71495b9e838817bf73b24e
3
+ metadata.gz: 2ee0a5c710dfc85ab04a707bd4792bbab9a59c81aceff7394f6efe243c2deb5d
4
+ data.tar.gz: d53cec7c07687a96dc24c8fb65f8a32f2e523af19b51ef72f7558fb2c8068dc6
5
5
  SHA512:
6
- metadata.gz: 0e48b6d338ad0cbea9604afe19ca59b1bcf4842cb28d10681c918a1a3e4532afc9346939c4748bc85cb753f5520e5552c3bc5fa7c45f08050da301249d9f1de9
7
- data.tar.gz: 0bea87253e07e92fbd7546ee66dd798b6418a7534c1f5655f42990f4d8ec83617bc081c763422ddb1a6c13eec40a1c2d33dc0e4e008c4ce638c17bb732328837
6
+ metadata.gz: 6b7267254416b123602b3d5f3ba7c5d0577d255b981ba9404ab28e2e02dcebc0d8f08f4373af847508502c5a0d41cb3f05733b98a98d79f0c226b871f1eae607
7
+ data.tar.gz: 80ee70c43aec3f46304afc0647446f25cf874acc9a60f48521adb292918936c9fba62f127079daa7a97956d279470a324f30fb3ca7fa12de654c4a166c6451ad
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- evva (0.10.0)
4
+ evva (0.11.0)
5
5
  colorize (~> 1.0)
6
6
  csv (~> 3.0)
7
7
  safe_yaml (~> 1.0)
data/changelog.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.11.0] - 2026-11-09
6
+
7
+ - **Breaking:** Kotlin enum constants (events, people properties, special property enums and destinations) are now generated in PascalCase, e.g. `RoundStarted` instead of `ROUND_STARTED`. The `key` values are unchanged
8
+
5
9
  ## [0.10.0] - 2026-10-13
6
10
 
7
11
  - Support optional people properties in Kotlin: `innerValue` is now `Any?` and optional special properties use `value?.key`
@@ -47,11 +47,11 @@ module Evva
47
47
  }
48
48
  end
49
49
 
50
- destinations = event.destinations.map { |p| constantize(p) }
50
+ destinations = event.destinations.map { |p| pascalize(p) }
51
51
 
52
52
  {
53
53
  class_name: camelize(event.event_name),
54
- event_name: constantize(event.event_name),
54
+ event_name: pascalize(event.event_name),
55
55
  properties: properties,
56
56
  destinations: destinations
57
57
  }
@@ -67,7 +67,7 @@ module Evva
67
67
 
68
68
  events = bundle.map(&:event_name).map do |event_name|
69
69
  {
70
- name: constantize(event_name),
70
+ name: pascalize(event_name),
71
71
  value: event_name,
72
72
  }
73
73
  end
@@ -96,10 +96,10 @@ module Evva
96
96
 
97
97
  {
98
98
  class_name: camelize(property.property_name),
99
- property_name: constantize(property.property_name),
99
+ property_name: pascalize(property.property_name),
100
100
  type: type,
101
101
  value_fetcher: value_fetcher,
102
- destinations: property.destinations.map { |p| constantize(p) },
102
+ destinations: property.destinations.map { |p| pascalize(p) },
103
103
  }
104
104
  end
105
105
 
@@ -113,7 +113,7 @@ module Evva
113
113
 
114
114
  properties = people_bundle.map(&:property_name).map do |property_name|
115
115
  {
116
- name: constantize(property_name),
116
+ name: pascalize(property_name),
117
117
  value: property_name,
118
118
  }
119
119
  end
@@ -127,7 +127,7 @@ module Evva
127
127
  enums = enums_bundle.map do |enum|
128
128
  values = enum.values.map do |value|
129
129
  {
130
- name: constantize(value),
130
+ name: pascalize(value),
131
131
  value: value,
132
132
  }
133
133
  end
@@ -146,7 +146,7 @@ module Evva
146
146
  header_footer_wrapper do
147
147
  class_name = file_name
148
148
 
149
- destinations = bundle.map { |d| constantize(d) }
149
+ destinations = bundle.map { |d| pascalize(d) }
150
150
 
151
151
  template_from(DESTINATIONS_TEMPLATE).result(binding)
152
152
  end
@@ -181,8 +181,9 @@ module Evva
181
181
  string.gsub(/(?:_|(\/))([a-z\d]*)/) { "#{$1}#{$2.capitalize}" }.gsub("/", "::")
182
182
  end
183
183
 
184
- def constantize(string)
185
- string.tr(" ", "_").upcase
184
+ def pascalize(string)
185
+ name = string.to_s.split(/[^\p{Alnum}]+/).map(&:capitalize).join
186
+ name.match?(/\A\p{L}/) ? name : "_#{name}"
186
187
  end
187
188
 
188
189
  def native_type(type)
data/lib/evva/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Evva
2
- VERSION = "0.10.0".freeze
3
- VERSION_UPDATED_AT = "2026-10-13".freeze
2
+ VERSION = "0.11.0".freeze
3
+ VERSION_UPDATED_AT = "2026-11-09".freeze
4
4
  end
@@ -29,13 +29,13 @@ sealed class AnalyticsEvent(
29
29
  val name = event.key
30
30
 
31
31
  data object CpPageView : AnalyticsEvent(
32
- event = AnalyticsEvents.CP_PAGE_VIEW,
32
+ event = AnalyticsEvents.CpPageView,
33
33
  )
34
34
 
35
35
  data object CpPageView2 : AnalyticsEvent(
36
- event = AnalyticsEvents.CP_PAGE_VIEW_2,
36
+ event = AnalyticsEvents.CpPageView2,
37
37
  destinations = arrayOf(
38
- AnalyticsDestinations.FIREBASE,
38
+ AnalyticsDestinations.Firebase,
39
39
  ),
40
40
  )
41
41
 
@@ -43,14 +43,14 @@ sealed class AnalyticsEvent(
43
43
  val courseId: Long,
44
44
  val courseName: String,
45
45
  ) : AnalyticsEvent(
46
- event = AnalyticsEvents.CP_PAGE_VIEW_A,
46
+ event = AnalyticsEvents.CpPageViewA,
47
47
  properties = mapOf(
48
48
  "course_id" to courseId,
49
49
  "course_name" to courseName,
50
50
  ),
51
51
  destinations = arrayOf(
52
- AnalyticsDestinations.FIREBASE,
53
- AnalyticsDestinations.CUSTOM_DESTINATION,
52
+ AnalyticsDestinations.Firebase,
53
+ AnalyticsDestinations.CustomDestination,
54
54
  ),
55
55
  )
56
56
 
@@ -59,14 +59,14 @@ sealed class AnalyticsEvent(
59
59
  val courseName: String,
60
60
  val fromScreen: CourseProfileSource,
61
61
  ) : AnalyticsEvent(
62
- event = AnalyticsEvents.CP_PAGE_VIEW_B,
62
+ event = AnalyticsEvents.CpPageViewB,
63
63
  properties = mapOf(
64
64
  "course_id" to courseId,
65
65
  "course_name" to courseName,
66
66
  "from_screen" to fromScreen.key,
67
67
  ),
68
68
  destinations = arrayOf(
69
- AnalyticsDestinations.FIREBASE,
69
+ AnalyticsDestinations.Firebase,
70
70
  ),
71
71
  )
72
72
 
@@ -75,7 +75,7 @@ sealed class AnalyticsEvent(
75
75
  val courseName: String,
76
76
  val fromScreen: CourseProfileSource?,
77
77
  ) : AnalyticsEvent(
78
- event = AnalyticsEvents.CP_PAGE_VIEW_C,
78
+ event = AnalyticsEvents.CpPageViewC,
79
79
  properties = mapOf(
80
80
  "course_id" to courseId,
81
81
  "course_name" to courseName,
@@ -88,7 +88,7 @@ sealed class AnalyticsEvent(
88
88
  val courseName: String,
89
89
  val viewedAt: String,
90
90
  ) : AnalyticsEvent(
91
- event = AnalyticsEvents.CP_PAGE_VIEW_D,
91
+ event = AnalyticsEvents.CpPageViewD,
92
92
  properties = mapOf(
93
93
  "course_id" to courseId,
94
94
  "course_name" to courseName,
@@ -106,7 +106,7 @@ Kotlin
106
106
  subject { generator.special_property_enums(enums) }
107
107
  let(:enums) { [
108
108
  Evva::AnalyticsEnum.new("CourseProfileSource", ["course_discovery", "synced_courses"]),
109
- Evva::AnalyticsEnum.new("PremiumFrom", ["Course Profile", "Round Setup"]),
109
+ Evva::AnalyticsEnum.new("PremiumFrom", ["Course Profile", "Round Setup", "PAYWALL", "push-notification v2"]),
110
110
  ] }
111
111
  let(:expected) {
112
112
  <<-Kotlin
@@ -117,17 +117,37 @@ package com.hole19golf.hole19.analytics
117
117
  */
118
118
 
119
119
  enum class CourseProfileSource(val key: String) {
120
- COURSE_DISCOVERY("course_discovery"),
121
- SYNCED_COURSES("synced_courses"),
120
+ CourseDiscovery("course_discovery"),
121
+ SyncedCourses("synced_courses"),
122
122
  }
123
123
 
124
124
  enum class PremiumFrom(val key: String) {
125
- COURSE_PROFILE("Course Profile"),
126
- ROUND_SETUP("Round Setup"),
125
+ CourseProfile("Course Profile"),
126
+ RoundSetup("Round Setup"),
127
+ Paywall("PAYWALL"),
128
+ PushNotificationV2("push-notification v2"),
127
129
  }
128
130
  Kotlin
129
131
  }
130
132
  it { should eq expected }
133
+
134
+ context "when values do not start with a letter or use non-ASCII letters" do
135
+ let(:enums) { [
136
+ Evva::AnalyticsEnum.new("HoleCount", ["9 holes", "_2fa", "日本語"]),
137
+ ] }
138
+
139
+ let(:expected_enum) {
140
+ <<-Kotlin
141
+ enum class HoleCount(val key: String) {
142
+ _9Holes("9 holes"),
143
+ _2fa("_2fa"),
144
+ 日本語("日本語"),
145
+ }
146
+ Kotlin
147
+ }
148
+
149
+ it { should include expected_enum }
150
+ end
131
151
  end
132
152
 
133
153
  describe "#event_enum" do
@@ -145,8 +165,8 @@ package com.hole19golf.hole19.analytics
145
165
  */
146
166
 
147
167
  enum class AnalyticsEvents(val key: String) {
148
- NAV_FEED_TAP("nav_feed_tap"),
149
- NAV_PERFORMANCE_TAP("nav_performance_tap"),
168
+ NavFeedTap("nav_feed_tap"),
169
+ NavPerformanceTap("nav_performance_tap"),
150
170
  }
151
171
  Kotlin
152
172
  }
@@ -179,32 +199,32 @@ sealed class AnalyticsProperty(
179
199
  data class RoundsWithWear(
180
200
  val value: String?,
181
201
  ) : AnalyticsProperty(
182
- property = AnalyticsProperties.ROUNDS_WITH_WEAR,
202
+ property = AnalyticsProperties.RoundsWithWear,
183
203
  innerValue = value,
184
204
  )
185
205
 
186
206
  data class LastActiveAt(
187
207
  val value: String,
188
208
  ) : AnalyticsProperty(
189
- property = AnalyticsProperties.LAST_ACTIVE_AT,
209
+ property = AnalyticsProperties.LastActiveAt,
190
210
  innerValue = value,
191
211
  )
192
212
 
193
213
  data class UpgradeSource(
194
214
  val value: PremiumFrom,
195
215
  ) : AnalyticsProperty(
196
- property = AnalyticsProperties.UPGRADE_SOURCE,
216
+ property = AnalyticsProperties.UpgradeSource,
197
217
  innerValue = value.key,
198
218
  )
199
219
 
200
220
  data class WearPlatform(
201
221
  val value: WearableAppPlatform?,
202
222
  ) : AnalyticsProperty(
203
- property = AnalyticsProperties.WEAR_PLATFORM,
223
+ property = AnalyticsProperties.WearPlatform,
204
224
  innerValue = value?.key,
205
225
  destinations = arrayOf(
206
- AnalyticsDestinations.FIREBASE,
207
- AnalyticsDestinations.CUSTOM_DESTINATION,
226
+ AnalyticsDestinations.Firebase,
227
+ AnalyticsDestinations.CustomDestination,
208
228
  ),
209
229
  )
210
230
  }
@@ -229,8 +249,8 @@ package com.hole19golf.hole19.analytics
229
249
  */
230
250
 
231
251
  enum class AnalyticsProperties(val key: String) {
232
- ROUNDS_WITH_WEAR("rounds_with_wear"),
233
- WEAR_PLATFORM("wear_platform"),
252
+ RoundsWithWear("rounds_with_wear"),
253
+ WearPlatform("wear_platform"),
234
254
  }
235
255
  Kotlin
236
256
  }
@@ -252,8 +272,8 @@ package com.hole19golf.hole19.analytics
252
272
  */
253
273
 
254
274
  enum class AnalyticsDestinations {
255
- FIREBASE,
256
- WHATEVER_YOU_WANT_REALLY,
275
+ Firebase,
276
+ WhateverYouWantReally,
257
277
  }
258
278
  Kotlin
259
279
  }
metadata CHANGED
@@ -1,15 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: evva
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - André Andrade
8
8
  - João Costa
9
9
  - Ricardo Trindade
10
+ autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2026-10-13 00:00:00.000000000 Z
13
+ date: 2026-11-09 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: colorize
@@ -115,6 +116,7 @@ homepage: https://github.com/hole19/
115
116
  licenses:
116
117
  - MIT
117
118
  metadata: {}
119
+ post_install_message:
118
120
  rdoc_options: []
119
121
  require_paths:
120
122
  - lib
@@ -129,7 +131,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
129
131
  - !ruby/object:Gem::Version
130
132
  version: '0'
131
133
  requirements: []
132
- rubygems_version: 4.0.10
134
+ rubygems_version: 3.5.3
135
+ signing_key:
133
136
  specification_version: 4
134
137
  summary: An event generating service
135
138
  test_files: []