evva 0.2.0 → 0.4.2
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 +4 -4
- data/.rubocop_todo.yml +10 -10
- data/Gemfile +0 -1
- data/Gemfile.lock +3 -6
- data/README.md +3 -2
- data/changelog.md +18 -2
- data/lib/evva/{mixpanel_enum.rb → analytics_enum.rb} +2 -1
- data/lib/evva/analytics_event.rb +17 -0
- data/lib/evva/analytics_property.rb +17 -0
- data/lib/evva/android_generator.rb +142 -84
- data/lib/evva/config.rb +12 -2
- data/lib/evva/google_sheet.rb +43 -25
- data/lib/evva/swift_generator.rb +91 -81
- data/lib/evva/templates/kotlin/base.kt +7 -0
- data/lib/evva/templates/kotlin/destinations.kt +5 -0
- data/lib/evva/templates/kotlin/event_enum.kt +5 -0
- data/lib/evva/templates/kotlin/events.kt +36 -0
- data/lib/evva/templates/kotlin/people_properties.kt +26 -0
- data/lib/evva/templates/kotlin/people_properties_enum.kt +5 -0
- data/lib/evva/templates/kotlin/special_property_enums.kt +10 -0
- data/lib/evva/templates/swift/base.swift +7 -0
- data/lib/evva/templates/swift/destinations.swift +5 -0
- data/lib/evva/templates/swift/events.swift +66 -0
- data/lib/evva/templates/swift/people_properties.swift +50 -0
- data/lib/evva/templates/swift/special_property_enums.swift +10 -0
- data/lib/evva/version.rb +2 -2
- data/lib/evva.rb +14 -4
- data/spec/evva_spec.rb +3 -5
- data/spec/fixtures/sample_public_events.csv +4 -4
- data/spec/fixtures/sample_public_people_properties.csv +4 -3
- data/spec/fixtures/test.yml +5 -3
- data/spec/lib/evva/android_generator_spec.rb +163 -69
- data/spec/lib/evva/config_spec.rb +7 -3
- data/spec/lib/evva/google_sheet_spec.rb +25 -7
- data/spec/lib/evva/swift_generator_spec.rb +157 -40
- metadata +17 -6
- data/.ruby-version +0 -1
- data/evva_config.yml +0 -14
- data/lib/evva/mixpanel_event.rb +0 -13
@@ -2,75 +2,92 @@ describe Evva::AndroidGenerator do
|
|
2
2
|
let(:generator) { described_class.new("com.hole19golf.hole19.analytics") }
|
3
3
|
|
4
4
|
describe '#events' do
|
5
|
-
subject { generator.events(events, "
|
5
|
+
subject { generator.events(events, "AnalyticsEvent", "AnalyticsEvents", "AnalyticsDestinations") }
|
6
6
|
|
7
7
|
let(:events) { [
|
8
|
-
Evva::
|
9
|
-
Evva::
|
10
|
-
Evva::
|
11
|
-
Evva::
|
12
|
-
Evva::
|
8
|
+
Evva::AnalyticsEvent.new('cp_page_view', {}, []),
|
9
|
+
Evva::AnalyticsEvent.new('cp_page_view_2', {}, ["firebase"]),
|
10
|
+
Evva::AnalyticsEvent.new('cp_page_view_a', { course_id: 'Long', course_name: 'String' }, ["firebase", "custom destination"]),
|
11
|
+
Evva::AnalyticsEvent.new('cp_page_view_b', { course_id: 'Long', course_name: 'String', from_screen: 'CourseProfileSource' }, ["firebase"]),
|
12
|
+
Evva::AnalyticsEvent.new('cp_page_view_c', { course_id: 'Long', course_name: 'String', from_screen: 'CourseProfileSource?' }, []),
|
13
|
+
Evva::AnalyticsEvent.new('cp_page_view_d', { course_id: 'Long?', course_name: 'String', viewed_at: 'Date' }, []),
|
13
14
|
] }
|
14
15
|
|
15
16
|
let(:expected) {
|
16
17
|
<<-Kotlin
|
17
18
|
package com.hole19golf.hole19.analytics
|
18
19
|
|
19
|
-
import com.hole19golf.hole19.analytics.Event
|
20
|
-
import com.hole19golf.hole19.analytics.MixpanelAnalyticsMask
|
21
|
-
import org.json.JSONObject
|
22
|
-
|
23
20
|
/**
|
24
21
|
* This file was automatically generated by evva: https://github.com/hole19/evva
|
25
22
|
*/
|
26
23
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
val
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
24
|
+
sealed class AnalyticsEvent(
|
25
|
+
event: AnalyticsEvents,
|
26
|
+
val properties: Map<String, Any?>? = null,
|
27
|
+
val destinations: Array<AnalyticsDestinations> = emptyArray()
|
28
|
+
) {
|
29
|
+
val name = event.key
|
30
|
+
|
31
|
+
object CpPageView : AnalyticsEvent(
|
32
|
+
event = AnalyticsEvents.CP_PAGE_VIEW,
|
33
|
+
)
|
34
|
+
|
35
|
+
object CpPageView2 : AnalyticsEvent(
|
36
|
+
event = AnalyticsEvents.CP_PAGE_VIEW_2,
|
37
|
+
destinations = arrayOf(
|
38
|
+
AnalyticsDestinations.FIREBASE
|
39
|
+
)
|
40
|
+
)
|
41
|
+
|
42
|
+
data class CpPageViewA(
|
43
|
+
val courseId: Long, val courseName: String
|
44
|
+
) : AnalyticsEvent(
|
45
|
+
event = AnalyticsEvents.CP_PAGE_VIEW_A,
|
46
|
+
properties = mapOf(
|
47
|
+
"course_id" to courseId,
|
48
|
+
"course_name" to courseName
|
49
|
+
),
|
50
|
+
destinations = arrayOf(
|
51
|
+
AnalyticsDestinations.FIREBASE,
|
52
|
+
AnalyticsDestinations.CUSTOM_DESTINATION
|
53
|
+
)
|
54
|
+
)
|
55
|
+
|
56
|
+
data class CpPageViewB(
|
57
|
+
val courseId: Long, val courseName: String, val fromScreen: CourseProfileSource
|
58
|
+
) : AnalyticsEvent(
|
59
|
+
event = AnalyticsEvents.CP_PAGE_VIEW_B,
|
60
|
+
properties = mapOf(
|
61
|
+
"course_id" to courseId,
|
62
|
+
"course_name" to courseName,
|
63
|
+
"from_screen" to fromScreen.key
|
64
|
+
),
|
65
|
+
destinations = arrayOf(
|
66
|
+
AnalyticsDestinations.FIREBASE
|
67
|
+
)
|
68
|
+
)
|
69
|
+
|
70
|
+
data class CpPageViewC(
|
71
|
+
val courseId: Long, val courseName: String, val fromScreen: CourseProfileSource?
|
72
|
+
) : AnalyticsEvent(
|
73
|
+
event = AnalyticsEvents.CP_PAGE_VIEW_C,
|
74
|
+
properties = mapOf(
|
75
|
+
"course_id" to courseId,
|
76
|
+
"course_name" to courseName,
|
77
|
+
"from_screen" to fromScreen?.key
|
78
|
+
),
|
79
|
+
)
|
80
|
+
|
81
|
+
data class CpPageViewD(
|
82
|
+
val courseId: Long?, val courseName: String, val viewedAt: String
|
83
|
+
) : AnalyticsEvent(
|
84
|
+
event = AnalyticsEvents.CP_PAGE_VIEW_D,
|
85
|
+
properties = mapOf(
|
86
|
+
"course_id" to courseId,
|
87
|
+
"course_name" to courseName,
|
88
|
+
"viewed_at" to viewedAt
|
89
|
+
),
|
90
|
+
)
|
74
91
|
}
|
75
92
|
Kotlin
|
76
93
|
}
|
@@ -81,8 +98,8 @@ Kotlin
|
|
81
98
|
describe '#special_property_enums' do
|
82
99
|
subject { generator.special_property_enums(enums) }
|
83
100
|
let(:enums) { [
|
84
|
-
Evva::
|
85
|
-
Evva::
|
101
|
+
Evva::AnalyticsEnum.new('CourseProfileSource', ['course_discovery', 'synced_courses']),
|
102
|
+
Evva::AnalyticsEnum.new('PremiumFrom', ['Course Profile', 'Round Setup']),
|
86
103
|
] }
|
87
104
|
let(:expected) {
|
88
105
|
<<-Kotlin
|
@@ -107,22 +124,20 @@ Kotlin
|
|
107
124
|
end
|
108
125
|
|
109
126
|
describe '#event_enum' do
|
110
|
-
subject { generator.event_enum(event_bundle, '
|
127
|
+
subject { generator.event_enum(event_bundle, 'AnalyticsEvents') }
|
111
128
|
let(:event_bundle) { [
|
112
|
-
Evva::
|
113
|
-
Evva::
|
129
|
+
Evva::AnalyticsEvent.new('nav_feed_tap', {}, []),
|
130
|
+
Evva::AnalyticsEvent.new('nav_performance_tap', {}, []),
|
114
131
|
] }
|
115
132
|
let(:expected) {
|
116
133
|
<<-Kotlin
|
117
134
|
package com.hole19golf.hole19.analytics
|
118
135
|
|
119
|
-
import com.hole19golf.hole19.analytics.Event
|
120
|
-
|
121
136
|
/**
|
122
137
|
* This file was automatically generated by evva: https://github.com/hole19/evva
|
123
138
|
*/
|
124
139
|
|
125
|
-
enum class
|
140
|
+
enum class AnalyticsEvents(val key: String) {
|
126
141
|
NAV_FEED_TAP("nav_feed_tap"),
|
127
142
|
NAV_PERFORMANCE_TAP("nav_performance_tap");
|
128
143
|
}
|
@@ -132,8 +147,64 @@ Kotlin
|
|
132
147
|
end
|
133
148
|
|
134
149
|
describe '#people_properties' do
|
135
|
-
subject { generator.people_properties(people_bundle, '
|
136
|
-
let(:people_bundle) { [
|
150
|
+
subject { generator.people_properties(people_bundle, 'AnalyticsProperty', 'AnalyticsProperties', 'AnalyticsDestinations') }
|
151
|
+
let(:people_bundle) { [
|
152
|
+
Evva::AnalyticsProperty.new('rounds_with_wear', 'String', []),
|
153
|
+
Evva::AnalyticsProperty.new('last_active_at', 'Date', []),
|
154
|
+
Evva::AnalyticsProperty.new('wear_platform', 'WearableAppPlatform', ["firebase", "custom destination"]),
|
155
|
+
] }
|
156
|
+
let(:expected) {
|
157
|
+
<<-Kotlin
|
158
|
+
package com.hole19golf.hole19.analytics
|
159
|
+
|
160
|
+
/**
|
161
|
+
* This file was automatically generated by evva: https://github.com/hole19/evva
|
162
|
+
*/
|
163
|
+
|
164
|
+
sealed class AnalyticsProperty(
|
165
|
+
property: AnalyticsProperties,
|
166
|
+
val innerValue: Any,
|
167
|
+
val destinations: Array<AnalyticsDestinations> = emptyArray()
|
168
|
+
) {
|
169
|
+
val name = property.key
|
170
|
+
|
171
|
+
data class RoundsWithWear(
|
172
|
+
val value: String
|
173
|
+
) : AnalyticsProperty(
|
174
|
+
property = AnalyticsProperties.ROUNDS_WITH_WEAR,
|
175
|
+
innerValue = value,
|
176
|
+
)
|
177
|
+
|
178
|
+
data class LastActiveAt(
|
179
|
+
val value: String
|
180
|
+
) : AnalyticsProperty(
|
181
|
+
property = AnalyticsProperties.LAST_ACTIVE_AT,
|
182
|
+
innerValue = value,
|
183
|
+
)
|
184
|
+
|
185
|
+
data class WearPlatform(
|
186
|
+
val value: WearableAppPlatform
|
187
|
+
) : AnalyticsProperty(
|
188
|
+
property = AnalyticsProperties.WEAR_PLATFORM,
|
189
|
+
innerValue = value.key,
|
190
|
+
destinations = arrayOf(
|
191
|
+
AnalyticsDestinations.FIREBASE,
|
192
|
+
AnalyticsDestinations.CUSTOM_DESTINATION
|
193
|
+
)
|
194
|
+
)
|
195
|
+
}
|
196
|
+
Kotlin
|
197
|
+
}
|
198
|
+
|
199
|
+
it { should eq expected }
|
200
|
+
end
|
201
|
+
|
202
|
+
describe '#people_properties_enum' do
|
203
|
+
subject { generator.people_properties_enum(people_bundle, 'AnalyticsProperties') }
|
204
|
+
let(:people_bundle) { [
|
205
|
+
Evva::AnalyticsProperty.new('rounds_with_wear', 'String', ["firebase"]),
|
206
|
+
Evva::AnalyticsProperty.new('wear_platform', 'WearableAppPlatform', ["firebase", "custom destination"]),
|
207
|
+
] }
|
137
208
|
let(:expected) {
|
138
209
|
<<-Kotlin
|
139
210
|
package com.hole19golf.hole19.analytics
|
@@ -142,9 +213,32 @@ package com.hole19golf.hole19.analytics
|
|
142
213
|
* This file was automatically generated by evva: https://github.com/hole19/evva
|
143
214
|
*/
|
144
215
|
|
145
|
-
enum class
|
216
|
+
enum class AnalyticsProperties(val key: String) {
|
146
217
|
ROUNDS_WITH_WEAR("rounds_with_wear"),
|
147
|
-
|
218
|
+
WEAR_PLATFORM("wear_platform");
|
219
|
+
}
|
220
|
+
Kotlin
|
221
|
+
}
|
222
|
+
it { should eq expected }
|
223
|
+
end
|
224
|
+
|
225
|
+
describe '#destinations' do
|
226
|
+
subject { generator.destinations(destinations_bundle, 'AnalyticsDestinations') }
|
227
|
+
let(:destinations_bundle) { [
|
228
|
+
'firebase',
|
229
|
+
'whatever you want really'
|
230
|
+
] }
|
231
|
+
let(:expected) {
|
232
|
+
<<-Kotlin
|
233
|
+
package com.hole19golf.hole19.analytics
|
234
|
+
|
235
|
+
/**
|
236
|
+
* This file was automatically generated by evva: https://github.com/hole19/evva
|
237
|
+
*/
|
238
|
+
|
239
|
+
enum class AnalyticsDestinations {
|
240
|
+
FIREBASE,
|
241
|
+
WHATEVER_YOU_WANT_REALLY;
|
148
242
|
}
|
149
243
|
Kotlin
|
150
244
|
}
|
@@ -12,9 +12,11 @@ describe Evva::Config do
|
|
12
12
|
},
|
13
13
|
out_path: 'clear/path/to/event',
|
14
14
|
event_file_name: 'event/file/name',
|
15
|
-
people_file_name: 'people/file/name',
|
16
15
|
event_enum_file_name: 'event/enum/file',
|
17
|
-
|
16
|
+
people_file_name: 'people/file/name',
|
17
|
+
people_enum_file_name: 'people/enum/file/name',
|
18
|
+
destinations_file_name: 'destinations/file/name',
|
19
|
+
package_name: 'com.package.name.analytics',
|
18
20
|
}
|
19
21
|
end
|
20
22
|
|
@@ -27,8 +29,10 @@ describe Evva::Config do
|
|
27
29
|
its(:type) { should eq('EvvaOS') }
|
28
30
|
its(:out_path) { should eq('clear/path/to/event') }
|
29
31
|
its(:event_file_name) { should eq('event/file/name') }
|
30
|
-
its(:people_file_name) { should eq('people/file/name') }
|
31
32
|
its(:event_enum_file_name) { should eq 'event/enum/file' }
|
33
|
+
its(:people_file_name) { should eq('people/file/name') }
|
34
|
+
its(:people_enum_file_name) { should eq('people/enum/file/name') }
|
35
|
+
its(:destinations_file_name) { should eq 'destinations/file/name' }
|
32
36
|
its(:package_name) { should eq 'com.package.name.analytics' }
|
33
37
|
|
34
38
|
describe '#data_source' do
|
@@ -22,9 +22,11 @@ describe Evva::GoogleSheet do
|
|
22
22
|
end
|
23
23
|
|
24
24
|
it 'returns an array with the corresponding events' do
|
25
|
-
expected = [
|
26
|
-
|
27
|
-
|
25
|
+
expected = [
|
26
|
+
Evva::AnalyticsEvent.new('cp_page_view', { course_id: 'Long', course_name: 'String' }, ['firebase', 'custom destination']),
|
27
|
+
Evva::AnalyticsEvent.new('nav_feed_tap', {}, []),
|
28
|
+
Evva::AnalyticsEvent.new('cp_view_scorecard', { course_id: 'Long', course_name: 'String' }, ['custom destination']),
|
29
|
+
]
|
28
30
|
expect(events).to eq(expected)
|
29
31
|
end
|
30
32
|
|
@@ -54,8 +56,9 @@ describe Evva::GoogleSheet do
|
|
54
56
|
|
55
57
|
it 'returns an array with the corresponding events' do
|
56
58
|
expect(people_properties).to eq [
|
57
|
-
'rounds_with_wear',
|
58
|
-
'total_friends'
|
59
|
+
Evva::AnalyticsProperty.new('rounds_with_wear', 'String', ['firebase', 'custom destination']),
|
60
|
+
Evva::AnalyticsProperty.new('total_friends', 'Int', []),
|
61
|
+
Evva::AnalyticsProperty.new('wearable_platform', 'WearableAppPlatform', ['firebase']),
|
59
62
|
]
|
60
63
|
end
|
61
64
|
end
|
@@ -69,8 +72,23 @@ describe Evva::GoogleSheet do
|
|
69
72
|
|
70
73
|
it 'returns an array with the corresponding events' do
|
71
74
|
expect(enum_classes).to eq [
|
72
|
-
Evva::
|
73
|
-
Evva::
|
75
|
+
Evva::AnalyticsEnum.new('PageViewSourceScreen', ['course_discovery','synced_courses','nearby','deal']),
|
76
|
+
Evva::AnalyticsEnum.new('PremiumClickBuy', ['notes','hi_res_maps','whatever'])
|
77
|
+
]
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe '#destinations' do
|
82
|
+
subject(:destinations) { sheet.destinations }
|
83
|
+
|
84
|
+
it do
|
85
|
+
expect { destinations }.not_to raise_error
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'returns an array with the corresponding events' do
|
89
|
+
expect(destinations).to eq [
|
90
|
+
'firebase',
|
91
|
+
'custom destination',
|
74
92
|
]
|
75
93
|
end
|
76
94
|
end
|
@@ -2,14 +2,14 @@ describe Evva::SwiftGenerator do
|
|
2
2
|
let(:generator) { described_class.new }
|
3
3
|
|
4
4
|
describe '#events' do
|
5
|
-
subject { generator.events(event_bundle,
|
5
|
+
subject { generator.events(event_bundle, nil, nil, nil) }
|
6
6
|
|
7
7
|
let(:event_bundle) { [
|
8
|
-
Evva::
|
9
|
-
Evva::
|
10
|
-
Evva::
|
11
|
-
Evva::
|
12
|
-
Evva::
|
8
|
+
Evva::AnalyticsEvent.new('cp_page_view', {}, ['firebase']),
|
9
|
+
Evva::AnalyticsEvent.new('cp_page_view_a', { course_id: 'Long', course_name: 'String' }, ['firebase', 'Custom Destination']),
|
10
|
+
Evva::AnalyticsEvent.new('cp_page_view_b', { course_id: 'Long', course_name: 'String', from_screen: 'CourseProfileSource' }, []),
|
11
|
+
Evva::AnalyticsEvent.new('cp_page_view_c', { course_id: 'Long', course_name: 'String', from_screen: 'CourseProfileSource?' }, []),
|
12
|
+
Evva::AnalyticsEvent.new('cp_page_view_d', { course_id: 'Long?', course_name: 'String' }, []),
|
13
13
|
] }
|
14
14
|
|
15
15
|
let(:expected) {
|
@@ -19,6 +19,41 @@ describe Evva::SwiftGenerator do
|
|
19
19
|
import Foundation
|
20
20
|
|
21
21
|
extension Analytics {
|
22
|
+
struct EventData {
|
23
|
+
let name: String
|
24
|
+
var properties: [String: Any]?
|
25
|
+
let destinations: [Destination]
|
26
|
+
|
27
|
+
init(name: String, properties: [String: Any]?, destinations: [Destination]) {
|
28
|
+
self.name = name
|
29
|
+
self.properties = properties
|
30
|
+
self.destinations = destinations
|
31
|
+
}
|
32
|
+
|
33
|
+
init(type: EventType, properties: [String: Any]?) {
|
34
|
+
self.init(name: type.name, properties: properties, destinations: type.destinations)
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
enum EventType: String {
|
39
|
+
case cpPageView = "cp_page_view"
|
40
|
+
case cpPageViewA = "cp_page_view_a"
|
41
|
+
case cpPageViewB = "cp_page_view_b"
|
42
|
+
case cpPageViewC = "cp_page_view_c"
|
43
|
+
case cpPageViewD = "cp_page_view_d"
|
44
|
+
|
45
|
+
var name: String { return rawValue }
|
46
|
+
|
47
|
+
var destinations: [Destination] {
|
48
|
+
switch self {
|
49
|
+
case .cpPageView: return [.firebase]
|
50
|
+
case .cpPageViewA: return [.firebase, .customDestination]
|
51
|
+
case .cpPageViewB: return []
|
52
|
+
case .cpPageViewC: return []
|
53
|
+
case .cpPageViewD: return []
|
54
|
+
}
|
55
|
+
}
|
56
|
+
}
|
22
57
|
|
23
58
|
enum Event {
|
24
59
|
case cpPageView
|
@@ -30,33 +65,38 @@ extension Analytics {
|
|
30
65
|
var data: EventData {
|
31
66
|
switch self {
|
32
67
|
case .cpPageView:
|
33
|
-
return EventData(
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
68
|
+
return EventData(type: .cpPageView,
|
69
|
+
properties: nil)
|
70
|
+
|
71
|
+
case let .cpPageViewA(course_id, course_name):
|
72
|
+
return EventData(type: .cpPageViewA,
|
73
|
+
properties: [
|
74
|
+
"course_id": course_id as Any,
|
75
|
+
"course_name": course_name as Any,
|
76
|
+
])
|
77
|
+
|
78
|
+
case let .cpPageViewB(course_id, course_name, from_screen):
|
79
|
+
return EventData(type: .cpPageViewB,
|
80
|
+
properties: [
|
81
|
+
"course_id": course_id as Any,
|
82
|
+
"course_name": course_name as Any,
|
83
|
+
"from_screen": from_screen.rawValue as Any,
|
84
|
+
])
|
85
|
+
|
86
|
+
case let .cpPageViewC(course_id, course_name, from_screen):
|
87
|
+
return EventData(type: .cpPageViewC,
|
88
|
+
properties: [
|
89
|
+
"course_id": course_id as Any,
|
90
|
+
"course_name": course_name as Any,
|
91
|
+
"from_screen": from_screen?.rawValue as Any,
|
92
|
+
])
|
93
|
+
|
94
|
+
case let .cpPageViewD(course_id, course_name):
|
95
|
+
return EventData(type: .cpPageViewD,
|
96
|
+
properties: [
|
97
|
+
"course_id": course_id as Any,
|
98
|
+
"course_name": course_name as Any,
|
99
|
+
])
|
60
100
|
}
|
61
101
|
}
|
62
102
|
}
|
@@ -71,8 +111,8 @@ Swift
|
|
71
111
|
subject { generator.special_property_enums(enums) }
|
72
112
|
|
73
113
|
let(:enums) { [
|
74
|
-
Evva::
|
75
|
-
Evva::
|
114
|
+
Evva::AnalyticsEnum.new('CourseProfileSource', ['course_discovery', 'synced_courses']),
|
115
|
+
Evva::AnalyticsEnum.new('PremiumFrom', ['Course Profile', 'Round Setup']),
|
76
116
|
] }
|
77
117
|
|
78
118
|
let(:expected) {
|
@@ -82,7 +122,6 @@ Swift
|
|
82
122
|
import Foundation
|
83
123
|
|
84
124
|
extension Analytics {
|
85
|
-
|
86
125
|
enum CourseProfileSource: String {
|
87
126
|
case courseDiscovery = "course_discovery"
|
88
127
|
case syncedCourses = "synced_courses"
|
@@ -100,9 +139,13 @@ Swift
|
|
100
139
|
end
|
101
140
|
|
102
141
|
describe "#people_properties" do
|
103
|
-
subject { generator.people_properties(people_bundle, "") }
|
142
|
+
subject { generator.people_properties(people_bundle, "", "", "") }
|
104
143
|
|
105
|
-
let(:people_bundle) { [
|
144
|
+
let(:people_bundle) { [
|
145
|
+
Evva::AnalyticsProperty.new('rounds_with_wear', 'String', ["firebase"]),
|
146
|
+
Evva::AnalyticsProperty.new('wear_platform', 'WearableAppPlatform', ["firebase", "custom destination"]),
|
147
|
+
Evva::AnalyticsProperty.new('number_of_times_it_happened', 'Long', []),
|
148
|
+
] }
|
106
149
|
|
107
150
|
let(:expected) {
|
108
151
|
<<-Swift
|
@@ -111,10 +154,84 @@ Swift
|
|
111
154
|
import Foundation
|
112
155
|
|
113
156
|
extension Analytics {
|
157
|
+
struct PropertyData {
|
158
|
+
let name: String
|
159
|
+
let value: Any
|
160
|
+
let destinations: [Destination]
|
161
|
+
|
162
|
+
init(name: String, value: Any, destinations: [Destination]) {
|
163
|
+
self.name = name
|
164
|
+
self.value = value
|
165
|
+
self.destinations = destinations
|
166
|
+
}
|
167
|
+
|
168
|
+
init(type: PropertyType, value: Any) {
|
169
|
+
self.init(name: type.name, value: value, destinations: type.destinations)
|
170
|
+
}
|
171
|
+
}
|
114
172
|
|
115
|
-
enum
|
173
|
+
enum PropertyType: String {
|
116
174
|
case roundsWithWear = "rounds_with_wear"
|
117
|
-
case
|
175
|
+
case wearPlatform = "wear_platform"
|
176
|
+
case numberOfTimesItHappened = "number_of_times_it_happened"
|
177
|
+
|
178
|
+
var name: String { return rawValue }
|
179
|
+
|
180
|
+
var destinations: [Destination] {
|
181
|
+
switch self {
|
182
|
+
case .roundsWithWear: return [.firebase]
|
183
|
+
case .wearPlatform: return [.firebase, .customDestination]
|
184
|
+
case .numberOfTimesItHappened: return []
|
185
|
+
}
|
186
|
+
}
|
187
|
+
}
|
188
|
+
|
189
|
+
enum Property {
|
190
|
+
case roundsWithWear(String)
|
191
|
+
case wearPlatform(WearableAppPlatform)
|
192
|
+
case numberOfTimesItHappened(Int)
|
193
|
+
|
194
|
+
var data: PropertyData {
|
195
|
+
switch self {
|
196
|
+
case let .roundsWithWear(value):
|
197
|
+
return PropertyData(type: .roundsWithWear,
|
198
|
+
value: value)
|
199
|
+
|
200
|
+
case let .wearPlatform(value):
|
201
|
+
return PropertyData(type: .wearPlatform,
|
202
|
+
value: value.rawValue)
|
203
|
+
|
204
|
+
case let .numberOfTimesItHappened(value):
|
205
|
+
return PropertyData(type: .numberOfTimesItHappened,
|
206
|
+
value: value)
|
207
|
+
}
|
208
|
+
}
|
209
|
+
}
|
210
|
+
}
|
211
|
+
Swift
|
212
|
+
}
|
213
|
+
|
214
|
+
it { should eq expected }
|
215
|
+
end
|
216
|
+
|
217
|
+
describe "#destinations" do
|
218
|
+
subject { generator.destinations(destinations, "") }
|
219
|
+
|
220
|
+
let(:destinations) { [
|
221
|
+
'firebase',
|
222
|
+
'whatever you want really'
|
223
|
+
] }
|
224
|
+
|
225
|
+
let(:expected) {
|
226
|
+
<<-Swift
|
227
|
+
// This file was automatically generated by evva: https://github.com/hole19/evva
|
228
|
+
|
229
|
+
import Foundation
|
230
|
+
|
231
|
+
extension Analytics {
|
232
|
+
enum Destination {
|
233
|
+
case firebase
|
234
|
+
case whateverYouWantReally
|
118
235
|
}
|
119
236
|
}
|
120
237
|
Swift
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: evva
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2
|
4
|
+
version: 0.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- RicardoTrindade
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: safe_yaml
|
@@ -48,7 +48,6 @@ files:
|
|
48
48
|
- ".gitignore"
|
49
49
|
- ".rspec"
|
50
50
|
- ".rubocop_todo.yml"
|
51
|
-
- ".ruby-version"
|
52
51
|
- ".travis.yml"
|
53
52
|
- Gemfile
|
54
53
|
- Gemfile.lock
|
@@ -57,17 +56,29 @@ files:
|
|
57
56
|
- bin/evva
|
58
57
|
- changelog.md
|
59
58
|
- evva.gemspec
|
60
|
-
- evva_config.yml
|
61
59
|
- lib/evva.rb
|
60
|
+
- lib/evva/analytics_enum.rb
|
61
|
+
- lib/evva/analytics_event.rb
|
62
|
+
- lib/evva/analytics_property.rb
|
62
63
|
- lib/evva/android_generator.rb
|
63
64
|
- lib/evva/config.rb
|
64
65
|
- lib/evva/file_reader.rb
|
65
66
|
- lib/evva/google_sheet.rb
|
66
67
|
- lib/evva/logger.rb
|
67
|
-
- lib/evva/mixpanel_enum.rb
|
68
|
-
- lib/evva/mixpanel_event.rb
|
69
68
|
- lib/evva/object_extension.rb
|
70
69
|
- lib/evva/swift_generator.rb
|
70
|
+
- lib/evva/templates/kotlin/base.kt
|
71
|
+
- lib/evva/templates/kotlin/destinations.kt
|
72
|
+
- lib/evva/templates/kotlin/event_enum.kt
|
73
|
+
- lib/evva/templates/kotlin/events.kt
|
74
|
+
- lib/evva/templates/kotlin/people_properties.kt
|
75
|
+
- lib/evva/templates/kotlin/people_properties_enum.kt
|
76
|
+
- lib/evva/templates/kotlin/special_property_enums.kt
|
77
|
+
- lib/evva/templates/swift/base.swift
|
78
|
+
- lib/evva/templates/swift/destinations.swift
|
79
|
+
- lib/evva/templates/swift/events.swift
|
80
|
+
- lib/evva/templates/swift/people_properties.swift
|
81
|
+
- lib/evva/templates/swift/special_property_enums.swift
|
71
82
|
- lib/evva/version.rb
|
72
83
|
- rubocop.yml
|
73
84
|
- spec/evva_spec.rb
|