klipp 0.2.1 → 0.2.2

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: 392a938e7875756b189025a720be1883cfa03a39
4
- data.tar.gz: c5a1494aef85c779577bf6763590b26b8b73d1f5
3
+ metadata.gz: d1614564fed67e3a011845b9b346acf78db4f099
4
+ data.tar.gz: 8c6d33936676f31382a901fc8b7df203d2de5689
5
5
  SHA512:
6
- metadata.gz: 360cb7ba0a1df9d580656bb97190fc3f8affb7360f3c6a373356a91970e7d117b7df0ae0f5678d3b6079537911c545fc044fdd1094fed204d802c3bf06909140
7
- data.tar.gz: 097d223744f66e7693ebb88b8009710aeb02ba95a01969d045b5f27c0bc5c32cd5309a7500220a54f2680bf058a3026c95368da1100414e5105ed646f28844ef
6
+ metadata.gz: 61cc131c53da984262157a9acfc2002d278ac3afce1bc1ce0fe094c5614d2e979523a6617149c41cd8a6c225a2b3c58d327bca06598f099553946d078c5e88c4
7
+ data.tar.gz: a22297e52cc98ed4c3ae60797cddba52f666779d4a028fd8c0ef28a028849ba195683773a8d97e2fec22c5a9fd4873b4974f0e734fe6bfaedfaac0f13b27edcb
data/klipp.gemspec CHANGED
@@ -22,10 +22,11 @@ Gem::Specification.new do |spec|
22
22
  spec.require_paths = %w(lib)
23
23
 
24
24
  spec.add_runtime_dependency 'bundler', '~> 1.3'
25
- spec.add_runtime_dependency 'rake'
26
- spec.add_runtime_dependency 'ptools'
27
- spec.add_runtime_dependency 'formatador'
28
- spec.add_runtime_dependency 'colorize'
29
- spec.add_runtime_dependency 'grit'
30
- spec.add_runtime_dependency 'highline'
25
+ spec.add_runtime_dependency 'rake', '~> 10.1'
26
+ spec.add_runtime_dependency 'ptools', '~> 1.2'
27
+ spec.add_runtime_dependency 'formatador', '~> 0.2'
28
+ spec.add_runtime_dependency 'colorize', '~> 0.6'
29
+ spec.add_runtime_dependency 'grit', '~> 2.5'
30
+ spec.add_runtime_dependency 'highline', '~> 1.6'
31
+ spec.add_runtime_dependency 'zaru', '~> 0'
31
32
  end
data/lib/klipp.rb CHANGED
@@ -16,6 +16,10 @@ module Klipp
16
16
  class Hint < StandardError
17
17
  end
18
18
 
19
+ class ClusterError < StandardError
20
+ attr_accessor :messages
21
+ end
22
+
19
23
  def self.env
20
24
  @@env ||= StringInquirer.new('prod')
21
25
  end
@@ -47,9 +51,11 @@ module Klipp
47
51
  case e
48
52
  when Klipp::Hint
49
53
  Formatador.display_line("[yellow][?] #{e.message}[/]")
54
+ when Klipp::ClusterError
55
+ e.messages.each { |msg| Formatador.display_line("[red][!] #{msg}[/]\n") }
50
56
  else
51
- Formatador.display_line("[red][!] #{e.message}[/]")
52
- Formatador.display_line(e.backtrace[0..10].join("\n"))
57
+ Formatador.display_line("[red][!] #{e.message}[/]\n")
58
+ Formatador.display_line(e.backtrace.first)
53
59
  end
54
60
  1 # exit code
55
61
  end
@@ -90,7 +96,26 @@ module Klipp
90
96
  end
91
97
  spec_path = Template::Spec.spec_path_for_identifier creator.identifier
92
98
  spec = Template::Spec.from_file spec_path
93
- spec.set_token_values(creator.tokens, params.splice_option('-v'))
99
+
100
+ validation_errors = Array.new
101
+
102
+ begin
103
+ spec.set_token_values(creator.tokens, params.splice_option('-v'))
104
+ rescue Exception => e
105
+ validation_errors << e.message
106
+ end
107
+
108
+ begin
109
+ spec.confirm_required_files
110
+ rescue Exception => e
111
+ validation_errors << e.message
112
+ end
113
+
114
+ if validation_errors.length > 0
115
+ e = Klipp::ClusterError.new
116
+ e.messages = validation_errors
117
+ raise e
118
+ end
94
119
 
95
120
  block_actions = spec.block_actions_under_git && git_repository?
96
121
  if spec.pre_actions.count > 0
@@ -160,7 +185,7 @@ end
160
185
 
161
186
  class StringInquirer < String
162
187
  def method_missing(method_name, *arguments)
163
- if method_name.to_s[-1,1] == '?'
188
+ if method_name.to_s[-1, 1] == '?'
164
189
  self == method_name.to_s[0..-2]
165
190
  else
166
191
  super
data/lib/klipp/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Klipp
2
- VERSION = "0.2.1"
2
+ VERSION = "0.2.2"
3
3
  end
data/lib/template.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'template/spec'
2
2
  require 'template/token'
3
+ require 'template/required_file'
3
4
 
4
5
  module Template
5
6
 
@@ -0,0 +1,16 @@
1
+ require 'zaru'
2
+
3
+ module Template
4
+
5
+ class RequiredFile
6
+ attr_accessor :name, :directory # :default_value, :type, :bool_strings
7
+ attr_accessor :comment # , :validation, :validation_hint
8
+
9
+ def initialize(name)
10
+ raise 'File name required' unless name.length > 0
11
+ raise "Invalid characters found in file name (try #{Zaru.sanitize!(name)})" unless Zaru.sanitize!(name) == name
12
+ self.name = name if name
13
+ self.directory = '.'
14
+ end
15
+ end
16
+ end
data/lib/template/spec.rb CHANGED
@@ -4,7 +4,7 @@ module Template
4
4
  require 'date'
5
5
 
6
6
  attr_accessor :identifier, :block_actions_under_git
7
- attr_reader :post_actions
7
+ attr_reader :post_actions, :required_files
8
8
 
9
9
  def self.identifier_is_ambiguous(identifier)
10
10
  specs_matching_identifier(identifier).count == 1
@@ -50,6 +50,7 @@ module Template
50
50
 
51
51
  def initialize
52
52
  @tokens = Hash[]
53
+ @required_files = Array.new
53
54
 
54
55
  self[:BLANK] = Template::Token.new('', true)
55
56
  self[:DATE] = Template::Token.new(DateTime.now.strftime('%F'), true)
@@ -123,21 +124,49 @@ module Template
123
124
  end
124
125
 
125
126
  def set_token_values(tokens, verbose=false)
126
- msg = 'Token configuration error: '
127
+ token_errors = Hash[]
127
128
  puts() if verbose
128
129
  tokens.each do |name, value|
129
130
  token = self[name]
130
- invalidate msg+"unknown token :#{name}" unless token
131
131
  begin
132
- Formatador.display_line("#{name}: [bold]#{value}[/]") if verbose
133
- token.value = value
132
+ if token
133
+ Formatador.display_line("#{name}: [bold]#{value}[/]") if verbose
134
+ token.value = value
135
+ else
136
+ token_errors[name] = "unknown token :#{name}"
137
+ end
134
138
  rescue Exception => e
135
- invalidate msg+"token :#{name}. #{e.message}"
139
+ token_errors[name] = "token :#{name}. #{e.message}"
136
140
  end
137
141
  end
138
- puts() if verbose
142
+
139
143
  @tokens.each do |name, token|
140
- invalidate msg+"missing value for token :#{name}" if token.value == nil
144
+ token_errors[name] = "missing value for token :#{name}" if token.value == nil && token_errors[name] == nil
145
+ end
146
+
147
+ if token_errors.length > 0
148
+ msg = "Token configuration error:\n\n\t"
149
+ msg << token_errors.map { |name, error_message| error_message }.join("\n\t")
150
+ invalidate msg
151
+ end
152
+
153
+ puts() if verbose
154
+ end
155
+
156
+ def confirm_required_files()
157
+ missing_files = Array.new
158
+ self.required_files.each do |required_file|
159
+ file_path = File.join(required_file.directory, required_file.name)
160
+ missing_files << required_file unless File.exists? file_path
161
+ end
162
+
163
+ if missing_files.length > 0
164
+ message = "Required file#{missing_files.length > 1 ? 's' : ''} not found:\n\n"
165
+ missing_files.each do |missing_file|
166
+ file_path = File.join(missing_file.directory, missing_file.name)
167
+ message << "\t#{file_path} - #{missing_file.comment ? "#{missing_file.comment}" : ''}\n"
168
+ end
169
+ raise message
141
170
  end
142
171
  end
143
172
 
@@ -149,6 +178,13 @@ module Template
149
178
  @tokens.each { |name, token| yield(name, token) }
150
179
  end
151
180
 
181
+ def required_file name, &config
182
+ required_file = Template::RequiredFile.new name
183
+ raise 'Incomplete file configuration' unless block_given?
184
+ config.yield(required_file)
185
+ @required_files << required_file
186
+ end
187
+
152
188
  def klippfile
153
189
  kf = "create '#{self.class.expand_identifier(self.identifier)}' do |tokens|\n\n"
154
190
  @tokens.each do |name, token|
@@ -46,7 +46,7 @@ module Template
46
46
  end
47
47
 
48
48
  def bool_strings
49
- %w(NO YES)
49
+ @bool_strings ? @bool_strings : %w(NO YES)
50
50
  end
51
51
 
52
52
  def validation
@@ -0,0 +1,8 @@
1
+ create 'template-repository/FileRequirement' do |tokens|
2
+
3
+ # Required files:
4
+ #
5
+ # images/icon.png
6
+ # 72 x 72 pixels icon, used for the iOS 7 springboard on iPad
7
+
8
+ end
@@ -0,0 +1,10 @@
1
+ spec 'FileRequirement' do |s|
2
+ s.block_actions_under_git = true
3
+ # s.pre_actions = ['echo "Hello klipp!"']
4
+ # s.post_actions = ['pod install']
5
+
6
+ s.required_file 'icon.png' do |f|
7
+ f.comment = '72 x 72 pixels icon, used for the iOS 7 springboard on iPad'
8
+ f.directory = 'images'
9
+ end
10
+ end
data/spec/klipp_spec.rb CHANGED
@@ -65,7 +65,7 @@ describe Klipp do
65
65
  File.stubs(:exists?).returns(false)
66
66
  end
67
67
 
68
- it 'write a new Klippfile' do
68
+ it 'writes a new Klippfile' do
69
69
  klippfile = read_fixture 'Klippfile-after-prepare'
70
70
  File.expects(:write).with('Klippfile', klippfile)
71
71
  Klipp.cli_prepare(%w[Example])
@@ -131,4 +131,22 @@ describe Klipp do
131
131
 
132
132
  end
133
133
 
134
+ context 'with required file' do
135
+
136
+ before do
137
+ Klipp::Configuration.stubs(:root_dir).returns(File.join(__dir__, 'fixtures'))
138
+ Dir.stubs(:pwd).returns(Dir.mktmpdir)
139
+
140
+ maker = Klipp::Creator.new
141
+ maker.eval_string(read_fixture('Klippfile-file-requirement'), fixture_path('Klippfile-file-requirement'))
142
+ Klipp::Creator.stubs(:from_file).returns(maker)
143
+ end
144
+
145
+ it 'fails without the required files' do
146
+
147
+ expect { Klipp.cli_create([]) }.to raise_error Klipp::ClusterError
148
+
149
+ end
150
+
151
+ end
134
152
  end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe Template::RequiredFile do
4
+
5
+ it 'initializes with a file name' do
6
+ file = Template::RequiredFile.new 'file.txt'
7
+ file.should_not be_nil
8
+ end
9
+
10
+ it 'requires a file name' do
11
+ expect { file = Template::RequiredFile.new }.to raise_error ArgumentError
12
+ end
13
+
14
+ it 'requires the file name to not be empty' do
15
+ expect { file = Template::RequiredFile.new '' }.to raise_error RuntimeError
16
+ end
17
+
18
+ it 'requires the file name to be sanitized' do
19
+ expect { Template::RequiredFile.new '.what&up'}.to raise_error RuntimeError
20
+ expect { Template::RequiredFile.new 'not/a/file'}.to raise_error RuntimeError
21
+ end
22
+
23
+ context 'with file.txt' do
24
+
25
+ before do
26
+ @file = Template::RequiredFile.new 'file.txt'
27
+ end
28
+
29
+ it 'has a name' do
30
+ @file.name.should eq 'file.txt'
31
+ end
32
+
33
+ it 'has a comment' do
34
+ @file.comment = 'Comment'
35
+ @file.comment.should eq 'Comment'
36
+ end
37
+
38
+ it 'takes a directory' do
39
+ @file.directory = 'images'
40
+ @file.directory.should eq 'images'
41
+ end
42
+
43
+ it 'has a default directory' do
44
+ @file.directory.should eq '.'
45
+ end
46
+ end
47
+
48
+ end
@@ -114,30 +114,47 @@ describe Template::Spec do
114
114
  @template.post_actions = ['git init', 'git add .', 'git commit -m "Initial commit."', 'pod install']
115
115
  @template.post_actions.should eq ['git init', 'git add .', 'git commit -m "Initial commit."', 'pod install']
116
116
  end
117
+
117
118
  it 'has a token hash' do
118
119
  @template[:PROJECT_ID] = Template::Token.new
119
120
  @template[:PROJECT_ID].should be_an_instance_of(Template::Token)
120
121
  end
121
122
 
122
- it 'creates a token' do
123
- yielded_token = :not_a_token
124
- @template.token(:PROJECT_ID) { |t| yielded_token = t }
125
- yielded_token.should be_an_instance_of Template::Token
126
- end
123
+ describe 'token support' do
124
+ it 'creates a token' do
125
+ yielded_token = :not_a_token
126
+ @template.token(:PROJECT_ID) { |t| yielded_token = t }
127
+ yielded_token.should be_an_instance_of Template::Token
128
+ end
127
129
 
128
- it 'has a blank token' do
129
- @template[:BLANK].hidden.should eq true
130
- @template[:BLANK].value.should eq ''
131
- end
130
+ it 'has a blank token' do
131
+ @template[:BLANK].hidden.should eq true
132
+ @template[:BLANK].value.should eq ''
133
+ end
134
+
135
+ it 'has a date token' do
136
+ @template[:DATE].hidden.should eq true
137
+ @template[:DATE].value.should eq DateTime.now.strftime('%F')
138
+ end
132
139
 
133
- it 'has a date token' do
134
- @template[:DATE].hidden.should eq true
135
- @template[:DATE].value.should eq DateTime.now.strftime('%F')
140
+ it 'has a year token' do
141
+ @template[:YEAR].hidden.should eq true
142
+ @template[:YEAR].value.should eq '2014'
143
+ end
136
144
  end
137
145
 
138
- it 'has a year token' do
139
- @template[:YEAR].hidden.should eq true
140
- @template[:YEAR].value.should eq '2013'
146
+ describe 'required file support' do
147
+
148
+ it 'creates a required file instance' do
149
+ yielded_file = :not_a_file
150
+ @template.required_file('file.txt') { |f| yielded_file = f }
151
+ yielded_file.should be_an_instance_of Template::RequiredFile
152
+ end
153
+
154
+ it 'has no files at the beginning' do
155
+ @template.required_files.length.should eq 0
156
+ end
157
+
141
158
  end
142
159
 
143
160
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: klipp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric-Paul Lecluse
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-23 00:00:00.000000000 Z
11
+ date: 2014-01-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -28,84 +28,98 @@ dependencies:
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ~>
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '10.1'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ~>
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '10.1'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: ptools
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ~>
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: '1.2'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ~>
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: '1.2'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: formatador
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ~>
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: '0.2'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ~>
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: '0.2'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: colorize
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '>='
73
+ - - ~>
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: '0.6'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '>='
80
+ - - ~>
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: '0.6'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: grit
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - '>='
87
+ - - ~>
88
88
  - !ruby/object:Gem::Version
89
- version: '0'
89
+ version: '2.5'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - '>='
94
+ - - ~>
95
95
  - !ruby/object:Gem::Version
96
- version: '0'
96
+ version: '2.5'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: highline
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - '>='
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: '1.6'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: '1.6'
111
+ - !ruby/object:Gem::Dependency
112
+ name: zaru
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ~>
102
116
  - !ruby/object:Gem::Version
103
117
  version: '0'
104
118
  type: :runtime
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
- - - '>='
122
+ - - ~>
109
123
  - !ruby/object:Gem::Version
110
124
  version: '0'
111
125
  description: Klipp, Xcode templates for the rest of us.
@@ -131,9 +145,11 @@ files:
131
145
  - lib/klipp/parameter_list.rb
132
146
  - lib/klipp/version.rb
133
147
  - lib/template.rb
148
+ - lib/template/required_file.rb
134
149
  - lib/template/spec.rb
135
150
  - lib/template/token.rb
136
151
  - spec/fixtures/ambiguous-repo/Ambiguous/Ambiguous.klippspec
152
+ - spec/fixtures/complex-projects/file-requirement/Klippfile-file-requirement
137
153
  - spec/fixtures/projects/Klippfile
138
154
  - spec/fixtures/projects/Klippfile-after-prepare
139
155
  - spec/fixtures/projects/Klippfile-ambiguous
@@ -164,12 +180,14 @@ files:
164
180
  - spec/fixtures/template-repository/Example/XXPROJECT_IDXX/main.m
165
181
  - spec/fixtures/template-repository/Example/XXPROJECT_IDXX/nl.lproj/Localizable.strings
166
182
  - spec/fixtures/template-repository/Example/XXPROJECT_IDXXTests/XXPROJECT_TITLEXXTests.m
183
+ - spec/fixtures/template-repository/FileRequirement/FileRequirement.klippspec
167
184
  - spec/fixtures/template-repository/Interactive/Interactive.klippspec
168
185
  - spec/fixtures/template-repository/Interactive/XXSUBJECT_UNDER_TESTXXTests.m
169
186
  - spec/klipp/configuration_spec.rb
170
187
  - spec/klipp/creator_spec.rb
171
188
  - spec/klipp_spec.rb
172
189
  - spec/spec_helper.rb
190
+ - spec/template/required_file_spec.rb
173
191
  - spec/template/spec_spec.rb
174
192
  - spec/template/token_spec.rb
175
193
  - spec/template_spec.rb
@@ -193,7 +211,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
193
211
  version: '0'
194
212
  requirements: []
195
213
  rubyforge_project:
196
- rubygems_version: 2.1.11
214
+ rubygems_version: 2.2.1
197
215
  signing_key:
198
216
  specification_version: 4
199
217
  summary: Klipp is a command line gem for creating new (Xcode) projects from existing
@@ -202,6 +220,7 @@ summary: Klipp is a command line gem for creating new (Xcode) projects from exis
202
220
  template project by your own specifications.
203
221
  test_files:
204
222
  - spec/fixtures/ambiguous-repo/Ambiguous/Ambiguous.klippspec
223
+ - spec/fixtures/complex-projects/file-requirement/Klippfile-file-requirement
205
224
  - spec/fixtures/projects/Klippfile
206
225
  - spec/fixtures/projects/Klippfile-after-prepare
207
226
  - spec/fixtures/projects/Klippfile-ambiguous
@@ -232,12 +251,14 @@ test_files:
232
251
  - spec/fixtures/template-repository/Example/XXPROJECT_IDXX/main.m
233
252
  - spec/fixtures/template-repository/Example/XXPROJECT_IDXX/nl.lproj/Localizable.strings
234
253
  - spec/fixtures/template-repository/Example/XXPROJECT_IDXXTests/XXPROJECT_TITLEXXTests.m
254
+ - spec/fixtures/template-repository/FileRequirement/FileRequirement.klippspec
235
255
  - spec/fixtures/template-repository/Interactive/Interactive.klippspec
236
256
  - spec/fixtures/template-repository/Interactive/XXSUBJECT_UNDER_TESTXXTests.m
237
257
  - spec/klipp/configuration_spec.rb
238
258
  - spec/klipp/creator_spec.rb
239
259
  - spec/klipp_spec.rb
240
260
  - spec/spec_helper.rb
261
+ - spec/template/required_file_spec.rb
241
262
  - spec/template/spec_spec.rb
242
263
  - spec/template/token_spec.rb
243
264
  - spec/template_spec.rb