evva 0.1.4.1 → 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 +5 -5
- data/.gitignore +1 -2
- data/.rspec +0 -1
- data/.ruby-version +1 -0
- data/.travis.yml +1 -0
- data/Gemfile +10 -8
- data/Gemfile.lock +5 -6
- data/README.md +10 -0
- data/Rakefile +9 -0
- data/changelog.md +18 -1
- data/evva.gemspec +0 -3
- data/evva_config.yml +5 -1
- data/lib/evva/android_generator.rb +72 -53
- data/lib/evva/config.rb +13 -2
- data/lib/evva/google_sheet.rb +49 -46
- data/lib/evva/swift_generator.rb +61 -61
- data/lib/evva/version.rb +2 -2
- data/lib/evva.rb +5 -7
- data/spec/fixtures/sample_public_enums.csv +3 -0
- data/spec/fixtures/sample_public_events.csv +4 -0
- data/spec/fixtures/sample_public_people_properties.csv +3 -0
- data/spec/fixtures/test.yml +5 -2
- data/spec/lib/evva/android_generator_spec.rb +117 -99
- data/spec/lib/evva/config_spec.rb +8 -4
- data/spec/lib/evva/google_sheet_spec.rb +44 -74
- data/spec/lib/evva/swift_generator_spec.rb +100 -69
- metadata +9 -38
- data/lib/evva/data_source.rb +0 -23
- data/spec/fixtures/sample_public_enums.html +0 -1
- data/spec/fixtures/sample_public_info.html +0 -1
- data/spec/fixtures/sample_public_people_properties.html +0 -1
- data/spec/fixtures/sample_public_sheet.html +0 -1
- data/spec/lib/evva/data_source_spec.rb +0 -28
@@ -5,13 +5,16 @@ describe Evva::Config do
|
|
5
5
|
{
|
6
6
|
type: 'EvvaOS',
|
7
7
|
data_source: {
|
8
|
-
type:
|
9
|
-
|
8
|
+
type: 'google_sheet',
|
9
|
+
events_url: 'https://events.csv',
|
10
|
+
people_properties_url: 'https://people_properties.csv',
|
11
|
+
enum_classes_url: 'https://enum_classes.csv',
|
10
12
|
},
|
11
13
|
out_path: 'clear/path/to/event',
|
12
14
|
event_file_name: 'event/file/name',
|
13
15
|
people_file_name: 'people/file/name',
|
14
|
-
event_enum_file_name: 'event/enum/file'
|
16
|
+
event_enum_file_name: 'event/enum/file',
|
17
|
+
package_name: 'com.package.name.analytics'
|
15
18
|
}
|
16
19
|
end
|
17
20
|
|
@@ -26,11 +29,12 @@ describe Evva::Config do
|
|
26
29
|
its(:event_file_name) { should eq('event/file/name') }
|
27
30
|
its(:people_file_name) { should eq('people/file/name') }
|
28
31
|
its(:event_enum_file_name) { should eq 'event/enum/file' }
|
32
|
+
its(:package_name) { should eq 'com.package.name.analytics' }
|
29
33
|
|
30
34
|
describe '#data_source' do
|
31
35
|
subject(:data_source) { config.data_source }
|
32
36
|
|
33
|
-
it { should eq(type: 'google_sheet',
|
37
|
+
it { should eq(type: 'google_sheet', events_url: 'https://events.csv', people_properties_url: 'https://people_properties.csv', enum_classes_url: 'https://enum_classes.csv') }
|
34
38
|
|
35
39
|
context 'when given an unknown type data source' do
|
36
40
|
before { hash[:data_source] = { type: 'i_dunno' } }
|
@@ -1,107 +1,77 @@
|
|
1
1
|
describe Evva::GoogleSheet do
|
2
|
-
let(:sheet) { Evva::GoogleSheet.new(
|
3
|
-
|
4
|
-
let(:
|
5
|
-
let(:
|
6
|
-
let(:enum_sheet) { "https://
|
7
|
-
let(:
|
8
|
-
let(:
|
9
|
-
let(:
|
10
|
-
|
11
|
-
|
2
|
+
let(:sheet) { Evva::GoogleSheet.new(events_sheet, people_sheet, enum_sheet) }
|
3
|
+
|
4
|
+
let(:events_sheet) { "https://wtvr1" }
|
5
|
+
let(:people_sheet) { "https://wtvr2" }
|
6
|
+
let(:enum_sheet) { "https://wtvr3" }
|
7
|
+
let(:events_file) { File.read('spec/fixtures/sample_public_events.csv') }
|
8
|
+
let(:people_file) { File.read('spec/fixtures/sample_public_people_properties.csv') }
|
9
|
+
let(:enum_file) { File.read('spec/fixtures/sample_public_enums.csv') }
|
10
|
+
|
11
|
+
before do
|
12
|
+
stub_request(:get, events_sheet).to_return(status: 200, body: events_file, headers: {})
|
13
|
+
stub_request(:get, people_sheet).to_return(status: 200, body: people_file, headers: {})
|
14
|
+
stub_request(:get, enum_sheet).to_return(status: 200, body: enum_file, headers: {})
|
15
|
+
end
|
12
16
|
|
13
17
|
describe '#events' do
|
14
18
|
subject(:events) { sheet.events }
|
15
|
-
before do
|
16
|
-
stub_request(:get, url_info).to_return(status: 200, body: file_info, headers: {})
|
17
|
-
stub_request(:get, url_sheet).to_return(status: 200, body: file_sheet, headers: {})
|
18
|
-
end
|
19
|
-
|
20
|
-
context 'when given a valid sheet' do
|
21
|
-
it do
|
22
|
-
expect { events }.not_to raise_error
|
23
|
-
end
|
24
19
|
|
25
|
-
|
26
|
-
|
27
|
-
Evva::MixpanelEvent.new('nav_feed_tap', {}),
|
28
|
-
Evva::MixpanelEvent.new('cp_view_scorecard', { course_id: 'Long', course_name: 'String' })]
|
29
|
-
expect(events).to eq(expected)
|
30
|
-
end
|
20
|
+
it do
|
21
|
+
expect { events }.not_to raise_error
|
31
22
|
end
|
32
23
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
end
|
24
|
+
it 'returns an array with the corresponding events' do
|
25
|
+
expected = [Evva::MixpanelEvent.new('cp_page_view', { course_id: 'Long', course_name: 'String' }),
|
26
|
+
Evva::MixpanelEvent.new('nav_feed_tap', {}),
|
27
|
+
Evva::MixpanelEvent.new('cp_view_scorecard', { course_id: 'Long', course_name: 'String' })]
|
28
|
+
expect(events).to eq(expected)
|
39
29
|
end
|
40
30
|
|
41
|
-
context
|
42
|
-
before { stub_request(:get,
|
31
|
+
context "when given an inexistent sheet" do
|
32
|
+
before { stub_request(:get, events_sheet).to_return(status: 400, body: "Not Found", headers: {}) }
|
43
33
|
|
44
34
|
it do
|
45
|
-
expect { events }.to raise_error /
|
35
|
+
expect { events }.to raise_error /Http Error/
|
46
36
|
end
|
47
37
|
end
|
48
38
|
|
49
|
-
context
|
50
|
-
before { stub_request(:get,
|
39
|
+
context "when url content is not CSV" do
|
40
|
+
before { stub_request(:get, events_sheet).to_return(status: 200, body: "{\"asdsa\": \"This is a json\"}", headers: {}) }
|
51
41
|
|
52
42
|
it do
|
53
|
-
expect { events }.to raise_error /Cannot parse. Expected
|
43
|
+
expect { events }.to raise_error /Cannot parse. Expected CSV/
|
54
44
|
end
|
55
45
|
end
|
56
46
|
end
|
57
47
|
|
58
|
-
describe '#
|
59
|
-
subject(:
|
60
|
-
let(:expected_enum) do
|
61
|
-
[
|
62
|
-
Evva::MixpanelEnum.new('PageViewSourceScreen', ['course_discovery','synced_courses','nearby','deal']),
|
63
|
-
Evva::MixpanelEnum.new('PremiumClickBuy', ['notes','hi_res_maps','whatever'])
|
64
|
-
]
|
65
|
-
end
|
66
|
-
|
67
|
-
context 'when given a valid sheet' do
|
68
|
-
before do
|
69
|
-
stub_request(:get, url_info).to_return(status: 200, body: file_info, headers: {})
|
70
|
-
stub_request(:get, enum_sheet).to_return(status: 200, body: enum_file, headers: {})
|
71
|
-
end
|
72
|
-
|
73
|
-
it do
|
74
|
-
expect { enum_classes }.not_to raise_error
|
75
|
-
end
|
48
|
+
describe '#people_properties' do
|
49
|
+
subject(:people_properties) { sheet.people_properties }
|
76
50
|
|
77
|
-
|
78
|
-
|
79
|
-
end
|
51
|
+
it do
|
52
|
+
expect { people_properties }.not_to raise_error
|
80
53
|
end
|
81
|
-
end
|
82
54
|
|
83
|
-
|
84
|
-
|
85
|
-
let(:expected_people_properties) do
|
86
|
-
[
|
55
|
+
it 'returns an array with the corresponding events' do
|
56
|
+
expect(people_properties).to eq [
|
87
57
|
'rounds_with_wear',
|
88
58
|
'total_friends'
|
89
59
|
]
|
90
60
|
end
|
61
|
+
end
|
91
62
|
|
92
|
-
|
93
|
-
|
94
|
-
stub_request(:get, url_info).to_return(status: 200, body: file_info, headers: {})
|
95
|
-
stub_request(:get, people_sheet).to_return(status: 200, body: people_file, headers: {})
|
96
|
-
end
|
63
|
+
describe '#enum_classes' do
|
64
|
+
subject(:enum_classes) { sheet.enum_classes }
|
97
65
|
|
98
|
-
|
99
|
-
|
100
|
-
|
66
|
+
it do
|
67
|
+
expect { enum_classes }.not_to raise_error
|
68
|
+
end
|
101
69
|
|
102
|
-
|
103
|
-
|
104
|
-
|
70
|
+
it 'returns an array with the corresponding events' do
|
71
|
+
expect(enum_classes).to eq [
|
72
|
+
Evva::MixpanelEnum.new('PageViewSourceScreen', ['course_discovery','synced_courses','nearby','deal']),
|
73
|
+
Evva::MixpanelEnum.new('PremiumClickBuy', ['notes','hi_res_maps','whatever'])
|
74
|
+
]
|
105
75
|
end
|
106
76
|
end
|
107
77
|
end
|
@@ -1,94 +1,125 @@
|
|
1
1
|
describe Evva::SwiftGenerator do
|
2
2
|
let(:generator) { described_class.new }
|
3
3
|
|
4
|
-
def trim_spaces(str)
|
5
|
-
str.gsub(/^[ \t]+/, '')
|
6
|
-
.gsub(/[ \t]+$/, '')
|
7
|
-
end
|
8
|
-
|
9
4
|
describe '#events' do
|
10
|
-
subject {
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
case trackCpPageView(course_id: Long, course_name: String?)
|
24
|
-
}
|
25
|
-
|
26
|
-
private var data: EventData {
|
27
|
-
switch self {
|
5
|
+
subject { generator.events(event_bundle, "") }
|
6
|
+
|
7
|
+
let(:event_bundle) { [
|
8
|
+
Evva::MixpanelEvent.new('cp_page_view'),
|
9
|
+
Evva::MixpanelEvent.new('cp_page_view_a', { course_id: 'Long', course_name: 'String' }),
|
10
|
+
Evva::MixpanelEvent.new('cp_page_view_b', { course_id: 'Long', course_name: 'String', from_screen: 'CourseProfileSource' }),
|
11
|
+
Evva::MixpanelEvent.new('cp_page_view_c', { course_id: 'Long', course_name: 'String', from_screen: 'CourseProfileSource?' }),
|
12
|
+
Evva::MixpanelEvent.new('cp_page_view_d', { course_id: 'Long?', course_name: 'String' })
|
13
|
+
] }
|
14
|
+
|
15
|
+
let(:expected) {
|
16
|
+
<<-Swift
|
17
|
+
// This file was automatically generated by evva: https://github.com/hole19/evva
|
28
18
|
|
29
|
-
|
30
|
-
return EventData(name:"nav_feed_tap")
|
19
|
+
import Foundation
|
31
20
|
|
32
|
-
|
33
|
-
|
34
|
-
|
21
|
+
extension Analytics {
|
22
|
+
|
23
|
+
enum Event {
|
24
|
+
case cpPageView
|
25
|
+
case cpPageViewA(course_id: Int, course_name: String)
|
26
|
+
case cpPageViewB(course_id: Int, course_name: String, from_screen: CourseProfileSource)
|
27
|
+
case cpPageViewC(course_id: Int, course_name: String, from_screen: CourseProfileSource?)
|
28
|
+
case cpPageViewD(course_id: Int?, course_name: String)
|
29
|
+
|
30
|
+
var data: EventData {
|
31
|
+
switch self {
|
32
|
+
case .cpPageView:
|
33
|
+
return EventData(name: "cp_page_view")
|
34
|
+
|
35
|
+
case .cpPageViewA(let course_id, let course_name):
|
36
|
+
return EventData(name: "cp_page_view_a", properties: [
|
37
|
+
"course_id": course_id as Any,
|
38
|
+
"course_name": course_name as Any ]
|
39
|
+
)
|
40
|
+
|
41
|
+
case .cpPageViewB(let course_id, let course_name, let from_screen):
|
42
|
+
return EventData(name: "cp_page_view_b", properties: [
|
43
|
+
"course_id": course_id as Any,
|
44
|
+
"course_name": course_name as Any,
|
45
|
+
"from_screen": from_screen.rawValue as Any ]
|
46
|
+
)
|
47
|
+
|
48
|
+
case .cpPageViewC(let course_id, let course_name, let from_screen):
|
49
|
+
return EventData(name: "cp_page_view_c", properties: [
|
50
|
+
"course_id": course_id as Any,
|
51
|
+
"course_name": course_name as Any,
|
52
|
+
"from_screen": from_screen?.rawValue as Any ]
|
53
|
+
)
|
54
|
+
|
55
|
+
case .cpPageViewD(let course_id, let course_name):
|
56
|
+
return EventData(name: "cp_page_view_d", properties: [
|
57
|
+
"course_id": course_id as Any,
|
58
|
+
"course_name": course_name as Any ]
|
59
|
+
)
|
60
|
+
}
|
35
61
|
}
|
36
|
-
Swift
|
37
62
|
}
|
38
|
-
|
63
|
+
}
|
64
|
+
Swift
|
65
|
+
}
|
66
|
+
|
67
|
+
it { should eq expected }
|
39
68
|
end
|
40
69
|
|
41
|
-
describe '#
|
42
|
-
|
43
|
-
let(:properties) { 'course_id:Long,course_name:String,from_screen: CourseProfileSource?' }
|
70
|
+
describe '#special_property_enums' do
|
71
|
+
subject { generator.special_property_enums(enums) }
|
44
72
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
end
|
73
|
+
let(:enums) { [
|
74
|
+
Evva::MixpanelEnum.new('CourseProfileSource', ['course_discovery', 'synced_courses']),
|
75
|
+
Evva::MixpanelEnum.new('PremiumFrom', ['Course Profile', 'Round Setup'])
|
76
|
+
] }
|
50
77
|
|
51
|
-
|
52
|
-
|
78
|
+
let(:expected) {
|
79
|
+
<<-Swift
|
80
|
+
// This file was automatically generated by evva: https://github.com/hole19/evva
|
53
81
|
|
54
|
-
|
55
|
-
expected = '"course_id": course_id, "course_name": course_name, "from_screen": from_screen.rawValue'
|
56
|
-
expect(generator.process_arguments(properties)).to eq expected
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
82
|
+
import Foundation
|
60
83
|
|
61
|
-
|
62
|
-
subject { trim_spaces(generator.special_property_enum(enum)) }
|
63
|
-
let(:enum) { Evva::MixpanelEnum.new('CourseProfileSource', 'course_discovery,synced_courses') }
|
64
|
-
let(:expected) { <<-Swift
|
65
|
-
import Foundation
|
84
|
+
extension Analytics {
|
66
85
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
86
|
+
enum CourseProfileSource: String {
|
87
|
+
case courseDiscovery = "course_discovery"
|
88
|
+
case syncedCourses = "synced_courses"
|
89
|
+
}
|
90
|
+
|
91
|
+
enum PremiumFrom: String {
|
92
|
+
case courseProfile = "Course Profile"
|
93
|
+
case roundSetup = "Round Setup"
|
94
|
+
}
|
95
|
+
}
|
96
|
+
Swift
|
97
|
+
}
|
73
98
|
|
74
|
-
it { should eq
|
99
|
+
it { should eq expected }
|
75
100
|
end
|
76
101
|
|
77
102
|
describe "#people_properties" do
|
78
|
-
subject {
|
103
|
+
subject { generator.people_properties(people_bundle, "") }
|
104
|
+
|
79
105
|
let(:people_bundle) { ['rounds_with_wear', 'friends_from_facebook'] }
|
80
|
-
let(:expected) { <<-Swift
|
81
|
-
fileprivate enum Counter: String {
|
82
|
-
case RoundsWithWear = "rounds_with_wear"
|
83
|
-
case FriendsFromFacebook = "friends_from_facebook"
|
84
106
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
107
|
+
let(:expected) {
|
108
|
+
<<-Swift
|
109
|
+
// This file was automatically generated by evva: https://github.com/hole19/evva
|
110
|
+
|
111
|
+
import Foundation
|
112
|
+
|
113
|
+
extension Analytics {
|
114
|
+
|
115
|
+
enum Property: String {
|
116
|
+
case roundsWithWear = "rounds_with_wear"
|
117
|
+
case friendsFromFacebook = "friends_from_facebook"
|
118
|
+
}
|
119
|
+
}
|
120
|
+
Swift
|
90
121
|
}
|
91
122
|
|
92
|
-
it { should eq
|
123
|
+
it { should eq expected }
|
93
124
|
end
|
94
125
|
end
|
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.
|
4
|
+
version: 0.2.0
|
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: 2021-08-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: safe_yaml
|
@@ -38,34 +38,6 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0.7'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: xml-simple
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '1.1'
|
48
|
-
type: :runtime
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '1.1'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: webmock
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '1.20'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '1.20'
|
69
41
|
description: Evva generates all the analytics event tracking functions for you
|
70
42
|
email: ricardo.trindade743@gmail.com
|
71
43
|
executables:
|
@@ -76,9 +48,12 @@ files:
|
|
76
48
|
- ".gitignore"
|
77
49
|
- ".rspec"
|
78
50
|
- ".rubocop_todo.yml"
|
51
|
+
- ".ruby-version"
|
52
|
+
- ".travis.yml"
|
79
53
|
- Gemfile
|
80
54
|
- Gemfile.lock
|
81
55
|
- README.md
|
56
|
+
- Rakefile
|
82
57
|
- bin/evva
|
83
58
|
- changelog.md
|
84
59
|
- evva.gemspec
|
@@ -86,7 +61,6 @@ files:
|
|
86
61
|
- lib/evva.rb
|
87
62
|
- lib/evva/android_generator.rb
|
88
63
|
- lib/evva/config.rb
|
89
|
-
- lib/evva/data_source.rb
|
90
64
|
- lib/evva/file_reader.rb
|
91
65
|
- lib/evva/google_sheet.rb
|
92
66
|
- lib/evva/logger.rb
|
@@ -97,14 +71,12 @@ files:
|
|
97
71
|
- lib/evva/version.rb
|
98
72
|
- rubocop.yml
|
99
73
|
- spec/evva_spec.rb
|
100
|
-
- spec/fixtures/sample_public_enums.
|
101
|
-
- spec/fixtures/
|
102
|
-
- spec/fixtures/sample_public_people_properties.
|
103
|
-
- spec/fixtures/sample_public_sheet.html
|
74
|
+
- spec/fixtures/sample_public_enums.csv
|
75
|
+
- spec/fixtures/sample_public_events.csv
|
76
|
+
- spec/fixtures/sample_public_people_properties.csv
|
104
77
|
- spec/fixtures/test.yml
|
105
78
|
- spec/lib/evva/android_generator_spec.rb
|
106
79
|
- spec/lib/evva/config_spec.rb
|
107
|
-
- spec/lib/evva/data_source_spec.rb
|
108
80
|
- spec/lib/evva/google_sheet_spec.rb
|
109
81
|
- spec/lib/evva/logger_spec.rb
|
110
82
|
- spec/lib/evva/object_extension_spec.rb
|
@@ -129,8 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
129
101
|
- !ruby/object:Gem::Version
|
130
102
|
version: '0'
|
131
103
|
requirements: []
|
132
|
-
|
133
|
-
rubygems_version: 2.6.13
|
104
|
+
rubygems_version: 3.1.6
|
134
105
|
signing_key:
|
135
106
|
specification_version: 4
|
136
107
|
summary: An event generating service
|