evva 0.1.4.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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::AnalyticsEvent.new('cp_page_view', { course_id: 'Long', course_name: 'String' }),
26
+ Evva::AnalyticsEvent.new('nav_feed_tap', {}),
27
+ Evva::AnalyticsEvent.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::AnalyticsEnum.new('PageViewSourceScreen', ['course_discovery','synced_courses','nearby','deal']),
73
+ Evva::AnalyticsEnum.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::AnalyticsEvent.new('cp_page_view'),
9
+ Evva::AnalyticsEvent.new('cp_page_view_a', { course_id: 'Long', course_name: 'String' }),
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
+ ] }
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::AnalyticsEnum.new('CourseProfileSource', ['course_discovery', 'synced_courses']),
75
+ Evva::AnalyticsEnum.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.2
4
+ version: 0.3.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-14 00:00:00.000000000 Z
11
+ date: 2021-12-16 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,35 +48,34 @@ files:
76
48
  - ".gitignore"
77
49
  - ".rspec"
78
50
  - ".rubocop_todo.yml"
51
+ - ".travis.yml"
79
52
  - Gemfile
80
53
  - Gemfile.lock
81
54
  - README.md
55
+ - Rakefile
82
56
  - bin/evva
83
57
  - changelog.md
84
58
  - evva.gemspec
85
59
  - evva_config.yml
86
60
  - lib/evva.rb
61
+ - lib/evva/analytics_enum.rb
62
+ - lib/evva/analytics_event.rb
87
63
  - lib/evva/android_generator.rb
88
64
  - lib/evva/config.rb
89
- - lib/evva/data_source.rb
90
65
  - lib/evva/file_reader.rb
91
66
  - lib/evva/google_sheet.rb
92
67
  - lib/evva/logger.rb
93
- - lib/evva/mixpanel_enum.rb
94
- - lib/evva/mixpanel_event.rb
95
68
  - lib/evva/object_extension.rb
96
69
  - lib/evva/swift_generator.rb
97
70
  - lib/evva/version.rb
98
71
  - rubocop.yml
99
72
  - 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
73
+ - spec/fixtures/sample_public_enums.csv
74
+ - spec/fixtures/sample_public_events.csv
75
+ - spec/fixtures/sample_public_people_properties.csv
104
76
  - spec/fixtures/test.yml
105
77
  - spec/lib/evva/android_generator_spec.rb
106
78
  - spec/lib/evva/config_spec.rb
107
- - spec/lib/evva/data_source_spec.rb
108
79
  - spec/lib/evva/google_sheet_spec.rb
109
80
  - spec/lib/evva/logger_spec.rb
110
81
  - spec/lib/evva/object_extension_spec.rb
@@ -129,8 +100,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
129
100
  - !ruby/object:Gem::Version
130
101
  version: '0'
131
102
  requirements: []
132
- rubyforge_project:
133
- rubygems_version: 2.6.13
103
+ rubygems_version: 3.1.6
134
104
  signing_key:
135
105
  specification_version: 4
136
106
  summary: An event generating service
@@ -1,23 +0,0 @@
1
- module Evva
2
- class DataSource
3
- def initialize(keys)
4
- unless keys.is_a?(Hash)
5
- raise ArgumentError, "keys: expected Hash, got #{keys.class}"
6
- end
7
-
8
- keys.each do |property, v|
9
- unless v.is_a?(Hash)
10
- raise ArgumentError, "keys['#{property}']: expected Hash, got #{v.class}"
11
- end
12
-
13
- v.each do |key, v|
14
- unless v.is_a?(String) || v.nil?
15
- raise ArgumentError, "keys['#{property}']['#{key}']: expected String, got #{v.class}"
16
- end
17
- end
18
- end
19
-
20
- @keys = Hash[keys.map { |k, v| [k.downcase, v] }]
21
- end
22
- end
23
- end
@@ -1 +0,0 @@
1
- <?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:gsx='http://schemas.google.com/spreadsheets/2006/extended'><id>https://spreadsheets.google.com/feeds/list/1LaJd68os3g_GFlerogC64grNIlXb2iukMznOvdml7A4/osju1vh/public/full</id><updated>2017-08-22T10:31:52.161Z</updated><category scheme='http://schemas.google.com/spreadsheets/2006' term='http://schemas.google.com/spreadsheets/2006#list'/><title type='text'>Enums</title><link rel='alternate' type='application/atom+xml' href='https://docs.google.com/a/hole19golf.com/spreadsheets/d/1LaJd68os3g_GFlerogC64grNIlXb2iukMznOvdml7A4/pubhtml'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/1LaJd68os3g_GFlerogC64grNIlXb2iukMznOvdml7A4/osju1vh/public/full'/><link rel='http://schemas.google.com/g/2005#post' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/1LaJd68os3g_GFlerogC64grNIlXb2iukMznOvdml7A4/osju1vh/public/full'/><link rel='self' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/1LaJd68os3g_GFlerogC64grNIlXb2iukMznOvdml7A4/osju1vh/public/full'/><author><name>ricardo.trindade</name><email>ricardo.trindade@hole19golf.com</email></author><openSearch:totalResults>2</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><entry><id>https://spreadsheets.google.com/feeds/list/1LaJd68os3g_GFlerogC64grNIlXb2iukMznOvdml7A4/osju1vh/public/full/cokwr</id><updated>2017-08-22T10:31:52.161Z</updated><category scheme='http://schemas.google.com/spreadsheets/2006' term='http://schemas.google.com/spreadsheets/2006#list'/><title type='text'>PageViewSourceScreen</title><content type='text'>values: course_discovery,synced_courses,nearby,deal</content><link rel='self' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/1LaJd68os3g_GFlerogC64grNIlXb2iukMznOvdml7A4/osju1vh/public/full/cokwr'/><gsx:enum>PageViewSourceScreen</gsx:enum><gsx:values>course_discovery,synced_courses,nearby,deal</gsx:values></entry><entry><id>https://spreadsheets.google.com/feeds/list/1LaJd68os3g_GFlerogC64grNIlXb2iukMznOvdml7A4/osju1vh/public/full/cpzh4</id><updated>2017-08-22T10:31:52.161Z</updated><category scheme='http://schemas.google.com/spreadsheets/2006' term='http://schemas.google.com/spreadsheets/2006#list'/><title type='text'>PremiumClickBuy</title><content type='text'>values: notes,hi_res_maps,whatever</content><link rel='self' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/1LaJd68os3g_GFlerogC64grNIlXb2iukMznOvdml7A4/osju1vh/public/full/cpzh4'/><gsx:enum>PremiumClickBuy</gsx:enum><gsx:values>notes,hi_res_maps,whatever</gsx:values></entry></feed>
@@ -1 +0,0 @@
1
- <?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:gs='http://schemas.google.com/spreadsheets/2006'><id>https://spreadsheets.google.com/feeds/worksheets/abcdefgh/public/full</id><updated>2017-08-22T10:31:52.161Z</updated><category scheme='http://schemas.google.com/spreadsheets/2006' term='http://schemas.google.com/spreadsheets/2006#worksheet'/><title type='text'>TestingEvva</title><link rel='alternate' type='application/atom+xml' href='https://docs.google.com/a/hole19golf.com/spreadsheets/d/abc1234567890/pubhtml'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/worksheets/abc1234567890/public/full'/><link rel='http://schemas.google.com/g/2005#post' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/worksheets/abc1234567890/public/full'/><link rel='self' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/worksheets/abc1234567890/public/full'/><author><name>ricardo.trindade</name><email>ricardo.trindade@hole19golf.com</email></author><openSearch:totalResults>3</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><entry><id>https://spreadsheets.google.com/feeds/worksheets/abc1234567890/public/full/od6</id><updated>2017-08-22T10:31:52.161Z</updated><category scheme='http://schemas.google.com/spreadsheets/2006' term='http://schemas.google.com/spreadsheets/2006#worksheet'/><title type='text'>Events</title><content type='text'>Events</content><link rel='http://schemas.google.com/spreadsheets/2006#listfeed' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/abc1234567890/od6/public/full'/><link rel='http://schemas.google.com/spreadsheets/2006#cellsfeed' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/cells/abc1234567890/od6/public/full'/><link rel='http://schemas.google.com/visualization/2008#visualizationApi' type='application/atom+xml' href='https://docs.google.com/a/hole19golf.com/spreadsheets/d/abc1234567890/gviz/tq?gid=0&amp;pub=1'/><link rel='http://schemas.google.com/spreadsheets/2006#exportcsv' type='text/csv' href='https://docs.google.com/a/hole19golf.com/spreadsheets/d/abc1234567890/export?gid=0&amp;format=csv'/><link rel='self' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/worksheets/abc1234567890/public/full/od6'/><gs:colCount>26</gs:colCount><gs:rowCount>1000</gs:rowCount></entry><entry><id>https://spreadsheets.google.com/feeds/worksheets/abc1234567890/public/full/ojyi830</id><updated>2017-08-22T10:31:52.161Z</updated><category scheme='http://schemas.google.com/spreadsheets/2006' term='http://schemas.google.com/spreadsheets/2006#worksheet'/><title type='text'>PeopleProperties</title><content type='text'>PeopleProperties</content><link rel='http://schemas.google.com/spreadsheets/2006#listfeed' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/abc1234567890/ojyi830/public/full'/><link rel='http://schemas.google.com/spreadsheets/2006#cellsfeed' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/cells/abc1234567890/ojyi830/public/full'/><link rel='http://schemas.google.com/visualization/2008#visualizationApi' type='application/atom+xml' href='https://docs.google.com/a/hole19golf.com/spreadsheets/d/abc1234567890/gviz/tq?gid=1206814390&amp;pub=1'/><link rel='http://schemas.google.com/spreadsheets/2006#exportcsv' type='text/csv' href='https://docs.google.com/a/hole19golf.com/spreadsheets/d/abc1234567890/export?gid=1206814390&amp;format=csv'/><link rel='self' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/worksheets/abc1234567890/public/full/ojyi830'/><gs:colCount>26</gs:colCount><gs:rowCount>1000</gs:rowCount></entry><entry><id>https://spreadsheets.google.com/feeds/worksheets/abc1234567890/public/full/osju1vh</id><updated>2017-08-22T10:31:52.161Z</updated><category scheme='http://schemas.google.com/spreadsheets/2006' term='http://schemas.google.com/spreadsheets/2006#worksheet'/><title type='text'>Enums</title><content type='text'>Enums</content><link rel='http://schemas.google.com/spreadsheets/2006#listfeed' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/abc1234567890/osju1vh/public/full'/><link rel='http://schemas.google.com/spreadsheets/2006#cellsfeed' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/cells/abc1234567890/osju1vh/public/full'/><link rel='http://schemas.google.com/visualization/2008#visualizationApi' type='application/atom+xml' href='https://docs.google.com/a/hole19golf.com/spreadsheets/d/abc1234567890/gviz/tq?gid=1726367271&amp;pub=1'/><link rel='http://schemas.google.com/spreadsheets/2006#exportcsv' type='text/csv' href='https://docs.google.com/a/hole19golf.com/spreadsheets/d/abc1234567890/export?gid=1726367271&amp;format=csv'/><link rel='self' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/worksheets/abc1234567890/public/full/osju1vh'/><gs:colCount>26</gs:colCount><gs:rowCount>1000</gs:rowCount></entry></feed>
@@ -1 +0,0 @@
1
- <?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:gsx='http://schemas.google.com/spreadsheets/2006/extended'><id>https://spreadsheets.google.com/feeds/list/1LaJd68os3g_GFlerogC64grNIlXb2iukMznOvdml7A4/ojyi830/public/full</id><updated>2017-09-06T13:27:41.023Z</updated><category scheme='http://schemas.google.com/spreadsheets/2006' term='http://schemas.google.com/spreadsheets/2006#list'/><title type='text'>PeopleProperties</title><link rel='alternate' type='application/atom+xml' href='https://docs.google.com/a/hole19golf.com/spreadsheets/d/1LaJd68os3g_GFlerogC64grNIlXb2iukMznOvdml7A4/pubhtml'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/1LaJd68os3g_GFlerogC64grNIlXb2iukMznOvdml7A4/ojyi830/public/full'/><link rel='http://schemas.google.com/g/2005#post' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/1LaJd68os3g_GFlerogC64grNIlXb2iukMznOvdml7A4/ojyi830/public/full'/><link rel='self' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/1LaJd68os3g_GFlerogC64grNIlXb2iukMznOvdml7A4/ojyi830/public/full'/><author><name>ricardo.trindade</name><email>ricardo.trindade@hole19golf.com</email></author><openSearch:totalResults>2</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><entry><id>https://spreadsheets.google.com/feeds/list/1LaJd68os3g_GFlerogC64grNIlXb2iukMznOvdml7A4/ojyi830/public/full/cokwr</id><updated>2017-09-06T13:27:41.023Z</updated><category scheme='http://schemas.google.com/spreadsheets/2006' term='http://schemas.google.com/spreadsheets/2006#list'/><title type='text'>roundsWithWear</title><content type='text'>value: rounds_with_wear</content><link rel='self' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/1LaJd68os3g_GFlerogC64grNIlXb2iukMznOvdml7A4/ojyi830/public/full/cokwr'/><gsx:properties>roundsWithWear</gsx:properties><gsx:value>rounds_with_wear</gsx:value></entry><entry><id>https://spreadsheets.google.com/feeds/list/1LaJd68os3g_GFlerogC64grNIlXb2iukMznOvdml7A4/ojyi830/public/full/cpzh4</id><updated>2017-09-06T13:27:41.023Z</updated><category scheme='http://schemas.google.com/spreadsheets/2006' term='http://schemas.google.com/spreadsheets/2006#list'/><title type='text'>totalFriends</title><content type='text'>value: total_friends</content><link rel='self' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/1LaJd68os3g_GFlerogC64grNIlXb2iukMznOvdml7A4/ojyi830/public/full/cpzh4'/><gsx:properties>totalFriends</gsx:properties><gsx:value>total_friends</gsx:value></entry></feed>
@@ -1 +0,0 @@
1
- <?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:gsx='http://schemas.google.com/spreadsheets/2006/extended'><id>https://spreadsheets.google.com/feeds/list/abc1234567890/od6/public/full</id><updated>2017-08-22T10:31:52.161Z</updated><category scheme='http://schemas.google.com/spreadsheets/2006' term='http://schemas.google.com/spreadsheets/2006#list'/><title type='text'>Events</title><link rel='alternate' type='application/atom+xml' href='https://docs.google.com/a/hole19golf.com/spreadsheets/d/abc1234567890/pubhtml'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/abc1234567890/od6/public/full'/><link rel='http://schemas.google.com/g/2005#post' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/abc1234567890/od6/public/full'/><link rel='self' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/abc1234567890/od6/public/full'/><author><name>ricardo.trindade</name><email>ricardo.trindade@hole19golf.com</email></author><openSearch:totalResults>3</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><entry><id>https://spreadsheets.google.com/feeds/list/abc1234567890/od6/public/full/cokwr</id><updated>2017-08-22T10:31:52.161Z</updated><category scheme='http://schemas.google.com/spreadsheets/2006' term='http://schemas.google.com/spreadsheets/2006#list'/><title type='text'>trackCpPageView</title><content type='text'>eventname: cp_page_view, props: course_id:Long,course_name:String</content><link rel='self' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/abc1234567890/od6/public/full/cokwr'/><gsx:functionname>trackCpPageView</gsx:functionname><gsx:eventname>cp_page_view</gsx:eventname><gsx:props>course_id:Long,course_name:String</gsx:props></entry><entry><id>https://spreadsheets.google.com/feeds/list/abc1234567890/od6/public/full/cpzh4</id><updated>2017-08-22T10:31:52.161Z</updated><category scheme='http://schemas.google.com/spreadsheets/2006' term='http://schemas.google.com/spreadsheets/2006#list'/><title type='text'>trackNavFeedTap</title><content type='text'>eventname: nav_feed_tap</content><link rel='self' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/abc1234567890/od6/public/full/cpzh4'/><gsx:functionname>trackNavFeedTap</gsx:functionname><gsx:eventname>nav_feed_tap</gsx:eventname><gsx:props></gsx:props></entry><entry><id>https://spreadsheets.google.com/feeds/list/abc1234567890/od6/public/full/cre1l</id><updated>2017-08-22T10:31:52.161Z</updated><category scheme='http://schemas.google.com/spreadsheets/2006' term='http://schemas.google.com/spreadsheets/2006#list'/><title type='text'>trackCpViewScorecard</title><content type='text'>eventname: cp_view_scorecard, props: course_id:Long,course_name:String</content><link rel='self' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/abc1234567890/od6/public/full/cre1l'/><gsx:functionname>trackCpViewScorecard</gsx:functionname><gsx:eventname>cp_view_scorecard</gsx:eventname><gsx:props>course_id:Long,course_name:String</gsx:props></entry></feed>
@@ -1,28 +0,0 @@
1
- describe Evva::DataSource do
2
- subject(:dict) { Evva::DataSource.new(keys) }
3
-
4
- describe '.initialize' do
5
- let(:keys) { { 'event' => { 'kNo1' => 'text' } } }
6
- it { expect { subject }.not_to raise_error }
7
-
8
- context 'when created with invalid type parameters' do
9
- let(:keys) { 'cenas' }
10
- it { expect { subject }.to raise_error /expected Hash/ }
11
- end
12
-
13
- context 'when created with an invalid json schema' do
14
- let(:keys) { { 'event' => 'text' } }
15
- it { expect { subject }.to raise_error /event.+expected Hash/ }
16
- end
17
-
18
- context 'when created with an invalid json schema' do
19
- let(:keys) { { 'a-event' => { 'kNo1' => { 'wtvr' => 'text' } } } }
20
- it { expect { subject }.to raise_error /a-event.+kNo1.+expected String/ }
21
- end
22
-
23
- context 'when given empty translations' do
24
- let(:keys) { { 'event' => { 'kNo1' => nil } } }
25
- it { expect { subject }.not_to raise_error }
26
- end
27
- end
28
- end