ios_analytics_cli 1.0.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.
Files changed (42) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +135 -0
  3. data/.rubocop.yml +2 -0
  4. data/Gemfile +7 -0
  5. data/Gemfile.lock +62 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +48 -0
  8. data/Rakefile +10 -0
  9. data/bin/console +14 -0
  10. data/bin/setup +8 -0
  11. data/exe/analytics +34 -0
  12. data/ios_analytics_cli.gemspec +35 -0
  13. data/lib/ios_analytics_cli.rb +52 -0
  14. data/lib/ios_analytics_cli/commands/command.rb +6 -0
  15. data/lib/ios_analytics_cli/commands/generate.rb +77 -0
  16. data/lib/ios_analytics_cli/commands/init.rb +55 -0
  17. data/lib/ios_analytics_cli/error_handler.rb +22 -0
  18. data/lib/ios_analytics_cli/helpers/terminal.rb +11 -0
  19. data/lib/ios_analytics_cli/info.rb +16 -0
  20. data/lib/ios_analytics_cli/interactors/event.rb +22 -0
  21. data/lib/ios_analytics_cli/interactors/interactor.rb +8 -0
  22. data/lib/ios_analytics_cli/interactors/user_property.rb +12 -0
  23. data/lib/ios_analytics_cli/io/config.rb +18 -0
  24. data/lib/ios_analytics_cli/io/io.rb +10 -0
  25. data/lib/ios_analytics_cli/serializers/base.rb +43 -0
  26. data/lib/ios_analytics_cli/serializers/objc/analytics.rb +126 -0
  27. data/lib/ios_analytics_cli/serializers/objc/enums.rb +67 -0
  28. data/lib/ios_analytics_cli/serializers/objc/event.rb +182 -0
  29. data/lib/ios_analytics_cli/serializers/objc/logger.rb +53 -0
  30. data/lib/ios_analytics_cli/serializers/objc/objc.rb +23 -0
  31. data/lib/ios_analytics_cli/serializers/objc/screen.rb +90 -0
  32. data/lib/ios_analytics_cli/serializers/objc/user_property.rb +120 -0
  33. data/lib/ios_analytics_cli/serializers/swift/analytics.rb +63 -0
  34. data/lib/ios_analytics_cli/serializers/swift/event.rb +121 -0
  35. data/lib/ios_analytics_cli/serializers/swift/logger.rb +38 -0
  36. data/lib/ios_analytics_cli/serializers/swift/screen.rb +55 -0
  37. data/lib/ios_analytics_cli/serializers/swift/swift.rb +20 -0
  38. data/lib/ios_analytics_cli/serializers/swift/user_property.rb +69 -0
  39. data/lib/ios_analytics_cli/templates/header.erb +7 -0
  40. data/lib/ios_analytics_cli/templates/templates.rb +12 -0
  41. data/lib/ios_analytics_cli/version.rb +4 -0
  42. metadata +172 -0
@@ -0,0 +1,63 @@
1
+ module Analytics
2
+ module Serializer
3
+ class Swift < Base
4
+ # It's named AnalyticsFile instead of Analytics,
5
+ # because it failed to have a class which used the same name as the parent module.
6
+ class AnalyticsFile
7
+ def initialize(src)
8
+ @src = src
9
+ end
10
+
11
+ def save(path)
12
+ @file_name = 'Analytics.swift'
13
+ output_path = File.join(path, @file_name)
14
+ File.write(output_path, render)
15
+ end
16
+
17
+ private
18
+
19
+ def render
20
+ ERB.new(template, nil, '-').result(binding)
21
+ end
22
+
23
+ def template
24
+ <<~TEMPLATE
25
+ <%= ERB.new(Analytics::Templates.tmpl_at('header.erb')).result(binding) %>
26
+
27
+ import Foundation
28
+
29
+ final class Analytics {
30
+
31
+ private let loggers: [AnalyticsLogger]
32
+
33
+ init(loggers: [AnalyticsLogger]) {
34
+ self.loggers = loggers
35
+ }
36
+ }
37
+
38
+ // MARK: - AnalyticsLogger
39
+
40
+ extension Analytics: AnalyticsLogger {
41
+
42
+ func set(enabled: Bool) {
43
+ loggers.forEach { $0.set(enabled: enabled) }
44
+ }
45
+
46
+ func log(event: Analytics.Event) {
47
+ loggers.forEach { $0.log(event: event) }
48
+ }
49
+
50
+ func track(screen: Analytics.Screen) {
51
+ loggers.forEach { $0.track(screen: screen) }
52
+ }
53
+
54
+ func set(userProperty: Analytics.UserProperty) {
55
+ loggers.forEach { $0.set(userProperty: userProperty) }
56
+ }
57
+ }
58
+ TEMPLATE
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,121 @@
1
+ module Analytics
2
+ module Serializer
3
+ class Swift < Base
4
+ class Event
5
+ def initialize(src)
6
+ @src = src
7
+ end
8
+
9
+ def save(path)
10
+ @file_name = 'AnalyticsEvent.swift'
11
+ output_path = File.join(path, @file_name)
12
+ File.write(output_path, render)
13
+ end
14
+
15
+ private
16
+
17
+ def render
18
+ ERB.new(template, nil, '-').result(binding)
19
+ end
20
+
21
+ def template
22
+ <<~TEMPLATE
23
+ <%= ERB.new(Analytics::Templates.tmpl_at('header.erb')).result(binding) %>
24
+
25
+ import Foundation
26
+
27
+ extension Analytics {
28
+
29
+ struct Event {
30
+
31
+ let name: String
32
+ let properties: [String: Any]
33
+
34
+ private init(name: String, properties: [String: Any] = [:]) {
35
+ self.name = name
36
+ self.properties = properties
37
+ }
38
+ }
39
+ }
40
+
41
+ // MARK: - Events
42
+
43
+ extension Analytics.Event {
44
+ <% @src["events"].each do |event| -%>
45
+
46
+ /// <%= event["description"] -%>
47
+ <% if event["properties"].nil? %>
48
+ static var <%= event["name"].camel_case %>: Analytics.Event {
49
+ return .init(name: "<%= event["name"] %>")
50
+ }
51
+ <% else %>
52
+ <% event["properties"].each do |property| -%>
53
+ /// - Parameter <%= property["name"] %>: <%= property["description"] %>
54
+ <% end -%>
55
+ static func <%= event["name"].camel_case %>(<%= format_method_params(event["properties"])-%>) -> Analytics.Event {
56
+ return .init(name: "<%= event["name"] %>", properties: <%= format_init_properties(event["properties"]) %>)
57
+ }
58
+ <% end -%>
59
+ <% end %>
60
+ }
61
+
62
+ // MARK: - Event Property Enums
63
+
64
+ extension Analytics.Event {
65
+ <% Interactor::Event.all_enum_properties(@src['events']).each do |property| -%>
66
+
67
+ /// <%= property["description"] %>
68
+ enum <%= property["name"].pascal_case -%>: String {
69
+ <% property["values"].each do |value| -%>
70
+ case <%= value.camel_case -%> = "<%= value %>"
71
+ <% end -%>
72
+ }
73
+ <% end -%>
74
+ }
75
+ TEMPLATE
76
+ end
77
+
78
+ ## Helper methods called from the ERB template
79
+
80
+ # Formats the parameters in Swift method.
81
+ def format_method_params(properties)
82
+ result = properties.map do |property|
83
+ "#{property['name'].camel_case}: #{format_property_type(property)}"
84
+ end
85
+
86
+ return result.join(', ')
87
+ end
88
+
89
+ # Maps the property type to Swift type.
90
+ def format_property_type(property)
91
+ # if it doesn't have values, it's not an enum,
92
+ # and if it does, we'll return capitalized property name,
93
+ # because an enum with the same name will be generated as well
94
+ if property['values'].nil?
95
+ case property['type']
96
+ when 'text'
97
+ 'String'
98
+ when 'number'
99
+ 'Int'
100
+ when 'decimal'
101
+ 'Double'
102
+ else
103
+ 'unknown-type'
104
+ end
105
+ else
106
+ property['name'].pascal_case
107
+ end
108
+ end
109
+
110
+ # Formats the properties passed to Event's init.
111
+ def format_init_properties(properties)
112
+ result = properties.map do |property|
113
+ "\"#{property['name']}\": #{property['name'].camel_case}#{'.rawValue' unless property['values'].nil?}"
114
+ end
115
+
116
+ results = "[#{result.join(', ')}]"
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,38 @@
1
+ module Analytics
2
+ module Serializer
3
+ class Swift < Base
4
+ class Logger
5
+ def initialize(src)
6
+ @src = src
7
+ end
8
+
9
+ def save(path)
10
+ @file_name = 'AnalyticsLogger.swift'
11
+ output_path = File.join(path, @file_name)
12
+ File.write(output_path, render)
13
+ end
14
+
15
+ private
16
+
17
+ def render
18
+ ERB.new(template, nil, '-').result(binding)
19
+ end
20
+
21
+ def template
22
+ <<~TEMPLATE
23
+ <%= ERB.new(Analytics::Templates.tmpl_at('header.erb')).result(binding) %>
24
+
25
+ import Foundation
26
+
27
+ protocol AnalyticsLogger {
28
+ func set(enabled: Bool)
29
+ func log(event: Analytics.Event)
30
+ func track(screen: Analytics.Screen)
31
+ func set(userProperty: Analytics.UserProperty)
32
+ }
33
+ TEMPLATE
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,55 @@
1
+ module Analytics
2
+ module Serializer
3
+ class Swift < Base
4
+ class Screen
5
+ def initialize(src)
6
+ @src = src
7
+ end
8
+
9
+ def save(path)
10
+ @file_name = 'AnalyticsScreen.swift'
11
+ output_path = File.join(path, @file_name)
12
+ File.write(output_path, render)
13
+ end
14
+
15
+ private
16
+
17
+ def render
18
+ ERB.new(template, nil, '-').result(binding)
19
+ end
20
+
21
+ def template
22
+ <<~TEMPLATE
23
+ <%= ERB.new(Analytics::Templates.tmpl_at('header.erb')).result(binding) %>
24
+
25
+ import Foundation
26
+
27
+ extension Analytics {
28
+
29
+ struct Screen {
30
+
31
+ let name: String
32
+
33
+ private init(name: String) {
34
+ self.name = name
35
+ }
36
+ }
37
+ }
38
+
39
+ // MARK: - Screens
40
+
41
+ extension Analytics.Screen {
42
+ <% @src["screens"].each do |screen| -%>
43
+
44
+ /// <%= screen["description"] %>
45
+ static var <%= screen["name"].camel_case -%>: Analytics.Screen {
46
+ return .init(name: "<%= screen["name"] -%>")
47
+ }
48
+ <% end -%>
49
+ }
50
+ TEMPLATE
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,20 @@
1
+ module Analytics
2
+ module Serializer
3
+ class Swift < Base
4
+ # An abstract method used to save a file at provided path.
5
+ def save(path)
6
+ files = [
7
+ AnalyticsFile,
8
+ Event,
9
+ Logger,
10
+ Screen,
11
+ UserProperty
12
+ ]
13
+
14
+ files.each do |f|
15
+ f.new(@src).save(path)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,69 @@
1
+ module Analytics
2
+ module Serializer
3
+ class Swift < Base
4
+ class UserProperty
5
+ def initialize(src)
6
+ @src = src
7
+ end
8
+
9
+ def save(path)
10
+ @file_name = 'AnalyticsUserProperty.swift'
11
+ output_path = File.join(path, @file_name)
12
+ File.write(output_path, render)
13
+ end
14
+
15
+ private
16
+
17
+ def render
18
+ ERB.new(template, nil, '-').result(binding)
19
+ end
20
+
21
+ def template
22
+ <<~TEMPLATE
23
+ <%= ERB.new(Analytics::Templates.tmpl_at('header.erb')).result(binding) %>
24
+
25
+ import Foundation
26
+
27
+ extension Analytics {
28
+
29
+ struct UserProperty {
30
+
31
+ let name: String
32
+ let value: String?
33
+
34
+ private init(name: String, value: String?) {
35
+ self.name = name
36
+ self.value = value
37
+ }
38
+ }
39
+ }
40
+
41
+ // MARK: - User properties
42
+
43
+ extension Analytics.UserProperty {
44
+ <% @src["userProperties"].each do |user_property| -%>
45
+
46
+ /// <%= user_property["description"] %>
47
+ /// - Parameter value: The value of the user property, or `nil` if You want to remove the user property.
48
+ static func <%= user_property["name"].camel_case -%>(with value: <%= user_property["values"].nil? ? 'String?' : user_property["name"].pascal_case %>) -> Analytics.UserProperty {
49
+ return .init(name: "<%= user_property["name"] -%>", value: <%= user_property["values"].nil? ? 'value' : 'value.rawValue' %>)
50
+ }
51
+ <% end -%>
52
+ }
53
+
54
+ extension Analytics.UserProperty {
55
+ <% Interactor::UserProperty.all_enum_user_properties(@src["userProperties"]).each do |user_property| -%>
56
+
57
+ enum <%= user_property["name"].pascal_case %>: String {
58
+ <% user_property["values"].each do |value| -%>
59
+ case <%= value.camel_case %> = "<%= value -%>"
60
+ <% end -%>
61
+ }
62
+ <% end -%>
63
+ }
64
+ TEMPLATE
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,7 @@
1
+ //
2
+ // <%= @file_name %>
3
+ // Please, don't edit this file manually.
4
+ //
5
+ // Created by Analytics CLI on <%= Time.now.strftime("%d/%m/%Y") %>.
6
+ // Copyright (c) <%= Time.now.strftime("%Y") %> Infinum. All rights reserved.
7
+ //
@@ -0,0 +1,12 @@
1
+ module Analytics
2
+ module Templates
3
+ # Returns the template at provided path.
4
+ # Path is relative to the path of this file.
5
+ # E.g. to get file at templates/swift/test,
6
+ # call tmpl_at('swift/test').
7
+ def self.tmpl_at(path)
8
+ final_path = File.join(__dir__, path)
9
+ File.open(final_path, &:read)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,4 @@
1
+ module Analytics
2
+ # Current gem's version.
3
+ VERSION = '1.0.0'.freeze
4
+ end
metadata ADDED
@@ -0,0 +1,172 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ios_analytics_cli
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Mario Galijot
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-05-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.17'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.17'
27
+ - !ruby/object:Gem::Dependency
28
+ name: minitest
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '5.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '5.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.82.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.82.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: commander
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 4.5.2
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 4.5.2
83
+ - !ruby/object:Gem::Dependency
84
+ name: tty-prompt
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.21.0
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.21.0
97
+ description: |2
98
+ This gem is develop in order to reduce the time needed to even start with the implementation of Analytics in iOS apps,
99
+ by generating files, classes, methods & everything else that's required to call a specific event, change a user property,
100
+ or even track an open screen. By calling just 2 commands, analytics init & analytics generate,
101
+ all of these are generated for You from the appropriately configured JSON file.
102
+ email:
103
+ - mario.galijot@infinum.com
104
+ executables:
105
+ - analytics
106
+ extensions: []
107
+ extra_rdoc_files: []
108
+ files:
109
+ - ".gitignore"
110
+ - ".rubocop.yml"
111
+ - Gemfile
112
+ - Gemfile.lock
113
+ - LICENSE.txt
114
+ - README.md
115
+ - Rakefile
116
+ - bin/console
117
+ - bin/setup
118
+ - exe/analytics
119
+ - ios_analytics_cli.gemspec
120
+ - lib/ios_analytics_cli.rb
121
+ - lib/ios_analytics_cli/commands/command.rb
122
+ - lib/ios_analytics_cli/commands/generate.rb
123
+ - lib/ios_analytics_cli/commands/init.rb
124
+ - lib/ios_analytics_cli/error_handler.rb
125
+ - lib/ios_analytics_cli/helpers/terminal.rb
126
+ - lib/ios_analytics_cli/info.rb
127
+ - lib/ios_analytics_cli/interactors/event.rb
128
+ - lib/ios_analytics_cli/interactors/interactor.rb
129
+ - lib/ios_analytics_cli/interactors/user_property.rb
130
+ - lib/ios_analytics_cli/io/config.rb
131
+ - lib/ios_analytics_cli/io/io.rb
132
+ - lib/ios_analytics_cli/serializers/base.rb
133
+ - lib/ios_analytics_cli/serializers/objc/analytics.rb
134
+ - lib/ios_analytics_cli/serializers/objc/enums.rb
135
+ - lib/ios_analytics_cli/serializers/objc/event.rb
136
+ - lib/ios_analytics_cli/serializers/objc/logger.rb
137
+ - lib/ios_analytics_cli/serializers/objc/objc.rb
138
+ - lib/ios_analytics_cli/serializers/objc/screen.rb
139
+ - lib/ios_analytics_cli/serializers/objc/user_property.rb
140
+ - lib/ios_analytics_cli/serializers/swift/analytics.rb
141
+ - lib/ios_analytics_cli/serializers/swift/event.rb
142
+ - lib/ios_analytics_cli/serializers/swift/logger.rb
143
+ - lib/ios_analytics_cli/serializers/swift/screen.rb
144
+ - lib/ios_analytics_cli/serializers/swift/swift.rb
145
+ - lib/ios_analytics_cli/serializers/swift/user_property.rb
146
+ - lib/ios_analytics_cli/templates/header.erb
147
+ - lib/ios_analytics_cli/templates/templates.rb
148
+ - lib/ios_analytics_cli/version.rb
149
+ homepage: https://github.com/infinum/ios-analytics-cli/
150
+ licenses:
151
+ - MIT
152
+ metadata: {}
153
+ post_install_message:
154
+ rdoc_options: []
155
+ require_paths:
156
+ - lib
157
+ required_ruby_version: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ required_rubygems_version: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ requirements: []
168
+ rubygems_version: 3.0.3
169
+ signing_key:
170
+ specification_version: 4
171
+ summary: CLI tool that generates Analytics files, for iOS project, from a JSON file.
172
+ test_files: []