iosgen 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 (50) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +37 -0
  4. data/.hound.yml +6 -0
  5. data/.rubocop.yml +7 -0
  6. data/Gemfile +19 -0
  7. data/Gemfile.lock +110 -0
  8. data/Guardfile +16 -0
  9. data/LICENSE +22 -0
  10. data/README.md +158 -0
  11. data/Rakefile +28 -0
  12. data/bin/iosgen +6 -0
  13. data/iosgen.gemspec +29 -0
  14. data/lib/ios_gen/base/action.rb +15 -0
  15. data/lib/ios_gen/base/base_factory.rb +73 -0
  16. data/lib/ios_gen/base/interactor.rb +15 -0
  17. data/lib/ios_gen/base/property.rb +13 -0
  18. data/lib/ios_gen/base/view_controller.rb +15 -0
  19. data/lib/ios_gen/base/view_model.rb +16 -0
  20. data/lib/ios_gen/generator/base_generator.rb +61 -0
  21. data/lib/ios_gen/generator/objc/action_formatter.rb +35 -0
  22. data/lib/ios_gen/generator/objc/interactor_formatter.rb +68 -0
  23. data/lib/ios_gen/generator/objc/objc_formatter.rb +30 -0
  24. data/lib/ios_gen/generator/objc/view_controller_formatter.rb +37 -0
  25. data/lib/ios_gen/generator/objc/view_model_formatter.rb +88 -0
  26. data/lib/ios_gen/ios_gen_thor.rb +17 -0
  27. data/lib/iosgen.rb +5 -0
  28. data/spec/ios_gen/base/action_spec.rb +50 -0
  29. data/spec/ios_gen/base/base_factory_spec.rb +238 -0
  30. data/spec/ios_gen/base/interactor_spec.rb +60 -0
  31. data/spec/ios_gen/base/property_spec.rb +26 -0
  32. data/spec/ios_gen/base/view_controller_spec.rb +18 -0
  33. data/spec/ios_gen/base/view_model_spec.rb +70 -0
  34. data/spec/ios_gen/generator/base_generator_spec.rb +84 -0
  35. data/spec/ios_gen/generator/objc/action_formatter_spec.rb +88 -0
  36. data/spec/ios_gen/generator/objc/interactor_formatter_spec.rb +79 -0
  37. data/spec/ios_gen/generator/objc/objc_formatter_spec.rb +52 -0
  38. data/spec/ios_gen/generator/objc/view_controller_formatter_spec.rb +52 -0
  39. data/spec/ios_gen/generator/objc/view_model_formatter_spec.rb +125 -0
  40. data/spec/ios_gen/generator/spec.json +58 -0
  41. data/spec/spec_helper.rb +8 -0
  42. data/templates/objc/Interactor.h.erb +11 -0
  43. data/templates/objc/Interactor.m.erb +13 -0
  44. data/templates/objc/InteractorProtocol.h.erb +9 -0
  45. data/templates/objc/UIViewController.h.erb +8 -0
  46. data/templates/objc/UIViewController.m.erb +31 -0
  47. data/templates/objc/ViewModel.h.erb +9 -0
  48. data/templates/objc/ViewModel.m.erb +13 -0
  49. data/templates/objc/ViewModelProtocol.h.erb +16 -0
  50. metadata +178 -0
@@ -0,0 +1,15 @@
1
+ module IOSGen
2
+ module Base
3
+ # Action
4
+ class Action
5
+ attr_accessor :description, :name, :return_type, :arguments
6
+
7
+ def initialize(params = {})
8
+ @description = params[:description]
9
+ @name = params[:name]
10
+ @return_type = params[:return_type]
11
+ @arguments = params[:arguments]
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,73 @@
1
+ module IOSGen
2
+ module Base
3
+ # Create base object from json
4
+ class BaseFactory
5
+ NAME_KEY = 'name'
6
+ TYPE_KEY = 'type'
7
+ DESCRIPTION_KEY = 'description'
8
+ RETURN_KEY = 'return_type'
9
+ ARGUMENTS_KEY = 'arguments'
10
+ PROPERTIES_KEY = 'properties'
11
+ ACTIONS_KEY = 'actions'
12
+ INTERACTORS_KEY = 'interactors'
13
+
14
+ def parse_property(hash)
15
+ Property.new(type: hash[TYPE_KEY], name: hash[NAME_KEY])
16
+ end
17
+
18
+ def parse_action(hash)
19
+ Action.new(description: hash[DESCRIPTION_KEY],
20
+ name: hash[NAME_KEY],
21
+ return_type: hash[RETURN_KEY],
22
+ arguments: parse_properties(hash[ARGUMENTS_KEY]))
23
+ end
24
+
25
+ def parse_interactor(hash)
26
+ Interactor.new(description: hash[DESCRIPTION_KEY],
27
+ name: hash[NAME_KEY],
28
+ properties: parse_properties(hash[PROPERTIES_KEY]),
29
+ actions: parse_actions(hash[ACTIONS_KEY]))
30
+ end
31
+
32
+ def parse_view_model(hash)
33
+ ViewModel.new(description: hash[DESCRIPTION_KEY],
34
+ name: hash[NAME_KEY],
35
+ properties: parse_properties(hash[PROPERTIES_KEY]),
36
+ actions: parse_actions(hash[ACTIONS_KEY]),
37
+ interactors: parse_interactors(hash[INTERACTORS_KEY]))
38
+ end
39
+
40
+ def parse_properties(arguments)
41
+ return if arguments.nil?
42
+ arguments_properties = []
43
+ arguments.each do |property|
44
+ arguments_properties.push(parse_property(property))
45
+ end
46
+ arguments_properties
47
+ end
48
+
49
+ def parse_actions(actions)
50
+ return if actions.nil?
51
+ actions_array = []
52
+ actions.each do |action|
53
+ actions_array.push(parse_action(action))
54
+ end
55
+ actions_array
56
+ end
57
+
58
+ def parse_interactors(interactors)
59
+ return if interactors.nil?
60
+ interactors_array = []
61
+ interactors.each do |interactor|
62
+ interactors_array.push(parse_interactor(interactor))
63
+ end
64
+ interactors_array
65
+ end
66
+
67
+ def parse_view_controller(hash)
68
+ ViewController.new(name: hash[NAME_KEY],
69
+ description: hash[DESCRIPTION_KEY])
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,15 @@
1
+ module IOSGen
2
+ module Base
3
+ # Interactor class
4
+ class Interactor
5
+ attr_accessor :description, :name, :properties, :actions
6
+
7
+ def initialize(params = {})
8
+ @description = params[:description]
9
+ @name = params[:name]
10
+ @properties = params[:properties]
11
+ @actions = params[:actions]
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ module IOSGen
2
+ module Base
3
+ # Object Property
4
+ class Property
5
+ attr_accessor :type, :name
6
+
7
+ def initialize(params = {})
8
+ @type = params[:type]
9
+ @name = params[:name]
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ module IOSGen
2
+ module Base
3
+ # ViewController Model
4
+ class ViewController
5
+ attr_reader :name, :description
6
+ attr_accessor :view_model
7
+
8
+ def initialize(params = {})
9
+ @name = params[:name]
10
+ @description = params[:description]
11
+ @view_model = params[:view_model]
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,16 @@
1
+ module IOSGen
2
+ module Base
3
+ # ViewModel class
4
+ class ViewModel
5
+ attr_accessor :description, :name, :properties, :actions, :interactors
6
+
7
+ def initialize(params = {})
8
+ @description = params[:description]
9
+ @name = params[:name]
10
+ @properties = params[:properties]
11
+ @actions = params[:actions]
12
+ @interactors = params[:interactors]
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,61 @@
1
+ require 'erb'
2
+ require 'colorize'
3
+
4
+ module IOSGen
5
+ module Generator
6
+ # Base Generator
7
+ class BaseGenerator
8
+ VIEWCONTROLLER_KEY = 'view_controller'
9
+ VIEWMODEL_KEY = 'view_model'
10
+ INTERACTORS_KEY = 'interactors'
11
+
12
+ attr_reader :type, :file_spec, :destination
13
+ attr_reader :view_model, :view_controller
14
+ attr_reader :factory, :formatter
15
+
16
+ def initialize(hash = {})
17
+ @type = hash[:type]
18
+ @file_spec = hash[:file_spec]
19
+ @destination = hash[:destination]
20
+ @factory = IOSGen::Base::BaseFactory.new
21
+ interactor_formatter = Objc::InteractorFormatter.new
22
+ view_model_formatter = Objc::ViewModelFormatter.new(interactor_formatter)
23
+ view_controller_formatter = Objc::ViewControllerFormatter.new(view_model_formatter)
24
+ @formatter = Objc::Formatter.new(view_controller_formatter, view_model_formatter, interactor_formatter)
25
+ parse
26
+ end
27
+
28
+ def generate
29
+ generate_view_model
30
+ end
31
+
32
+ private
33
+
34
+ def parse
35
+ file = File.read(@file_spec)
36
+ hash = JSON.parse(file)
37
+ @view_model = @factory.parse_view_model(hash[VIEWMODEL_KEY])
38
+ @view_controller = @factory.parse_view_controller(hash[VIEWCONTROLLER_KEY])
39
+ @view_controller.view_model = @view_model unless @view_controller.nil?
40
+ @formatter.view_model = @view_model unless @view_model.nil?
41
+ @formatter.view_controller = @view_controller unless @view_controller.nil?
42
+ end
43
+
44
+ def generate_view_model
45
+ @formatter.generate do |file_name, template|
46
+ generate_template(file_name, template, @destination)
47
+ puts "[+] Created #{file_name}".green
48
+ end
49
+ end
50
+
51
+ def generate_template(name, template, destination = '.')
52
+ path_template = File.expand_path("../../../#{template}", File.dirname(__FILE__))
53
+ renderer = ERB.new(File.read(path_template))
54
+ destination_path = "#{destination}#{name}"
55
+ File.open(destination_path, 'w') do |f|
56
+ f.write renderer.result(binding)
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,35 @@
1
+ module IOSGen
2
+ module Generator
3
+ module Objc
4
+ # Objective-C Action Formatter
5
+ class ActionFormatter
6
+ def generate_interface(action)
7
+ result = ''
8
+ result += "// #{action.description}\n" unless action.description.nil?
9
+ result += "- (#{action.return_type})"
10
+ result += parse_action_arguments(action) + ';'
11
+ result
12
+ end
13
+
14
+ def generate_implementation(action)
15
+ result = "- (#{action.return_type})"
16
+ result += parse_action_arguments(action) + "\n{\n}"
17
+ result
18
+ end
19
+
20
+ private
21
+
22
+ def parse_action_arguments(action)
23
+ index = 0
24
+ final_name = "#{action.name}".gsub(':') do
25
+ argument = action.arguments[index]
26
+ index += 1
27
+ ":(#{argument.type})#{argument.name} "
28
+ end
29
+ final_name = final_name.chop if index > 0
30
+ final_name
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,68 @@
1
+ module IOSGen
2
+ module Generator
3
+ module Objc
4
+ # Objective-C Interactor Formatter
5
+ class InteractorFormatter
6
+ # File Names Interactors
7
+ attr_reader :header_file_name, :_impl_file_name
8
+ attr_reader :protocol_file_name
9
+ # Interactor Protocol
10
+ attr_reader :protocol_name
11
+ # Interactor Porperties
12
+ attr_reader :properties_header
13
+ # Interactor Actions
14
+ attr_reader :actions_header, :actions_impl
15
+ # Property
16
+ attr_accessor :interactor
17
+
18
+ def header_file_name
19
+ "#{@interactor.name}.h"
20
+ end
21
+
22
+ def impl_file_name
23
+ "#{@interactor.name}.m"
24
+ end
25
+
26
+ def protocol_file_name
27
+ "#{@interactor.name}Protocol.h"
28
+ end
29
+
30
+ def protocol_name
31
+ "#{@interactor.name}Protocol"
32
+ end
33
+
34
+ def properties_header
35
+ properties = ''
36
+ @interactor.properties.each do |property|
37
+ properties += "@property (nonatomic, strong) #{property.type}#{property.name};\n"
38
+ end unless @interactor.properties.nil?
39
+ properties.chop
40
+ end
41
+
42
+ def actions_header
43
+ actions = ''
44
+ action_formatter = ActionFormatter.new
45
+ @interactor.actions.each do |action|
46
+ actions += "#{action_formatter.generate_interface(action)}\n"
47
+ end
48
+ actions.chop
49
+ end
50
+
51
+ def actions_impl
52
+ actions = ''
53
+ action_formatter = ActionFormatter.new
54
+ @interactor.actions.each do |action|
55
+ actions += "#{action_formatter.generate_implementation(action)}\n"
56
+ end
57
+ actions.chop
58
+ end
59
+
60
+ def generate(&block)
61
+ block.call(protocol_file_name, 'templates/objc/InteractorProtocol.h.erb')
62
+ block.call(header_file_name, 'templates/objc/Interactor.h.erb')
63
+ block.call(impl_file_name, 'templates/objc/Interactor.m.erb')
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,30 @@
1
+ module IOSGen
2
+ module Generator
3
+ module Objc
4
+ # Objc Formatter
5
+ class Formatter
6
+ # ViewModel and Interactors
7
+ attr_accessor :view_controller, :view_model, :interactors
8
+ # Formatters
9
+ attr_reader :view_controller_formatter, :view_model_formatter
10
+ attr_reader :interactor_formatter
11
+
12
+ def initialize(view_controller_formatter = ViewControllerFormatter.new,
13
+ view_model_formatter = ViewModelFormatter.new,
14
+ interactor_formatter = InteractorFormatter.new)
15
+ @view_controller_formatter = view_controller_formatter
16
+ @view_model_formatter = view_model_formatter
17
+ @interfactor_formatter = interactor_formatter
18
+ end
19
+
20
+ def generate(&block)
21
+ @view_controller_formatter.view_controller = @view_controller
22
+ @view_controller_formatter.view_model = @view_model
23
+ @view_model_formatter.view_model = @view_model
24
+ @view_controller_formatter.generate(&block)
25
+ @view_model_formatter.generate(&block)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,37 @@
1
+ module IOSGen
2
+ module Generator
3
+ module Objc
4
+ # Objective-C Formatter for ViewController
5
+ class ViewControllerFormatter
6
+ # ViewController and ViewModel
7
+ attr_accessor :view_controller, :view_model
8
+ # File Names
9
+ attr_reader :header_file_name, :impl_file_name
10
+ # ViewModel Formatter
11
+ attr_reader :view_model_formatter
12
+
13
+ def initialize(view_model_formatter = ViewModelFormatter.new)
14
+ @view_model_formatter = view_model_formatter
15
+ end
16
+
17
+ def view_model=(view_model)
18
+ @view_model = view_model
19
+ @view_model_formatter.view_model = @view_model
20
+ end
21
+
22
+ def header_file_name
23
+ "#{view_controller.name}.h"
24
+ end
25
+
26
+ def impl_file_name
27
+ "#{view_controller.name}.m"
28
+ end
29
+
30
+ def generate(&block)
31
+ block.call(header_file_name, 'templates/objc/UIViewController.h.erb')
32
+ block.call(impl_file_name, 'templates/objc/UIViewController.m.erb')
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,88 @@
1
+ module IOSGen
2
+ module Generator
3
+ module Objc
4
+ # Objetive-C ViewModel Formatter
5
+ class ViewModelFormatter
6
+ # ViewModel and Interactors
7
+ attr_accessor :view_model
8
+ # File Names ViewModel
9
+ attr_reader :header_file_name, :impl_file_name
10
+ attr_reader :protocol_file_name
11
+ # ViewModel Protocol
12
+ attr_reader :protocol_name, :protocol_delegate
13
+ # ViewModel Porperties
14
+ attr_reader :properties_header
15
+ # ViewModel Actions
16
+ attr_reader :actions_header, :actions_impl
17
+ # Interactor Formatter
18
+ attr_reader :interactor_formatter
19
+
20
+ def initialize(interactor_formatter = InteractorFormatter.new)
21
+ @interactor_formatter = interactor_formatter
22
+ end
23
+
24
+ def header_file_name
25
+ "#{@view_model.name}.h"
26
+ end
27
+
28
+ def impl_file_name
29
+ "#{@view_model.name}.m"
30
+ end
31
+
32
+ def protocol_file_name
33
+ "#{@view_model.name}Protocol.h"
34
+ end
35
+
36
+ def protocol_name
37
+ "#{@view_model.name}Protocol"
38
+ end
39
+
40
+ def protocol_delegate
41
+ "#{@view_model.name}ProtocolDelegate"
42
+ end
43
+
44
+ def properties_header
45
+ properties = ''
46
+ @view_model.properties.each do |property|
47
+ properties += "@property (nonatomic, strong) #{property.type}#{property.name};\n"
48
+ end
49
+ properties.chop
50
+ end
51
+
52
+ def actions_header
53
+ actions = ''
54
+ action_formatter = ActionFormatter.new
55
+ @view_model.actions.each do |action|
56
+ actions += "#{action_formatter.generate_interface(action)}\n"
57
+ end
58
+ actions.chop
59
+ end
60
+
61
+ def actions_impl
62
+ actions = ''
63
+ action_formatter = ActionFormatter.new
64
+ @view_model.actions.each do |action|
65
+ actions += "#{action_formatter.generate_implementation(action)}\n"
66
+ end
67
+ actions.chop
68
+ end
69
+
70
+ def generate(&block)
71
+ block.call(protocol_file_name, 'templates/objc/ViewModelProtocol.h.erb')
72
+ block.call(header_file_name, 'templates/objc/ViewModel.h.erb')
73
+ block.call(impl_file_name, 'templates/objc/ViewModel.m.erb')
74
+ generate_interactor(&block)
75
+ end
76
+
77
+ private
78
+
79
+ def generate_interactor(&block)
80
+ @view_model.interactors.each do |interactor|
81
+ @interactor_formatter.interactor = interactor
82
+ @interactor_formatter.generate(&block)
83
+ end unless @view_model.interactors.nil?
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end