evva 0.1.4.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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