molt 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +56 -0
  3. data/.gitignore +13 -0
  4. data/.rspec +3 -0
  5. data/.travis.yml +6 -0
  6. data/CODE_OF_CONDUCT.md +74 -0
  7. data/Gemfile +5 -0
  8. data/Gemfile.lock +55 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +210 -0
  11. data/Rakefile +6 -0
  12. data/bin/console +7 -0
  13. data/bin/molt +6 -0
  14. data/bin/setup +7 -0
  15. data/bundled/models/Entity+CoreData.swift.liquid +15 -0
  16. data/bundled/models/Entity.swift.liquid +7 -0
  17. data/bundled/models/Model.swift.liquid +20 -0
  18. data/bundled/partials/_header.liquid +5 -0
  19. data/bundled/swift_helpers/ErrorTypes/APIError.swift +28 -0
  20. data/bundled/swift_helpers/ErrorTypes/ErrorTypes.swift +12 -0
  21. data/bundled/swift_helpers/ErrorTypes/PersistenceError.swift +28 -0
  22. data/bundled/swift_helpers/ISODateTransform.swift +26 -0
  23. data/bundled/swift_helpers/Identifiable.swift +29 -0
  24. data/bundled/swift_helpers/Loadable.swift +37 -0
  25. data/bundled/swift_helpers/Networking/APIRouter.swift +54 -0
  26. data/bundled/swift_helpers/StoryboardExtensions.swift +49 -0
  27. data/bundled/template_sets/viper_detail/Presenter.swift.liquid +17 -0
  28. data/bundled/template_sets/viper_detail/Protocols.swift.liquid +23 -0
  29. data/bundled/template_sets/viper_detail/View.swift.liquid +25 -0
  30. data/bundled/template_sets/viper_detail/WireFrame.swift.liquid +21 -0
  31. data/bundled/template_sets/viper_table/DataManagers/LocalDataManager.swift.liquid +45 -0
  32. data/bundled/template_sets/viper_table/DataManagers/RemoteDataManager.swift.liquid +26 -0
  33. data/bundled/template_sets/viper_table/Interactor.swift.liquid +48 -0
  34. data/bundled/template_sets/viper_table/Presenter.swift.liquid +49 -0
  35. data/bundled/template_sets/viper_table/Protocols.swift.liquid +58 -0
  36. data/bundled/template_sets/viper_table/View.swift.liquid +60 -0
  37. data/bundled/template_sets/viper_table/WireFrame.swift.liquid +43 -0
  38. data/lib/generamba/string-colorize.rb +31 -0
  39. data/lib/molt/cli/create_module.rb +76 -0
  40. data/lib/molt/cli/main.rb +74 -0
  41. data/lib/molt/cli/setup.rb +23 -0
  42. data/lib/molt/cli/template_sets.rb +18 -0
  43. data/lib/molt/configuration.rb +43 -0
  44. data/lib/molt/template.rb +9 -0
  45. data/lib/molt/version.rb +3 -0
  46. data/lib/molt.rb +22 -0
  47. data/molt.gemspec +32 -0
  48. data/sample_configs/global_config.yml.erb +7 -0
  49. metadata +218 -0
@@ -0,0 +1,76 @@
1
+ module Molt::CLI
2
+ class Generator
3
+
4
+ def self.create_module(module_name, template_set, options)
5
+ puts "OPTIONS #{options.inspect}".blue
6
+ config = Molt::Configuration.load_or_initialize
7
+ config = Molt::Configuration.apply_cli_overrides config, options, module_name, template_set
8
+ rows = table_rows_for config
9
+
10
+ sets = ""
11
+ models = ""
12
+
13
+ [Molt::MOLT_GLOBAL, Molt::MOLT_PROJECT ].each do |path|
14
+ if Dir.exist? "#{path}/template_sets/#{template_set}"
15
+ sets = "#{path}/template_sets"
16
+ models = "#{path}/models"
17
+ Liquid::Template.file_system = Liquid::LocalFileSystem.new("#{path}/partials/", '_%s.liquid')
18
+ end
19
+ end
20
+
21
+ Dir["#{sets}/#{template_set}/**/*swift.liquid"].each do |template_file|
22
+ template_base_folder = File.dirname(template_file).gsub(/#{sets}\/#{template_set}/, "")
23
+ destination_folder = "#{options.output_folder}/#{module_name}#{template_base_folder}"
24
+
25
+ base_file = File.basename(template_file.gsub(/.liquid$/, ""))
26
+ output_file = "#{destination_folder}/#{module_name}#{base_file}"
27
+ rows << [template_file.gsub(/#{sets}\//, ""), output_file.blue]
28
+
29
+ if options.do_it
30
+ FileUtils.mkdir_p destination_folder
31
+ Molt::Template.liquify(template: template_file, output_file: output_file, config: config)
32
+ end
33
+ end
34
+
35
+ if options.create_model && options.model
36
+ Dir["#{models}/**/*swift.liquid"].each do |template_file|
37
+ destination_folder = "#{options.output_folder}/#{module_name}/Models"
38
+
39
+ base_file = File.basename(template_file.gsub(/.liquid$/, ""))
40
+ base_file = base_file.gsub(/Entity/, options.model)
41
+ base_file = base_file.gsub(/Model/, "#{options.model}Model")
42
+ output_file = "#{destination_folder}/#{base_file}"
43
+ rows << [template_file.gsub(/#{models}\//, ""), output_file.blue]
44
+
45
+ if options.do_it
46
+ FileUtils.mkdir_p destination_folder
47
+ Molt::Template.liquify(template: template_file, output_file: output_file, config: config)
48
+ end
49
+ end
50
+ end
51
+ output_table_with rows
52
+ if !options.do_it
53
+ puts "\nThat was just a dry-run. If this looks good to you, don't forget to add --do-it".green
54
+ end
55
+ end
56
+
57
+ private
58
+ def self.table_rows_for config
59
+ rows = []
60
+ rows << ["Developer", config["developer"]["name"].blue]
61
+ rows << ["Email", config["developer"]["email"].blue]
62
+ rows << ["Company", config["developer"]["company"].blue]
63
+ rows << ["Project", config["project"]["name"].blue]
64
+
65
+ rows << [" ", " "]
66
+ rows << ["Template Set", config["template_set"].yellow]
67
+ rows << [" ", " "]
68
+ rows << ["Source".green, "Destination".green]
69
+ rows
70
+ end
71
+
72
+ def self.output_table_with rows
73
+ puts Terminal::Table.new rows: rows
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,74 @@
1
+ require "commander"
2
+ require "fileutils"
3
+ require "liquid"
4
+ require "terminal-table"
5
+ require "yaml"
6
+
7
+ require "molt/cli/setup"
8
+ require "molt/cli/template_sets"
9
+ require "molt/cli/create_module"
10
+
11
+ module Molt::CLI
12
+ class Main
13
+ def self.start
14
+ Commander.configure do
15
+ program :name, "Molt".yellow
16
+ program :version, Molt::VERSION.green
17
+ program :description, "Molt is a simple VIPER module generator for Swift apps.".blue
18
+ program :help, "Author", "@MarcoCabazal"
19
+ program :help, "Source", "https://github.com/MarcoCabazal/Molt".blue
20
+ program :help, "Version", Molt::VERSION
21
+
22
+ default_command :help
23
+ global_option("-vv", "--verbose", "Add verbosity where applicable") { $verbose = false }
24
+
25
+ command :setup do |c|
26
+ c.syntax = 'molt setup'
27
+ c.description = 'Setup global config and templates in ~/.molt (HOME)'
28
+ c.action do |args, options|
29
+ Molt::CLI::Setup.start(["perform", Molt::MOLT_GLOBAL, Molt::CONFIG_GLOBAL])
30
+ end
31
+ end
32
+
33
+ command :'setup:project' do |c|
34
+ c.syntax = "molt setup:project"
35
+ c.summary = "Setup project-level config and templates in ./.molt (current directory)"
36
+ c.description = "#{c.summary}\n\nIf you're working with other developers on this project, it's best to agree on the templates and have this commited to git. Now everyone gets to be lazy. 🍺"
37
+ c.action do |args, options|
38
+ Molt::CLI::Setup.start(["perform", Molt::MOLT_PROJECT, Molt::CONFIG_PROJECT])
39
+ end
40
+ end
41
+
42
+ command :template_sets do |c|
43
+ c.syntax = 'molt template_sets'
44
+ c.description = "List templates sets (add --verbose to see list of files)"
45
+ c.action do |args, options|
46
+ Molt::CLI::Template.sets(options.verbose)
47
+ end
48
+ end
49
+ alias_command :'t', :template_sets
50
+
51
+ command :create_module do |c|
52
+ c.syntax = 'molt create_module MODULE_NAME TEMPLATE_SET'
53
+ c.summary = "Generate component files for a VIPER module"
54
+ c.description = Molt::LONG_DESC
55
+ c.option '--name NAME', String, "Author name"
56
+ c.option '--email EMAIL', String, "Author email"
57
+ c.option '--company COMPANY', String, "Author company"
58
+ c.option '--project PROJECT', String, "Project name"
59
+ c.option '--output-folder DIRECTORY', String, "Create module folder in this directory. Defaults to \"./\""
60
+ c.option '--model MODEL', String, "Model name. If unspecified, Xcode placeholders will be used instead"
61
+ c.option '--create-model', false, "If specified, it creates corresponding Mappable struct (ObjectMapper) and Core Data entity; requires --model to be set"
62
+ c.option '--do-it', false, "Release the Kraken and write the files"
63
+ c.action do |args, options|
64
+ options.default :output_folder => "."
65
+ puts "ARGS #{args}\nOPTS #{options.inspect}"
66
+ Molt::CLI::Generator.create_module(args[0], args[1], options)
67
+ end
68
+ end
69
+ alias_command :'c', :create_module
70
+
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,23 @@
1
+ require "thor"
2
+
3
+ module Molt::CLI
4
+ class Setup < Thor
5
+ include Thor::Actions
6
+
7
+ def self.source_root
8
+ File.dirname(".")
9
+ end
10
+
11
+ desc "perform", "perform"
12
+ def perform(molt_path, config_path)
13
+ config = molt_path == Molt::MOLT_GLOBAL ? Molt::Configuration.defaults_from_git_config : Molt::Configuration.load_or_initialize
14
+
15
+ if !Dir.exist? molt_path
16
+ directory "bundled", molt_path
17
+ template "sample_configs/global_config.yml.erb", config_path, config
18
+ else
19
+ puts "Doing nothing. #{molt_path} is already existing.".yellow
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,18 @@
1
+ module Molt::CLI
2
+ class Template
3
+
4
+ def self.sets verbose = false
5
+ [ Molt::MOLT_PROJECT, Molt::MOLT_GLOBAL].each do |path|
6
+ puts "#{path.yellow}:"
7
+ if verbose
8
+ Dir["#{path}/**/*swift.liquid"].each { |template_file| puts template_file.blue }
9
+ else
10
+ Dir.glob("#{path}/template_sets/*").each { |entry| puts entry.blue if File.directory? entry }
11
+ end
12
+ puts
13
+ end
14
+
15
+ puts "Add --verbose to list all files in each template set".green if !verbose
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,43 @@
1
+ module Molt
2
+ class Configuration
3
+ def self.load_or_initialize
4
+ config_path = nil
5
+ [ Molt::CONFIG_PROJECT, Molt::CONFIG_GLOBAL ].each do |path|
6
+ if File.exist? path
7
+ config_path = path
8
+ break
9
+ end
10
+ end
11
+
12
+ return YAML.load_file(config_path) if config_path
13
+ puts 'Please run "molt setup" first'.red
14
+ exit
15
+ end
16
+
17
+ def self.defaults_from_git_config
18
+ user = { }
19
+ name = `git config --get user.name`.chomp
20
+ email = `git config --get user.email`.chomp
21
+ user["name"] = name.length > 0 ? name : "REPLACE_ME_IN_CONFIG"
22
+ user["email"] = email.length > 0 ? email : "REPLACE_ME_IN_CONFIG"
23
+ return { "developer" => user }
24
+ end
25
+
26
+ def self.apply_cli_overrides config, options, module_name, template_set
27
+ config["developer"]["company"] = options.company if options.company
28
+ config["developer"]["name"] = options.name if options.name
29
+ config["developer"]["email"] = options.email if options.email
30
+ config["developer"]["name"] = options.name if options.name
31
+ config["project"]["name"] = options.project if options.project
32
+ config["model"] = "#{options.model}Model" || "<# Model #>"
33
+ config["entity"] = options.model || "<# Entity #>"
34
+
35
+ # meta
36
+ config["module_name"] = module_name
37
+ config["template_set"] = template_set
38
+ config["year"] = Time.now.strftime("%Y")
39
+ config["date"] = Time.now.strftime("%d/%m/%Y")
40
+ config
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,9 @@
1
+ module Molt
2
+ class Template
3
+ def self.liquify(template: String, output_file: String, config: {})
4
+ unparsed_template = IO.read(template)
5
+ liquified = Liquid::Template.parse(unparsed_template).render(config)
6
+ File.write(output_file, liquified)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ module Molt
2
+ VERSION = "0.1.2"
3
+ end
data/lib/molt.rb ADDED
@@ -0,0 +1,22 @@
1
+ require "molt/version"
2
+ require "molt/configuration"
3
+ require "molt/template"
4
+ require "molt/cli/main"
5
+ require "generamba/string-colorize"
6
+
7
+ module Molt
8
+ MOLT_GLOBAL = "#{Dir.home}/.molt"
9
+ MOLT_PROJECT = "./.molt"
10
+ CONFIG_GLOBAL = "#{MOLT_GLOBAL}/config.yml"
11
+ CONFIG_PROJECT = "#{MOLT_PROJECT}/config.yml"
12
+ LONG_DESC = <<-TAG
13
+ This generates a scaffold for a new VIPER module all contained in a folder. You will then have onto drag this folder onto Xcode.
14
+
15
+ This command runs in dry-run mode by default (without using -f). That means this will only print the project/module configuration, list of templates, and eventual output files.
16
+
17
+ When you're happy with what you see, just add --do-it or -f to exit dry-run mode.
18
+
19
+ * Note that the default template set "viper_table" uses several Swift helper extensions all of which could be found in either ~/.molt or your project's ./.molt folder. These were all copied when you ran "molt setup" or "molt setup_project". Feel free to copy them or modify the template files to suit your preference.
20
+ TAG
21
+ end
22
+
data/molt.gemspec ADDED
@@ -0,0 +1,32 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "molt/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "molt"
8
+ spec.version = Molt::VERSION
9
+ spec.authors = ["Marco Cabazal"]
10
+ spec.email = ["marco.cabazal@chillmill.mobi"]
11
+
12
+ spec.summary = "VIPER module generator for Swift projects."
13
+ spec.homepage = "https://github.com/MarcoCabazal/Molt"
14
+ spec.license = "MIT"
15
+
16
+ spec.required_ruby_version = ">= 2.2"
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|sample_output)/}) }
18
+ spec.bindir = "bin"
19
+ spec.executables = ["molt"]
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_runtime_dependency "commander"
23
+ spec.add_runtime_dependency "liquid", "~> 4.0.0"
24
+ spec.add_runtime_dependency 'terminal-table'
25
+ spec.add_runtime_dependency "thor", "~> 0.20"
26
+
27
+ spec.add_development_dependency "awesome_print"
28
+ spec.add_development_dependency "bundler", "~> 1.16"
29
+ spec.add_development_dependency "pry"
30
+ spec.add_development_dependency "rake"
31
+ spec.add_development_dependency "rspec", "~> 3.4"
32
+ end
@@ -0,0 +1,7 @@
1
+ developer:
2
+ name: <%= config["developer"]["name"] %>
3
+ email: <%= config["developer"]["email"] %>
4
+ company: REPLACE_ME_IN_CONFIG
5
+
6
+ project:
7
+ name: REPLACE_ME_IN_CONFIG
metadata ADDED
@@ -0,0 +1,218 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: molt
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - Marco Cabazal
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-02-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: commander
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: liquid
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 4.0.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 4.0.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: terminal-table
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: thor
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.20'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.20'
69
+ - !ruby/object:Gem::Dependency
70
+ name: awesome_print
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: bundler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.16'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.16'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rake
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rspec
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '3.4'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '3.4'
139
+ description:
140
+ email:
141
+ - marco.cabazal@chillmill.mobi
142
+ executables:
143
+ - molt
144
+ extensions: []
145
+ extra_rdoc_files: []
146
+ files:
147
+ - ".circleci/config.yml"
148
+ - ".gitignore"
149
+ - ".rspec"
150
+ - ".travis.yml"
151
+ - CODE_OF_CONDUCT.md
152
+ - Gemfile
153
+ - Gemfile.lock
154
+ - LICENSE.txt
155
+ - README.md
156
+ - Rakefile
157
+ - bin/console
158
+ - bin/molt
159
+ - bin/setup
160
+ - bundled/models/Entity+CoreData.swift.liquid
161
+ - bundled/models/Entity.swift.liquid
162
+ - bundled/models/Model.swift.liquid
163
+ - bundled/partials/_header.liquid
164
+ - bundled/swift_helpers/ErrorTypes/APIError.swift
165
+ - bundled/swift_helpers/ErrorTypes/ErrorTypes.swift
166
+ - bundled/swift_helpers/ErrorTypes/PersistenceError.swift
167
+ - bundled/swift_helpers/ISODateTransform.swift
168
+ - bundled/swift_helpers/Identifiable.swift
169
+ - bundled/swift_helpers/Loadable.swift
170
+ - bundled/swift_helpers/Networking/APIRouter.swift
171
+ - bundled/swift_helpers/StoryboardExtensions.swift
172
+ - bundled/template_sets/viper_detail/Presenter.swift.liquid
173
+ - bundled/template_sets/viper_detail/Protocols.swift.liquid
174
+ - bundled/template_sets/viper_detail/View.swift.liquid
175
+ - bundled/template_sets/viper_detail/WireFrame.swift.liquid
176
+ - bundled/template_sets/viper_table/DataManagers/LocalDataManager.swift.liquid
177
+ - bundled/template_sets/viper_table/DataManagers/RemoteDataManager.swift.liquid
178
+ - bundled/template_sets/viper_table/Interactor.swift.liquid
179
+ - bundled/template_sets/viper_table/Presenter.swift.liquid
180
+ - bundled/template_sets/viper_table/Protocols.swift.liquid
181
+ - bundled/template_sets/viper_table/View.swift.liquid
182
+ - bundled/template_sets/viper_table/WireFrame.swift.liquid
183
+ - lib/generamba/string-colorize.rb
184
+ - lib/molt.rb
185
+ - lib/molt/cli/create_module.rb
186
+ - lib/molt/cli/main.rb
187
+ - lib/molt/cli/setup.rb
188
+ - lib/molt/cli/template_sets.rb
189
+ - lib/molt/configuration.rb
190
+ - lib/molt/template.rb
191
+ - lib/molt/version.rb
192
+ - molt.gemspec
193
+ - sample_configs/global_config.yml.erb
194
+ homepage: https://github.com/MarcoCabazal/Molt
195
+ licenses:
196
+ - MIT
197
+ metadata: {}
198
+ post_install_message:
199
+ rdoc_options: []
200
+ require_paths:
201
+ - lib
202
+ required_ruby_version: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - ">="
205
+ - !ruby/object:Gem::Version
206
+ version: '2.2'
207
+ required_rubygems_version: !ruby/object:Gem::Requirement
208
+ requirements:
209
+ - - ">="
210
+ - !ruby/object:Gem::Version
211
+ version: '0'
212
+ requirements: []
213
+ rubyforge_project:
214
+ rubygems_version: 2.6.14
215
+ signing_key:
216
+ specification_version: 4
217
+ summary: VIPER module generator for Swift projects.
218
+ test_files: []