sbconstants 0.0.4 → 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.
- checksums.yaml +7 -0
- data/README.md +21 -3
- data/lib/sbconstants.rb +2 -1
- data/lib/sbconstants/cli.rb +26 -22
- data/lib/sbconstants/identifiers.yml +3 -1
- data/lib/sbconstants/location.rb +4 -4
- data/lib/sbconstants/{constant_writer.rb → objc_constant_writer.rb} +11 -9
- data/lib/sbconstants/options.rb +18 -14
- data/lib/sbconstants/section.rb +15 -2
- data/lib/sbconstants/swift_constant_writer.rb +28 -0
- data/lib/sbconstants/templates/{body.erb → objc_body.erb} +4 -3
- data/lib/sbconstants/templates/swift_body.erb +17 -0
- data/lib/sbconstants/version.rb +1 -1
- data/sbconstants.gemspec +5 -4
- metadata +17 -14
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 11f60a7cc73a7fd632d10cae568b307ef2c313a5
|
4
|
+
data.tar.gz: 555e5f8778c56c11a08673fc58be52e7286c6061
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e872b75a0d28fca183a4adf3fea257120e79204bbd4e0cbb88768a99cc13a71ac4b4a11fdb4cf619b52fd4175f879499a8852afb182538bb68a96e1d6b9fadb1
|
7
|
+
data.tar.gz: 109e3329c802dc0f93d1a6b2431be3635cda6b47fddce3fd559d790a39cd3cbb20e03cb43b4ed87289960b3f83ba8e50a5258cb9a1ee2915940eaf95737eb652
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
#
|
1
|
+
# sbconstants
|
2
2
|
|
3
|
-
Generate a constants file by grabbing identifiers from
|
3
|
+
Generate a constants file by grabbing identifiers from storyboards in a project. See [my blog post](http://paul-samuels.com/blog/2013/01/31/storyboard-constants/) for more use cases.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -10,11 +10,29 @@ Generate a constants file by grabbing identifiers from storybaords in a project
|
|
10
10
|
|
11
11
|
For automated use:
|
12
12
|
|
13
|
-
1. Add a file to hold your constants e.g. `PASStoryboardConstants.(h|m)`
|
13
|
+
1. Add a file in Xcode to hold your constants e.g. `PASStoryboardConstants.(h|m)`
|
14
14
|
2. Add a build script to build phases
|
15
15
|
sbconstants path_to_constant_file
|
16
16
|
3. Enjoy your identifiers being added as constants to your constants file
|
17
17
|
|
18
|
+
For manual use (using swift):
|
19
|
+
|
20
|
+
1. Add a file in Xcode to hold your constants e.g. `StoryboardIdentifiers.swift`
|
21
|
+
2. Add a command to your [Makefile](https://github.com/artsy/eidolon/blob/15da1330a04615b3553779742f166b707c6ef65f/Makefile#L54) to run something similar to `sbconstants path/to/StoryboardIdentifiers.swift --source-dir path/to/Storyboards --swift`
|
22
|
+
|
23
|
+
## Command line API
|
24
|
+
|
25
|
+
```sh
|
26
|
+
$ sbconstants -h
|
27
|
+
Usage: DESTINATION_FILE [options]
|
28
|
+
-p, --prefix=<prefix> Only match identifiers with <prefix>
|
29
|
+
-s, --source-dir=<source> Directory containing storyboards
|
30
|
+
-sw, --swift Use the swift language
|
31
|
+
-q, --queries=<queries> YAML file containing queries
|
32
|
+
-d, --dry-run Output to STDOUT
|
33
|
+
-v, --verbose Verbose output
|
34
|
+
```
|
35
|
+
|
18
36
|
## Contributing
|
19
37
|
|
20
38
|
1. Fork it
|
data/lib/sbconstants.rb
CHANGED
@@ -2,7 +2,8 @@ module SBConstants
|
|
2
2
|
end
|
3
3
|
|
4
4
|
require 'sbconstants/cli'
|
5
|
-
require 'sbconstants/
|
5
|
+
require 'sbconstants/objc_constant_writer'
|
6
|
+
require 'sbconstants/swift_constant_writer'
|
6
7
|
require 'sbconstants/location'
|
7
8
|
require 'sbconstants/query'
|
8
9
|
require 'sbconstants/options'
|
data/lib/sbconstants/cli.rb
CHANGED
@@ -3,21 +3,21 @@ require 'set'
|
|
3
3
|
module SBConstants
|
4
4
|
class CLI
|
5
5
|
attr_accessor :options, :constants, :sections
|
6
|
-
|
6
|
+
|
7
7
|
def self.run argv
|
8
8
|
new(Options.parse(argv)).run
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
def initialize options
|
12
12
|
self.options = options
|
13
13
|
self.constants = Hash.new { |h,k| h[k] = Set.new }
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
def run
|
17
17
|
parse_storyboards
|
18
18
|
write
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
def sections
|
22
22
|
@sections ||= begin
|
23
23
|
sections_map = Hash.new { |h,k| h[k] = Set.new }
|
@@ -31,9 +31,9 @@ module SBConstants
|
|
31
31
|
@sections = @sections.sort_by { |section| section.locations.map(&:key_path).join(',') }
|
32
32
|
end
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
private
|
36
|
-
|
36
|
+
|
37
37
|
def parse_storyboards
|
38
38
|
Dir["#{options.source_dir}/**/*.storyboard"].each do |storyboard|
|
39
39
|
File.readlines(storyboard).each_with_index do |line, index|
|
@@ -41,27 +41,31 @@ module SBConstants
|
|
41
41
|
next unless value = line[query.regex, 1]
|
42
42
|
next if value.strip.empty?
|
43
43
|
next unless value.start_with?(options.prefix) if options.prefix
|
44
|
-
|
44
|
+
|
45
45
|
constants[value] << Location.new(query.node, query.attribute, line.strip, File.basename(storyboard, '.storyboard'), index + 1)
|
46
46
|
end
|
47
47
|
end
|
48
48
|
end
|
49
|
-
end
|
50
|
-
|
49
|
+
end
|
50
|
+
|
51
51
|
def write
|
52
|
-
int_out, imp_out = $stdout, $stdout
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
52
|
+
int_out, imp_out, swift_out = $stdout, $stdout, $stdout
|
53
|
+
dry_run = options.dry_run
|
54
|
+
|
55
|
+
if options.use_swift
|
56
|
+
swift_out = File.open("#{options.output_path}.swift", 'w') unless dry_run
|
57
|
+
SwiftConstantWriter.new(self, swift_out).write
|
58
|
+
swift_out.close
|
59
|
+
else
|
60
|
+
|
61
|
+
int_out = File.open("#{options.output_path}.h", 'w') unless dry_run
|
62
|
+
imp_out = File.open("#{options.output_path}.m", 'w') unless dry_run
|
63
|
+
|
64
|
+
ObjcConstantWriter.new(self, int_out, imp_out).write
|
65
|
+
|
66
|
+
int_out.close unless dry_run
|
67
|
+
imp_out.close unless dry_run
|
64
68
|
end
|
65
69
|
end
|
66
70
|
end
|
67
|
-
end
|
71
|
+
end
|
@@ -1,10 +1,12 @@
|
|
1
1
|
---
|
2
2
|
segue: identifier
|
3
3
|
tableViewCell: reuseIdentifier
|
4
|
+
collectionViewCell: reuseIdentifier
|
4
5
|
view: restorationIdentifier
|
5
6
|
? - navigationController
|
6
7
|
- viewController
|
7
8
|
- tableViewController
|
8
9
|
- collectionViewController
|
9
10
|
: - storyboardIdentifier
|
10
|
-
- restorationIdentifier
|
11
|
+
- restorationIdentifier
|
12
|
+
|
data/lib/sbconstants/location.rb
CHANGED
@@ -3,17 +3,17 @@ module SBConstants
|
|
3
3
|
def key_path
|
4
4
|
@key_path ||= "#{node}.#{attribute}"
|
5
5
|
end
|
6
|
-
|
6
|
+
|
7
7
|
def debug
|
8
8
|
@debug ||= "#{file}[line:#{line}](#{key_path})"
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
def eql? other
|
12
12
|
self.class == other.class && key_path == other.key_path
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
def hash
|
16
16
|
key_path.hash
|
17
17
|
end
|
18
18
|
end
|
19
|
-
end
|
19
|
+
end
|
@@ -2,35 +2,37 @@ require 'delegate'
|
|
2
2
|
require 'erb'
|
3
3
|
|
4
4
|
module SBConstants
|
5
|
-
class
|
5
|
+
class ObjcConstantWriter < SimpleDelegator
|
6
6
|
def initialize data_source, int_out, imp_out
|
7
7
|
super data_source
|
8
8
|
@int_out = int_out
|
9
9
|
@imp_out = imp_out
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
def write
|
13
13
|
@int_out.puts header
|
14
14
|
@imp_out.puts implementation
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def templates_dir
|
18
18
|
@templates_dir ||= File.dirname(__FILE__) + '/templates/'
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
def header
|
22
22
|
template_with_file "\n", %Q{extern NSString * const <%= constant %>;\n}
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
def implementation
|
26
|
-
head = %Q{
|
26
|
+
head = %Q{#import "<%= File.basename(options.output_path) %>.h"\n\n}
|
27
27
|
body = %Q{NSString * const <%= constant %> = @"<%= constant %>";\n}
|
28
28
|
template_with_file head, body
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
def template_with_file head, body
|
32
|
-
|
32
|
+
@head = head
|
33
|
+
@body = body
|
34
|
+
pre_processed_template = ERB.new(File.open("#{templates_dir}objc_body.erb").read, nil, '<>').result(binding)
|
33
35
|
ERB.new(pre_processed_template, nil, '<>').result(binding)
|
34
36
|
end
|
35
37
|
end
|
36
|
-
end
|
38
|
+
end
|
data/lib/sbconstants/options.rb
CHANGED
@@ -3,55 +3,59 @@ require 'yaml'
|
|
3
3
|
|
4
4
|
module SBConstants
|
5
5
|
class Options
|
6
|
-
attr_accessor :dry_run, :prefix, :destination, :query_config, :output_path, :source_dir, :verbose, :query_file
|
7
|
-
|
6
|
+
attr_accessor :dry_run, :prefix, :destination, :query_config, :output_path, :source_dir, :verbose, :query_file, :use_swift
|
7
|
+
|
8
8
|
def self.parse argv
|
9
9
|
options = self.new
|
10
10
|
OptionParser.new do |opts|
|
11
11
|
opts.banner = "Usage: DESTINATION_FILE [options]"
|
12
|
-
|
12
|
+
|
13
13
|
opts.on('-p', '--prefix=<prefix>', 'Only match identifiers with <prefix>') do |prefix|
|
14
14
|
options.prefix = prefix
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
opts.on('-s', '--source-dir=<source>', 'Directory containing storyboards') do |source_dir|
|
18
18
|
options.source_dir = source_dir
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
|
+
opts.on('-w', '--swift', 'Output to a Swift File') do |use_swift|
|
22
|
+
options.use_swift = use_swift
|
23
|
+
end
|
24
|
+
|
21
25
|
opts.on('-q', '--queries=<queries>', 'YAML file containing queries') do |queries|
|
22
26
|
options.query_file = queries
|
23
27
|
end
|
24
|
-
|
28
|
+
|
25
29
|
opts.on('-d', '--dry-run', 'Output to STDOUT') do |dry_run|
|
26
30
|
options.dry_run = dry_run
|
27
31
|
end
|
28
|
-
|
32
|
+
|
29
33
|
opts.on('-v', '--verbose', 'Verbose output') do |verbose|
|
30
34
|
options.verbose = verbose
|
31
35
|
end
|
32
36
|
end.parse!(argv)
|
33
|
-
|
37
|
+
|
34
38
|
if argv.first.nil?
|
35
39
|
options.dry_run = true
|
36
40
|
options.output_path = 'no file given'
|
37
41
|
else
|
38
|
-
options.output_path = argv.first.chomp(File.extname(ARGV.first))
|
42
|
+
options.output_path = argv.first.chomp(File.extname(ARGV.first))
|
39
43
|
end
|
40
44
|
options
|
41
45
|
end
|
42
|
-
|
46
|
+
|
43
47
|
def initialize
|
44
48
|
self.query_file = File.expand_path('../../sbconstants/identifiers.yml', __FILE__)
|
45
49
|
self.source_dir = Dir.pwd
|
46
50
|
end
|
47
|
-
|
51
|
+
|
48
52
|
def queries
|
49
53
|
load_queries if @queries.nil?
|
50
54
|
@queries
|
51
55
|
end
|
52
|
-
|
56
|
+
|
53
57
|
private
|
54
|
-
|
58
|
+
|
55
59
|
def load_queries
|
56
60
|
@queries = []
|
57
61
|
config = YAML.load(File.open(query_file).read)
|
@@ -64,4 +68,4 @@ module SBConstants
|
|
64
68
|
end
|
65
69
|
end
|
66
70
|
end
|
67
|
-
end
|
71
|
+
end
|
data/lib/sbconstants/section.rb
CHANGED
@@ -1,3 +1,16 @@
|
|
1
1
|
module SBConstants
|
2
|
-
Section = Struct.new(:locations, :constants)
|
3
|
-
|
2
|
+
Section = Struct.new(:locations, :constants) do
|
3
|
+
|
4
|
+
def pretty_title
|
5
|
+
title = locations.map(&:key_path).join('')
|
6
|
+
.gsub(".", "")
|
7
|
+
.gsub(" ", "")
|
8
|
+
.gsub("identifier", "Identifier")
|
9
|
+
.gsub("viewcontroller", "ViewController")
|
10
|
+
.gsub("storyboard", "Storyboard")
|
11
|
+
|
12
|
+
title.slice(0,1).capitalize + title.slice(1..-1)
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'delegate'
|
2
|
+
require 'erb'
|
3
|
+
|
4
|
+
module SBConstants
|
5
|
+
class SwiftConstantWriter < SimpleDelegator
|
6
|
+
def initialize data_source, swift_out
|
7
|
+
super data_source
|
8
|
+
@swift_out = swift_out
|
9
|
+
end
|
10
|
+
|
11
|
+
def write
|
12
|
+
head = %Q{\nimport Foundation"\n}
|
13
|
+
body = %Q{ case <%= constant.gsub(" ", "").gsub("-", "") %> = "<%= constant %>"\n}
|
14
|
+
@swift_out.puts template_with_file head, body
|
15
|
+
end
|
16
|
+
|
17
|
+
def templates_dir
|
18
|
+
@templates_dir ||= File.dirname(__FILE__) + '/templates/'
|
19
|
+
end
|
20
|
+
|
21
|
+
def template_with_file head, body
|
22
|
+
@head = head
|
23
|
+
@body = body
|
24
|
+
pre_processed_template = ERB.new(File.open("#{templates_dir}swift_body.erb").read, nil, '<>').result(binding)
|
25
|
+
ERB.new(pre_processed_template, nil, '<>').result(binding)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
// Auto generated file - any changes will be lost
|
2
|
-
|
2
|
+
|
3
|
+
<%= @head %>
|
3
4
|
<%% sections.each do |section| %>
|
4
5
|
#pragma mark - <%%= section.locations.map(&:key_path).join(', ') %>
|
5
6
|
<%% section.constants.each do |constant| %>
|
@@ -11,7 +12,7 @@
|
|
11
12
|
//
|
12
13
|
<%% end %>
|
13
14
|
<%% end %>
|
14
|
-
<%= body %>
|
15
|
+
<%= @body %>
|
15
16
|
<%% end %>
|
16
17
|
|
17
|
-
<%% end %>
|
18
|
+
<%% end %>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
// Auto generated file from SBConstants - any changes may be lost
|
2
|
+
<%% sections.each do |section| %>
|
3
|
+
|
4
|
+
public enum <%%= section.pretty_title %> : String {
|
5
|
+
<%% section.constants.each do |constant| %>
|
6
|
+
<%% if options.verbose %>
|
7
|
+
//
|
8
|
+
<%% constants[constant].each do |location| %>
|
9
|
+
// info: <%%= location.debug %>
|
10
|
+
// context: <%%= location.context %>
|
11
|
+
//
|
12
|
+
<%% end %>
|
13
|
+
<%% end %>
|
14
|
+
<%= @body %>
|
15
|
+
<%% end %>
|
16
|
+
}
|
17
|
+
<%% end %>
|
data/lib/sbconstants/version.rb
CHANGED
data/sbconstants.gemspec
CHANGED
@@ -6,11 +6,12 @@ require 'sbconstants/version'
|
|
6
6
|
Gem::Specification.new do |gem|
|
7
7
|
gem.name = "sbconstants"
|
8
8
|
gem.version = SBConstants::VERSION
|
9
|
-
gem.authors = ["Paul Samuels"]
|
10
|
-
gem.email = ["paulio1987@gmail.com"]
|
11
|
-
gem.description = %q{Generate constants from storyboards}
|
12
|
-
gem.summary = %q{Generate constants from storyboards}
|
9
|
+
gem.authors = ["Paul Samuels", "Orta Therox"]
|
10
|
+
gem.email = ["paulio1987@gmail.com", "orta.therox@gmail.com"]
|
11
|
+
gem.description = %q{Generate constants from storyboards in objc and swift.}
|
12
|
+
gem.summary = %q{Generate constants from storyboards in Objective-C and Swift.}
|
13
13
|
gem.homepage = "https://github.com/paulsamuels/SBConstants"
|
14
|
+
gem.license = "MIT"
|
14
15
|
|
15
16
|
gem.files = `git ls-files`.split($/)
|
16
17
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
metadata
CHANGED
@@ -1,19 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sbconstants
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Paul Samuels
|
8
|
+
- Orta Therox
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2014-09-24 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
|
-
description: Generate constants from storyboards
|
14
|
+
description: Generate constants from storyboards in objc and swift.
|
15
15
|
email:
|
16
16
|
- paulio1987@gmail.com
|
17
|
+
- orta.therox@gmail.com
|
17
18
|
executables:
|
18
19
|
- sbconstants
|
19
20
|
extensions: []
|
@@ -27,38 +28,40 @@ files:
|
|
27
28
|
- bin/sbconstants
|
28
29
|
- lib/sbconstants.rb
|
29
30
|
- lib/sbconstants/cli.rb
|
30
|
-
- lib/sbconstants/constant_writer.rb
|
31
31
|
- lib/sbconstants/identifiers.yml
|
32
32
|
- lib/sbconstants/location.rb
|
33
|
+
- lib/sbconstants/objc_constant_writer.rb
|
33
34
|
- lib/sbconstants/options.rb
|
34
35
|
- lib/sbconstants/query.rb
|
35
36
|
- lib/sbconstants/section.rb
|
36
|
-
- lib/sbconstants/
|
37
|
+
- lib/sbconstants/swift_constant_writer.rb
|
38
|
+
- lib/sbconstants/templates/objc_body.erb
|
39
|
+
- lib/sbconstants/templates/swift_body.erb
|
37
40
|
- lib/sbconstants/version.rb
|
38
41
|
- sbconstants.gemspec
|
39
42
|
homepage: https://github.com/paulsamuels/SBConstants
|
40
|
-
licenses:
|
43
|
+
licenses:
|
44
|
+
- MIT
|
45
|
+
metadata: {}
|
41
46
|
post_install_message:
|
42
47
|
rdoc_options: []
|
43
48
|
require_paths:
|
44
49
|
- lib
|
45
50
|
required_ruby_version: !ruby/object:Gem::Requirement
|
46
|
-
none: false
|
47
51
|
requirements:
|
48
|
-
- -
|
52
|
+
- - '>='
|
49
53
|
- !ruby/object:Gem::Version
|
50
54
|
version: '0'
|
51
55
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
52
|
-
none: false
|
53
56
|
requirements:
|
54
|
-
- -
|
57
|
+
- - '>='
|
55
58
|
- !ruby/object:Gem::Version
|
56
59
|
version: '0'
|
57
60
|
requirements: []
|
58
61
|
rubyforge_project:
|
59
|
-
rubygems_version:
|
62
|
+
rubygems_version: 2.0.6
|
60
63
|
signing_key:
|
61
|
-
specification_version:
|
62
|
-
summary: Generate constants from storyboards
|
64
|
+
specification_version: 4
|
65
|
+
summary: Generate constants from storyboards in Objective-C and Swift.
|
63
66
|
test_files: []
|
64
67
|
has_rdoc:
|