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.
@@ -5,13 +5,16 @@ describe Evva::Config do
5
5
  {
6
6
  type: 'EvvaOS',
7
7
  data_source: {
8
- type: 'google_sheet',
9
- sheet_id: 'abc1234567890'
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', sheet_id: 'abc1234567890') }
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(sheet_id) }
3
- let(:sheet_id) { 'abc1234567890' }
4
- let(:url_info) { "https://spreadsheets.google.com/feeds/worksheets/#{sheet_id}/public/full" }
5
- let(:url_sheet) { "https://spreadsheets.google.com/feeds/list/#{sheet_id}/od6/public/full" }
6
- let(:enum_sheet) { "https://spreadsheets.google.com/feeds/list/#{sheet_id}/osju1vh/public/full" }
7
- let(:people_sheet) { "https://spreadsheets.google.com/feeds/list/#{sheet_id}/ojyi830/public/full" }
8
- let(:file_info) { File.read('spec/fixtures/sample_public_info.html') }
9
- let(:file_sheet) { File.read('spec/fixtures/sample_public_sheet.html') }
10
- let(:enum_file) { File.read('spec/fixtures/sample_public_enums.html') }
11
- let(:people_file) { File.read('spec/fixtures/sample_public_people_properties.html') }
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
- it 'returns an array with the corresponding events' do
26
- expected = [Evva::MixpanelEvent.new('cp_page_view', { course_id: 'Long', course_name: 'String' }),
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
- context 'when given an inexistent sheet' do
34
- before { stub_request(:get, url_info).to_return(status: 400, body: 'Not Found', headers: {}) }
35
-
36
- it do
37
- expect { events }.to raise_error /Cannot access sheet/
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 'when given a private sheet' do
42
- before { stub_request(:get, url_info).to_return(status: 302, body: '<HTML></HTML>', headers: {}) }
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 /Cannot access sheet/
35
+ expect { events }.to raise_error /Http Error/
46
36
  end
47
37
  end
48
38
 
49
- context 'when url content is not XML' do
50
- before { stub_request(:get, url_info).to_return(status: 200, body: 'This is not XML; { this: "is json" }', headers: {}) }
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 XML/
43
+ expect { events }.to raise_error /Cannot parse. Expected CSV/
54
44
  end
55
45
  end
56
46
  end
57
47
 
58
- describe '#enum_classes' do
59
- subject(:enum_classes) { sheet.enum_classes }
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
- it 'returns an array with the corresponding events' do
78
- expect(enum_classes).to eq expected_enum
79
- end
51
+ it do
52
+ expect { people_properties }.not_to raise_error
80
53
  end
81
- end
82
54
 
83
- describe '#people_properties' do
84
- subject(:people_properties) { sheet.people_properties }
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
- context 'when given a valid sheet' do
93
- before do
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
- it do
99
- expect { people_properties }.not_to raise_error
100
- end
66
+ it do
67
+ expect { enum_classes }.not_to raise_error
68
+ end
101
69
 
102
- it 'returns an array with the corresponding events' do
103
- expect(people_properties).to eq expected_people_properties
104
- end
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 { trim_spaces(generator.events(event_bundle, "")) }
11
- let(:event_bundle) {
12
- [Evva::MixpanelEvent.new('nav_feed_tap', []),
13
- Evva::MixpanelEvent.new('cp_page_view', ['course_id:Long'],['course_name:String?'])]
14
- }
15
- let(:expected) { <<-Swift
16
- import CoreLocation
17
- import Foundation
18
- import SharedCode
19
-
20
- class MixpanelHelper: NSObject {
21
- enum Event {
22
- case trackNavFeedTap
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
- case .trackNavFeedTap
30
- return EventData(name:"nav_feed_tap")
19
+ import Foundation
31
20
 
32
- case .trackCpPageView(let course_id, let course_name):
33
- return EventData(name:"cp_page_view", properties: ["course_id": course_id, "course_name": course_name])
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
- it { should eq trim_spaces(expected) }
63
+ }
64
+ Swift
65
+ }
66
+
67
+ it { should eq expected }
39
68
  end
40
69
 
41
- describe '#process_arguments' do
42
- context "with optional arguments" do
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
- it 'processes the arguments looking for special properties' do
46
- expected = '"course_id": course_id, "course_name": course_name, "from_screen": from_screen.rawValue'
47
- expect(generator.process_arguments(properties)).to eq expected
48
- end
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
- context "without optional arguments" do
52
- let(:properties) { 'course_id:Long,course_name:String,from_screen: CourseProfileSource' }
78
+ let(:expected) {
79
+ <<-Swift
80
+ // This file was automatically generated by evva: https://github.com/hole19/evva
53
81
 
54
- it 'processes the arguments looking for special properties' do
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
- describe '#special_property_enum' do
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
- enum CourseProfileSource: String {
68
- case course_discovery = "course_discovery"
69
- case synced_courses = "synced_courses"
70
- }
71
- Swift
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 trim_spaces(expected) }
99
+ it { should eq expected }
75
100
  end
76
101
 
77
102
  describe "#people_properties" do
78
- subject { trim_spaces(generator.people_properties(people_bundle)) }
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
- func increment(times: Int = 1) {
86
- MixpanelAPI.instance.incrementCounter(rawValue, times: times)
87
- }
88
- }
89
- Swift
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 trim_spaces(expected) }
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.1.4.1
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: 2018-02-08 00:00:00.000000000 Z
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.html
101
- - spec/fixtures/sample_public_info.html
102
- - spec/fixtures/sample_public_people_properties.html
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
- rubyforge_project:
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