enoki 0.0.0 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 421193dfba17a3a10ac4ed8e56bd17db8b62028f
4
- data.tar.gz: 1d6939b29abfade2c748f85568ff0d9458331cc0
3
+ metadata.gz: 5b25b6f2f7ad6bcf55593ec13a521539ca4d2990
4
+ data.tar.gz: 18d52ddd228e5a60aa12795531093099b707eaee
5
5
  SHA512:
6
- metadata.gz: bbeed8a9a88aa43f0008ee05502a2fb7b1c3daa6dedc11aad69c8a83bcd1f6d4a39e0a70bc521996b95b25c38ff817a74245366d8fa6454e70b1e42137f8d2ae
7
- data.tar.gz: 51e0140f87338c6cf541682af93a5167c48531e0e304a058d2b54c2ee13202891690cb2daf561b76cb1bf85ebc20311d1c6561ad34b5cb2a55b840cc18daa329
6
+ metadata.gz: 6061c4646350e534be0b99f69992aef9ba5808ad21023d930a865fb9bff6e4bbff5d7bcb4e66b2aa0676d935e973a7d94a792858e9cd681535d9789bff46e20d
7
+ data.tar.gz: 1a8f4baf6eaa558c2025c4bc276cd82749d60255ccf58b34ce3ed7ca5e7b3cf124beb2a039347fb56bcedfc18aa5a25ab9ef2622cfc4fbfe4c070cf6f2dc5541
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # Enoki
2
2
 
3
3
  Code generator for Xcode project.
4
+ You can manage multiple user-defined file template set in your project.
4
5
 
5
6
  ## Installation
6
7
 
@@ -10,13 +11,80 @@ $ gem install enoki
10
11
 
11
12
  ## Usage
12
13
 
13
- TODO: Write usage instructions here
14
+ ### Setup
14
15
 
15
- ## Development
16
+ Run `enoki init` in your project root directory, then created `.enoki.yml` file with some questions.
16
17
 
17
- After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
18
+ ### Create template set
18
19
 
19
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
20
+ Create template set directory in your template directory (default: ./templates) and organize template files. The template file has extension `.tt`.
21
+
22
+ For example: https://github.com/slightair/enoki/tree/master/examples/Enoki%20Example/templates
23
+
24
+ ```
25
+ templates
26
+ ├── Test
27
+ │   └── Enoki\ Example
28
+ │   ├── ViewController
29
+ │   │   └── __name__ViewController.swift.tt
30
+ │   └── ViewModel
31
+ │   └── __name__ViewModel.swift.tt
32
+ └── VIPER
33
+ └── Enoki\ Example
34
+ └── Modules
35
+ └── __name__
36
+ └── __name__ViewController.swift.tt
37
+ ```
38
+
39
+ This example case has 2 template set, `Test` and `VIPER`.
40
+
41
+ ### Generate source code
42
+
43
+ Next, run `enoki generate Test Hello` and generated following files.
44
+
45
+ ```
46
+ create Enoki Example/ViewController/HelloViewController.swift
47
+ create Enoki Example/ViewModel/HelloViewModel.swift
48
+ ```
49
+
50
+ Then added 2 files to your Xcode project and setup project groups that correspond to template set directory tree.
51
+
52
+ ![](./assets/project_file_tree.png)
53
+
54
+ ### File name rule
55
+
56
+ If you use `__name__` in file or directory name of template, replace to capitalized name argument in your command.
57
+
58
+ For example, generate `Modules/Hello/HelloViewController.swift` from template file `Modules/__name__/__name__ViewController.swift.tt` if your command is `generate TEMPLATE_SET hello`.
59
+
60
+ ### Template file rule
61
+
62
+ The template file is ERB template that have extension `.tt`.
63
+ Enoki pass name to template engine.
64
+
65
+ If your template is...
66
+
67
+ ```swift
68
+ import UIKit
69
+
70
+ class <%= name %>ViewController: UIViewController {
71
+ override func viewDidLoad() {
72
+ super.viewDidLoad()
73
+ }
74
+ }
75
+ ```
76
+
77
+ and run generate command with name `hello`, then you got following result.
78
+
79
+ ```swift
80
+ import UIKit
81
+
82
+ class HelloViewController: UIViewController {
83
+ override func viewDidLoad() {
84
+ super.viewDidLoad()
85
+ }
86
+ }
87
+ ```
20
88
 
21
89
  ## Contributing
22
90
 
@@ -24,4 +92,4 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/slight
24
92
 
25
93
  ## License
26
94
 
27
- The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
95
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
Binary file
data/enoki.gemspec CHANGED
@@ -8,20 +8,21 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Enoki::VERSION
9
9
  spec.authors = ["slightair"]
10
10
  spec.email = ["arksutite@gmail.com"]
11
-
11
+
12
12
  spec.summary = %q{Code generator for Xcode project.}
13
- spec.description = %q{Code generator for Xcode project.}
13
+ spec.description = %q{Code generator for Xcode project. You can manage multiple user-defined file template set in your project.}
14
14
  spec.homepage = "https://github.com/slightair/enoki"
15
15
  spec.license = "MIT"
16
-
16
+
17
17
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
18
18
  f.match(%r{^(test|spec|features|examples)/})
19
19
  end
20
20
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
21
21
  spec.require_paths = ["lib"]
22
-
22
+
23
23
  spec.add_development_dependency "bundler", "~> 1.14"
24
24
  spec.add_development_dependency "rake", "~> 10.0"
25
-
26
- spec.add_dependency 'thor'
25
+
26
+ spec.add_dependency "thor", "~> 0.19"
27
+ spec.add_dependency "xcodeproj", "~> 1.5"
27
28
  end
@@ -1,4 +1,5 @@
1
1
  require 'yaml'
2
+ require 'xcodeproj'
2
3
 
3
4
  module Enoki
4
5
  class CLI < Thor
@@ -38,6 +39,10 @@ module Enoki
38
39
  def templates
39
40
  Dir.glob(File.join(template_dir, "*/")).map { |f| File.basename(f) }
40
41
  end
42
+
43
+ def project
44
+ @project ||= Xcodeproj::Project.open(project_file_path)
45
+ end
41
46
  end
42
47
  end
43
48
  end
@@ -2,8 +2,9 @@ require 'pathname'
2
2
 
3
3
  module Enoki
4
4
  class CLI < Thor
5
- NAME_PLACEHOLDER = '__name__'
6
- EXT_TEMPLATE = '.tt'
5
+ NAME_PLACEHOLDER = "__name__"
6
+ EXT_TEMPLATE = ".tt"
7
+ SOURCE_CODE_EXT_LIST = %w(c m mm swift).map { |ext| ".#{ext}" }
7
8
 
8
9
  include Thor::Actions
9
10
 
@@ -21,17 +22,42 @@ module Enoki
21
22
  end
22
23
 
23
24
  file_list.each do |path|
25
+ resolved_path = Pathname.new(path.to_path.gsub(NAME_PLACEHOLDER, name.capitalize).chomp(EXT_TEMPLATE))
24
26
  source_path = path.expand_path(selected_template_root).to_path
25
- dest_path = path.expand_path(project_root).to_path.gsub(NAME_PLACEHOLDER, name.capitalize).chomp(EXT_TEMPLATE)
27
+ dest_path = resolved_path.expand_path(project_root).to_path
26
28
 
27
29
  template(source_path, dest_path, context: context_for_template(name))
30
+ add_file_reference(resolved_path)
28
31
  end
32
+
33
+ project.save
29
34
  end
30
35
 
31
36
  no_commands do
32
37
  def context_for_template(name)
33
38
  binding
34
39
  end
40
+
41
+ def add_file_reference(path)
42
+ path_list = path.to_path.split(File::SEPARATOR)
43
+ group = project.root_object.main_group
44
+
45
+ while path_list.size > 1
46
+ dir = path_list.shift
47
+ next_group = group.children.find { |g| g.path == dir } || group.new_group(dir, dir)
48
+ group = next_group
49
+ end
50
+
51
+ file = path_list.shift
52
+ file_ref = group.files.find { |f| f.path == file } || group.new_reference(file)
53
+
54
+ if SOURCE_CODE_EXT_LIST.include?(path.extname)
55
+ target = project.targets.first
56
+ if target
57
+ target.source_build_phase.add_file_reference(file_ref, true)
58
+ end
59
+ end
60
+ end
35
61
  end
36
62
  end
37
63
  end
@@ -1,6 +1,6 @@
1
1
  module Enoki
2
2
  class CLI < Thor
3
- desc "settings", "show settings"
3
+ desc "show", "show settings"
4
4
  def show
5
5
  [:template_dir, :project_root_dir, :project_file_path].each do |e|
6
6
  puts("#{e}: #{send(e)}")
data/lib/enoki/cli.rb CHANGED
@@ -6,3 +6,13 @@ require 'enoki/cli/init'
6
6
  require 'enoki/cli/show'
7
7
  require 'enoki/cli/list'
8
8
  require 'enoki/cli/generate'
9
+
10
+ module Enoki
11
+ class CLI < Thor
12
+ desc "version", "print enoki version"
13
+ def version
14
+ puts Enoki::VERSION
15
+ end
16
+ map %w(-v --version) => :version
17
+ end
18
+ end
data/lib/enoki/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Enoki
2
- VERSION = "0.0.0"
2
+ VERSION = "0.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: enoki
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - slightair
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-01 00:00:00.000000000 Z
11
+ date: 2017-08-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -42,17 +42,32 @@ dependencies:
42
42
  name: thor
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: '0.19'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.19'
55
+ - !ruby/object:Gem::Dependency
56
+ name: xcodeproj
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.5'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: '0'
55
- description: Code generator for Xcode project.
68
+ version: '1.5'
69
+ description: Code generator for Xcode project. You can manage multiple user-defined
70
+ file template set in your project.
56
71
  email:
57
72
  - arksutite@gmail.com
58
73
  executables:
@@ -65,6 +80,7 @@ files:
65
80
  - LICENSE
66
81
  - README.md
67
82
  - Rakefile
83
+ - assets/project_file_tree.png
68
84
  - bin/enoki
69
85
  - enoki.gemspec
70
86
  - lib/enoki.rb