evva 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 91e13c0040b6c7afa9b48d0913dd7b12b301ffe4
4
- data.tar.gz: e14a7dd7e190d55d8827ab3e02c100e87374aec6
3
+ metadata.gz: 0ecc532385f462a9f37aec975d66fbd19b18aa05
4
+ data.tar.gz: acea35b0751f2f5574da3c75a615911a2093c6ab
5
5
  SHA512:
6
- metadata.gz: c9a76ca65eb48908a0d6f94c525f5c46fb8995a4e7cfd3fdf5d7b0edaee7688c82ad4200c239a468f493f3002148c821cfeb7c8ba12d9d0545e8f7d0f431534d
7
- data.tar.gz: 55ebd2109cb41956effa3930d7e7db558ce68910a442a04db0606e284b9e893fdb1932d249e3c38eb9b492bf969879fc727728189589ad25314d58aafbe570d2
6
+ metadata.gz: f628dec72519c201300590971a50c6ad81e7d0fe43d529b10b8d36f5463f03536c522a6307d2a082f2a39f55a147d626db9840521dca271cb895c336bc2ab668
7
+ data.tar.gz: 9a69b2a1810f3ea7a783e399fbda02eb03806526680096dfa1fb7f438e258480b4f7c551bb304078e4f0371b051bc48faa87bdac3dfbf3d2ac58f8aae5832d38
data/Gemfile CHANGED
@@ -1,10 +1,11 @@
1
1
  source 'https://rubygems.org'
2
2
  ruby '2.3.3'
3
3
 
4
- gem 'colorize', '~> 0.7'
5
- gem 'rubocop', '~> 0.49.1'
6
- gem 'safe_yaml', '~> 1.0'
7
- gem 'xml-simple', '~> 1.1'
4
+ gem 'colorize'
5
+ gem 'rubocop'
6
+ gem 'safe_yaml'
7
+ gem 'xml-simple'
8
+ gem 'byebug'
8
9
 
9
10
  gem 'rspec'
10
11
  gem 'rspec-its'
data/Gemfile.lock CHANGED
@@ -1,50 +1,51 @@
1
1
  GEM
2
2
  remote: https://rubygems.org/
3
3
  specs:
4
- addressable (2.5.1)
5
- public_suffix (~> 2.0, >= 2.0.2)
4
+ addressable (2.5.2)
5
+ public_suffix (>= 2.0.2, < 4.0)
6
6
  ast (2.3.0)
7
+ byebug (9.1.0)
7
8
  colorize (0.8.1)
8
9
  crack (0.4.3)
9
10
  safe_yaml (~> 1.0.0)
10
11
  diff-lcs (1.3)
11
12
  docile (1.1.5)
12
- hashdiff (0.3.5)
13
+ hashdiff (0.3.7)
13
14
  json (2.1.0)
14
15
  parallel (1.12.0)
15
16
  parser (2.4.0.0)
16
17
  ast (~> 2.2)
17
18
  powerpack (0.1.1)
18
- public_suffix (2.0.5)
19
+ public_suffix (3.0.0)
19
20
  rainbow (2.2.2)
20
21
  rake
21
- rake (12.0.0)
22
- rspec (3.6.0)
23
- rspec-core (~> 3.6.0)
24
- rspec-expectations (~> 3.6.0)
25
- rspec-mocks (~> 3.6.0)
26
- rspec-core (3.6.0)
27
- rspec-support (~> 3.6.0)
28
- rspec-expectations (3.6.0)
22
+ rake (12.1.0)
23
+ rspec (3.7.0)
24
+ rspec-core (~> 3.7.0)
25
+ rspec-expectations (~> 3.7.0)
26
+ rspec-mocks (~> 3.7.0)
27
+ rspec-core (3.7.0)
28
+ rspec-support (~> 3.7.0)
29
+ rspec-expectations (3.7.0)
29
30
  diff-lcs (>= 1.2.0, < 2.0)
30
- rspec-support (~> 3.6.0)
31
+ rspec-support (~> 3.7.0)
31
32
  rspec-its (1.2.0)
32
33
  rspec-core (>= 3.0.0)
33
34
  rspec-expectations (>= 3.0.0)
34
- rspec-mocks (3.6.0)
35
+ rspec-mocks (3.7.0)
35
36
  diff-lcs (>= 1.2.0, < 2.0)
36
- rspec-support (~> 3.6.0)
37
- rspec-support (3.6.0)
38
- rubocop (0.49.1)
37
+ rspec-support (~> 3.7.0)
38
+ rspec-support (3.7.0)
39
+ rubocop (0.51.0)
39
40
  parallel (~> 1.10)
40
41
  parser (>= 2.3.3.1, < 3.0)
41
42
  powerpack (~> 0.1)
42
- rainbow (>= 1.99.1, < 3.0)
43
+ rainbow (>= 2.2.2, < 3.0)
43
44
  ruby-progressbar (~> 1.7)
44
45
  unicode-display_width (~> 1.0, >= 1.0.1)
45
- ruby-progressbar (1.8.1)
46
+ ruby-progressbar (1.9.0)
46
47
  safe_yaml (1.0.4)
47
- simplecov (0.15.0)
48
+ simplecov (0.15.1)
48
49
  docile (~> 1.1.0)
49
50
  json (>= 1.8, < 3)
50
51
  simplecov-html (~> 0.10.0)
@@ -62,15 +63,16 @@ PLATFORMS
62
63
  ruby
63
64
 
64
65
  DEPENDENCIES
65
- colorize (~> 0.7)
66
+ byebug
67
+ colorize
66
68
  rspec
67
69
  rspec-its
68
- rubocop (~> 0.49.1)
69
- safe_yaml (~> 1.0)
70
+ rubocop
71
+ safe_yaml
70
72
  simplecov
71
73
  simplecov-rcov
72
74
  webmock (~> 1.20)
73
- xml-simple (~> 1.1)
75
+ xml-simple
74
76
 
75
77
  RUBY VERSION
76
78
  ruby 2.3.3p222
data/changelog.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # Change Log
2
2
 
3
+ ##[0.1.2] - 2018-01-25
4
+ Improves swift code generation
5
+
3
6
  ## [0.1.1] - 2017-11-07
4
7
  Fixes mismatch between file name and class name generated.
5
8
 
@@ -15,10 +15,10 @@ module Evva
15
15
  "import com.hole19golf.hole19.analytics.Event\n\n".freeze
16
16
 
17
17
  KOTIN_PEOPLE_FUNCTIONS =
18
- "\topen fun updateProperties(property: MixpanelProperties, value: Any) {\n"\
18
+ "\nopen fun updateProperties(property: MixpanelProperties, value: Any) {\n"\
19
19
  "\t\tmixpanelMask.updateProperties(property.key, value)"\
20
20
  "\t\n} \n"\
21
- "\topen fun incrementCounter(property: MixpanelProperties) {\n"\
21
+ "\nopen fun incrementCounter(property: MixpanelProperties) {\n"\
22
22
  "\t\tmixpanelMask.incrementCounter(property.key)"\
23
23
  "\t\n} \n".freeze
24
24
 
@@ -18,7 +18,9 @@ module Evva
18
18
  "MixpanelAPI.instance.incrementCounter(rawValue, times: times)\n"\
19
19
  '}'.freeze
20
20
 
21
- def events(bundle)
21
+ NATIVE_TYPES = %w[Long Int String Double Float Bool].freeze
22
+
23
+ def events(bundle, file_name)
22
24
  event_file = SWIFT_EVENT_HEADER
23
25
  bundle.each do |event|
24
26
  event_file += swift_case(event)
@@ -34,62 +36,63 @@ module Evva
34
36
 
35
37
  def swift_case(event_data)
36
38
  function_name = 'track' + titleize(event_data.event_name)
37
- if event_data.properties.nil?
38
- case_body = "\t\tcase #{function_name}\n"
39
+ if event_data.properties.empty?
40
+ "\t\tcase #{function_name}\n"
39
41
  else
40
- trimmed_properties = event_data.properties.gsub('Boolean', 'Bool')
41
- case_body = "\t\tcase #{function_name}(#{trimmed_properties})\n"
42
+ trimmed_properties = event_data.properties.map { |k, v| "#{k}: #{v.gsub('Boolean', 'Bool')}" }
43
+ "\t\tcase #{function_name}(#{trimmed_properties})\n"
42
44
  end
43
45
  end
44
46
 
45
47
  def swift_event_data(event_data)
46
48
  function_name = 'track' + titleize(event_data.event_name)
47
- if event_data.properties.nil?
49
+ if event_data.properties.empty?
48
50
  function_body = "case .#{function_name} \n" \
49
- "\treturn EventData(name:" + %("#{event_data.event_name}") + ")\n\n"
51
+ "\treturn EventData(name:\"#{event_data.event_name}\")\n\n"
50
52
  else
51
53
  function_header = prepend_let(event_data.properties)
52
- function_arguments = process_arguments(event_data.properties.gsub('Boolean', 'Bool'))
54
+ function_arguments = process_arguments(event_data.properties.map { |k, v| "#{k}: #{v.gsub('Boolean', 'Bool')}" })
53
55
  function_body = "case .#{function_name}(#{function_header}):\n" \
54
- "\treturn EventData(name:" + %("#{event_data.event_name}") + ", properties: [#{function_arguments}])\n\n"
56
+ "\treturn EventData(name:\"#{event_data.event_name}\", properties: [#{function_arguments}])\n\n"
55
57
  end
56
-
57
58
  function_body
58
59
  end
59
60
 
60
- def event_enum(enum)
61
+ def event_enum(enum, file_name)
61
62
  # empty
62
63
  end
63
64
 
64
- def people_properties(people_bundle)
65
+ def people_properties(people_bundle, file_name)
65
66
  properties = SWIFT_PEOPLE_HEADER
66
- people_bundle.each do |prop|
67
- properties += swift_people_const(prop)
68
- end
69
- properties += SWIFT_INCREMENT_FUNCTION + "\n}"
67
+ properties += people_bundle.map { |prop| swift_people_const(prop) }.join('')
68
+ properties + "\n" + SWIFT_INCREMENT_FUNCTION + "\n}\n"
70
69
  end
71
70
 
72
71
  def special_property_enum(enum)
73
72
  enum_body = "import Foundation\n\n"
74
- enum_values = enum.values.split(',')
75
73
  enum_body += "enum #{enum.enum_name}: String {\n"
76
- enum_values.each do |vals|
77
- enum_body += "\tcase #{vals.tr(' ', '_')} = " + %("#{vals}") + "\n"
78
- end
79
- enum_body += "} \n"
74
+ enum_body += enum.values.map { |vals| "\tcase #{vals.tr(' ', '_')} = \"#{vals}\"\n" }.join('')
75
+ enum_body + "} \n"
80
76
  end
81
77
 
82
78
  def process_arguments(props)
83
79
  arguments = ''
84
- props.split(',').each do |property|
85
- if is_special_property(property)
86
- if is_optional_property(property)
87
-
80
+ props.each do |property|
81
+ val = property.split(':').first
82
+ if is_special_property?(property)
83
+ if is_optional_property?(property)
84
+ val = val.chomp('?')
85
+ arguments += "\"#{val}\": #{val}.rawValue, "
88
86
  else
89
- arguments += %("#{property.split(':').first}") + ':' + property.split(':').first + '.rawValue, '
87
+ arguments += "\"#{val}\": #{val}.rawValue, "
90
88
  end
91
89
  else
92
- arguments += %("#{property.split(':').first}") + ':' + property.split(':').first + ', '
90
+ if is_optional_property?(property)
91
+ val = val.chomp('?')
92
+ arguments += "\"#{val}\": #{val}, "
93
+ else
94
+ arguments += "\"#{val}\": #{val}, "
95
+ end
93
96
  end
94
97
  end
95
98
  arguments.chomp(', ')
@@ -97,28 +100,22 @@ module Evva
97
100
 
98
101
  private
99
102
 
100
- def is_special_property(prop)
101
- types_array = %w[Long Int String Double Float Boolean]
103
+ def is_special_property?(prop)
102
104
  type = prop.split(':')[1]
103
- types_array.include?(type) ? false : true
105
+ !NATIVE_TYPES.include?(type.chomp('?'))
104
106
  end
105
107
 
106
- def is_optional_property(prop)
108
+ def is_optional_property?(prop)
107
109
  type = prop.split(':')[1]
108
110
  type.include?('?') ? true : false
109
111
  end
110
112
 
111
-
112
113
  def prepend_let(props)
113
- function_header = ''
114
- props.split(',').each do |property|
115
- function_header += 'let ' + property.split(':')[0] + ', '
116
- end
117
- function_header.chomp(', ')
114
+ props.map { |k, v| "let #{k}" }.join(', ')
118
115
  end
119
116
 
120
117
  def swift_people_const(prop)
121
- case_body = "\tcase #{prop.property_name} = " + %("#{prop.property_value}") + "\n"
118
+ "\tcase #{titleize(prop)} = \"#{prop}\"\n"
122
119
  end
123
120
 
124
121
  def titleize(str)
data/lib/evva/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Evva
2
- VERSION = '0.1.1'.freeze
3
- VERSION_UPDATED_AT = '2017-11-07'.freeze
2
+ VERSION = '0.1.2'.freeze
3
+ VERSION_UPDATED_AT = '2018-01-25'.freeze
4
4
  end
@@ -7,10 +7,10 @@ describe Evva::SwiftGenerator do
7
7
  end
8
8
 
9
9
  describe '#events' do
10
- subject { trim_spaces(generator.events(event_bundle)) }
10
+ subject { trim_spaces(generator.events(event_bundle, "")) }
11
11
  let(:event_bundle) {
12
12
  [Evva::MixpanelEvent.new('nav_feed_tap', []),
13
- Evva::MixpanelEvent.new('cp_page_view', 'course_id:Long,course_name:String')]
13
+ Evva::MixpanelEvent.new('cp_page_view', ['course_id:Long'],['course_name:String?'])]
14
14
  }
15
15
  let(:expected) { <<-Swift
16
16
  import CoreLocation
@@ -20,47 +20,41 @@ describe Evva::SwiftGenerator do
20
20
  class MixpanelHelper: NSObject {
21
21
  enum Event {
22
22
  case trackNavFeedTap
23
- case trackCpPageView(course_id:Long,course_name:String)
23
+ case trackCpPageView(course_id: Long, course_name: String?)
24
24
  }
25
- private var data: EventData {
26
- switch self {
27
25
 
28
- case .trackNavFeedTap
29
- return EventData(name:"nav_feed_tap")
26
+ private var data: EventData {
27
+ switch self {
30
28
 
31
- case .trackCpPageView(let course_id, let course_name):
32
- return EventData(name:"cp_page_view", properties: ["course_id":course_id, "course_name":course_name])
29
+ case .trackNavFeedTap
30
+ return EventData(name:"nav_feed_tap")
33
31
 
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
+ }
34
35
  }
35
- }
36
36
  Swift
37
37
  }
38
38
  it { should eq trim_spaces(expected) }
39
39
  end
40
40
 
41
- describe '#swift_case' do
42
- context 'event has no properties' do
43
- event = Evva::MixpanelEvent.new('nav_feed_tap', [])
44
- it 'should create a case for an event to be tracked' do
45
- expected = "\t\tcase trackNavFeedTap\n"
46
- expect(generator.swift_case(event)).to eq expected
47
- end
48
- end
41
+ describe '#process_arguments' do
42
+ context "with optional arguments" do
43
+ let(:properties) { 'course_id:Long,course_name:String,from_screen: CourseProfileSource?' }
49
44
 
50
- context 'event has properties' do
51
- event = Evva::MixpanelEvent.new('cp_page_view', 'course_id:Long,course_name:String')
52
- it 'should create a case for an event to be tracked' do
53
- expected = "\t\tcase trackCpPageView(course_id:Long,course_name:String)\n"
54
- expect(generator.swift_case(event)).to eq expected
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
55
48
  end
56
49
  end
57
- end
58
50
 
59
- describe '#process_arguments' do
60
- properties = 'course_id:Long,course_name:String,from_screen: CourseProfileSource'
61
- it 'should process the arguments looking for special properties' do
62
- expected = '"course_id":course_id, "course_name":course_name, "from_screen":from_screen.rawValue'
63
- expect(generator.process_arguments(properties)).to eq expected
51
+ context "without optional arguments" do
52
+ let(:properties) { 'course_id:Long,course_name:String,from_screen: CourseProfileSource' }
53
+
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
64
58
  end
65
59
  end
66
60
 
@@ -71,11 +65,30 @@ describe Evva::SwiftGenerator do
71
65
  import Foundation
72
66
 
73
67
  enum CourseProfileSource: String {
74
- case course_discovery = "course_discovery"
75
- case synced_courses = "synced_courses"
68
+ case course_discovery = "course_discovery"
69
+ case synced_courses = "synced_courses"
76
70
  }
77
71
  Swift
78
72
  }
73
+
74
+ it { should eq trim_spaces(expected) }
75
+ end
76
+
77
+ describe "#people_properties" do
78
+ subject { trim_spaces(generator.people_properties(people_bundle)) }
79
+ 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
+
85
+ func increment(times: Int = 1) {
86
+ MixpanelAPI.instance.incrementCounter(rawValue, times: times)
87
+ }
88
+ }
89
+ Swift
90
+ }
91
+
79
92
  it { should eq trim_spaces(expected) }
80
93
  end
81
94
  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.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - RicardoTrindade
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-07 00:00:00.000000000 Z
11
+ date: 2018-01-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: safe_yaml