klipp 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
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