ore 0.1.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.
Files changed (107) hide show
  1. data/.document +4 -0
  2. data/.rspec +1 -0
  3. data/.yardopts +1 -0
  4. data/ChangeLog.md +31 -0
  5. data/GemspecYML.md +252 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +104 -0
  8. data/Rakefile +9 -0
  9. data/bin/mine +12 -0
  10. data/bin/ore +12 -0
  11. data/data/ore/templates/base/.document +3 -0
  12. data/data/ore/templates/base/.gitignore.erb +3 -0
  13. data/data/ore/templates/base/:name:.gemspec.erb +10 -0
  14. data/data/ore/templates/base/ChangeLog.md.erb +4 -0
  15. data/data/ore/templates/base/ChangeLog.rdoc.erb +4 -0
  16. data/data/ore/templates/base/ChangeLog.tt.erb +4 -0
  17. data/data/ore/templates/base/LICENSE.txt.erb +20 -0
  18. data/data/ore/templates/base/README.md.erb +42 -0
  19. data/data/ore/templates/base/README.rdoc.erb +38 -0
  20. data/data/ore/templates/base/README.tt.erb +44 -0
  21. data/data/ore/templates/base/Rakefile.erb +23 -0
  22. data/data/ore/templates/base/gemspec.yml.erb +23 -0
  23. data/data/ore/templates/base/lib/:namespace_dir:.rb.erb +1 -0
  24. data/data/ore/templates/base/lib/:namespace_dir:/version.rb.erb +8 -0
  25. data/data/ore/templates/bundler/Gemfile.erb +20 -0
  26. data/data/ore/templates/bundler/_dependencies.erb +1 -0
  27. data/data/ore/templates/jeweler_tasks/_dependencies.erb +3 -0
  28. data/data/ore/templates/jeweler_tasks/_tasks.erb +17 -0
  29. data/data/ore/templates/ore_tasks/_dependencies.erb +1 -0
  30. data/data/ore/templates/ore_tasks/_tasks.erb +12 -0
  31. data/data/ore/templates/rdoc/_tasks.erb +6 -0
  32. data/data/ore/templates/rspec/.rspec +1 -0
  33. data/data/ore/templates/rspec/_dependencies.erb +3 -0
  34. data/data/ore/templates/rspec/_tasks.erb +14 -0
  35. data/data/ore/templates/rspec/spec/:namespace_dir:_spec.rb.erb +8 -0
  36. data/data/ore/templates/rspec/spec/spec_helper.rb.erb +7 -0
  37. data/data/ore/templates/test_unit/test/helper.rb.erb +24 -0
  38. data/data/ore/templates/test_unit/test/test_:name:.rb.erb +5 -0
  39. data/data/ore/templates/yard/.yardopts.erb +1 -0
  40. data/data/ore/templates/yard/_dependencies.erb +1 -0
  41. data/data/ore/templates/yard/_gem.erb +1 -0
  42. data/data/ore/templates/yard/_tasks.erb +13 -0
  43. data/gemspec.yml +21 -0
  44. data/lib/ore.rb +3 -0
  45. data/lib/ore/checks.rb +85 -0
  46. data/lib/ore/cli.rb +120 -0
  47. data/lib/ore/config.rb +52 -0
  48. data/lib/ore/defaults.rb +137 -0
  49. data/lib/ore/dependency.rb +62 -0
  50. data/lib/ore/document_file.rb +118 -0
  51. data/lib/ore/exceptions.rb +3 -0
  52. data/lib/ore/exceptions/exception.rb +4 -0
  53. data/lib/ore/exceptions/invalid_metadata.rb +6 -0
  54. data/lib/ore/exceptions/project_not_found.rb +6 -0
  55. data/lib/ore/generator.rb +247 -0
  56. data/lib/ore/naming.rb +95 -0
  57. data/lib/ore/paths.rb +143 -0
  58. data/lib/ore/project.rb +568 -0
  59. data/lib/ore/settings.rb +236 -0
  60. data/lib/ore/specification.rb +29 -0
  61. data/lib/ore/template.rb +3 -0
  62. data/lib/ore/template/directory.rb +179 -0
  63. data/lib/ore/template/helpers.rb +144 -0
  64. data/lib/ore/template/interpolations.rb +31 -0
  65. data/lib/ore/versions.rb +3 -0
  66. data/lib/ore/versions/exceptions.rb +1 -0
  67. data/lib/ore/versions/exceptions/invalid_version.rb +8 -0
  68. data/lib/ore/versions/version.rb +75 -0
  69. data/lib/ore/versions/version_constant.rb +126 -0
  70. data/lib/ore/versions/version_file.rb +66 -0
  71. data/lib/rubygems_plugin.rb +40 -0
  72. data/ore.gemspec +6 -0
  73. data/spec/dependency_spec.rb +36 -0
  74. data/spec/document_file_spec.rb +29 -0
  75. data/spec/helpers/files.rb +7 -0
  76. data/spec/helpers/files/.document +5 -0
  77. data/spec/helpers/files/VERSION +1 -0
  78. data/spec/helpers/files/VERSION.yml +5 -0
  79. data/spec/helpers/projects.rb +13 -0
  80. data/spec/helpers/projects/dm-plugin/Gemfile +3 -0
  81. data/spec/helpers/projects/dm-plugin/VERSION +1 -0
  82. data/spec/helpers/projects/dm-plugin/dm-plugin.gemspec +10 -0
  83. data/spec/helpers/projects/dm-plugin/gemspec.yml +7 -0
  84. data/spec/helpers/projects/dm-plugin/lib/dm-plugin.rb +1 -0
  85. data/spec/helpers/projects/explicit/gemspec.yml +10 -0
  86. data/spec/helpers/projects/explicit/lib/explicit/version.rb +15 -0
  87. data/spec/helpers/projects/ffi-binding/gemspec.yml +7 -0
  88. data/spec/helpers/projects/ffi-binding/lib/ffi/binding/version.rb +5 -0
  89. data/spec/helpers/projects/jewelery/VERSION +1 -0
  90. data/spec/helpers/projects/jewelery/bin/jewelery +3 -0
  91. data/spec/helpers/projects/jewelery/gemspec.yml +4 -0
  92. data/spec/helpers/projects/jewelery/jewelery.gemspec +10 -0
  93. data/spec/helpers/projects/jewelery/lib/jewelery.rb +4 -0
  94. data/spec/helpers/projects/jewelery/lib/jewelery/rubies.rb +4 -0
  95. data/spec/helpers/projects/minimal/gemspec.yml +4 -0
  96. data/spec/helpers/projects/minimal/lib/minimal.rb +2 -0
  97. data/spec/naming_spec.rb +48 -0
  98. data/spec/projects/dm_plugin_project_spec.rb +29 -0
  99. data/spec/projects/explicit_project_spec.rb +33 -0
  100. data/spec/projects/ffi_binding_project_spec.rb +21 -0
  101. data/spec/projects/jeweler_project_spec.rb +17 -0
  102. data/spec/projects/minimal_project_spec.rb +17 -0
  103. data/spec/projects/project_examples.rb +34 -0
  104. data/spec/spec_helper.rb +4 -0
  105. data/spec/versions/version_file_spec.rb +28 -0
  106. data/spec/versions/version_spec.rb +53 -0
  107. metadata +226 -0
data/lib/ore/paths.rb ADDED
@@ -0,0 +1,143 @@
1
+ require 'ore/naming'
2
+
3
+ module Ore
4
+ module Paths
5
+ include Naming
6
+
7
+ #
8
+ # Builds a path relative to the project.
9
+ #
10
+ # @param [Array] names
11
+ # The directory names of the path.
12
+ #
13
+ # @return [Pathname]
14
+ # The new path.
15
+ #
16
+ def path(*names)
17
+ @root.join(*names)
18
+ end
19
+
20
+ #
21
+ # The `bin/` directory of the project.
22
+ #
23
+ # @return [Pathname]
24
+ # The path to the `bin/` directory.
25
+ #
26
+ def bin_dir
27
+ @root.join(@@lib_dir)
28
+ end
29
+
30
+ #
31
+ # The `lib/` directory of the project.
32
+ #
33
+ # @return [Pathname]
34
+ # The path to the `lib/` directory.
35
+ #
36
+ def lib_dir
37
+ @root.join(@@lib_dir)
38
+ end
39
+
40
+ #
41
+ # The `pkg/` directory of the project.
42
+ #
43
+ # @return [Pathname]
44
+ # The path to the `pkg/` directory.
45
+ #
46
+ def pkg_dir
47
+ @root.join(@@pkg_dir)
48
+ end
49
+
50
+ #
51
+ # Builds a path relative to the `lib/` directory.
52
+ #
53
+ # @param [Array] names
54
+ # The directory names of the path.
55
+ #
56
+ # @return [Pathname]
57
+ # The new path.
58
+ #
59
+ def lib_path(*names)
60
+ path(@@lib_dir,*names)
61
+ end
62
+
63
+ #
64
+ # Builds a relative path into the `pkg/` directory for the `.gem` file.
65
+ #
66
+ # @return [String]
67
+ # The path of a `.gem` file for the project.
68
+ #
69
+ def pkg_file
70
+ File.join(@@pkg_dir,"#{@name}-#{@version}.gem")
71
+ end
72
+
73
+ #
74
+ # Determines if a directory exists within the project.
75
+ #
76
+ # @param [String] path
77
+ # The path of the directory, relative to the project.
78
+ #
79
+ # @return [Boolean]
80
+ # Specifies whether the directory exists in the project.
81
+ #
82
+ def directory?(path)
83
+ @root.join(path).directory?
84
+ end
85
+
86
+ #
87
+ # Determines if a file exists within the project.
88
+ #
89
+ # @param [String] path
90
+ # The path of the file, relative to the project.
91
+ #
92
+ # @return [Boolean]
93
+ # Specifies whether the file exists in the project.
94
+ #
95
+ def file?(path)
96
+ @project_files.include?(path)
97
+ end
98
+
99
+ #
100
+ # Determines if a directory exists within the `lib/` directory of the
101
+ # project.
102
+ #
103
+ # @return [Boolean]
104
+ # Specifies that the directory exists within the `lib/` directory.
105
+ #
106
+ def lib_directory?(path)
107
+ directory?(File.join(@@lib_dir,path))
108
+ end
109
+
110
+ #
111
+ # Determines if a file exists within the `lib/` directory of the
112
+ # project.
113
+ #
114
+ # @return [Boolean]
115
+ # Specifies that the file exists within the `lib/` directory.
116
+ #
117
+ def lib_file?(path)
118
+ file?(File.join(@@lib_dir,path))
119
+ end
120
+
121
+ #
122
+ # Finds paths within the project that match a glob pattern.
123
+ #
124
+ # @param [String] pattern
125
+ # The glob pattern.
126
+ #
127
+ # @yield [path]
128
+ # The given block will be passed matching paths.
129
+ #
130
+ # @yieldparam [String] path
131
+ # A path relative to the root directory of the project.
132
+ #
133
+ def glob(pattern)
134
+ within do
135
+ Dir.glob(pattern) do |path|
136
+ if (@project_files.include?(path) || File.directory?(path))
137
+ yield path
138
+ end
139
+ end
140
+ end
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,568 @@
1
+ require 'ore/exceptions/project_not_found'
2
+ require 'ore/exceptions/invalid_metadata'
3
+ require 'ore/naming'
4
+ require 'ore/paths'
5
+ require 'ore/checks'
6
+ require 'ore/defaults'
7
+ require 'ore/settings'
8
+ require 'ore/document_file'
9
+
10
+ require 'pathname'
11
+ require 'yaml'
12
+ require 'find'
13
+ require 'fileutils'
14
+
15
+ module Ore
16
+ class Project
17
+
18
+ include Naming
19
+ include Paths
20
+ include Checks
21
+ include Defaults
22
+ include Settings
23
+
24
+ # The project metadata file
25
+ @@metadata_file = 'gemspec.yml'
26
+
27
+ # The SCM which the project is currently under
28
+ attr_reader :scm
29
+
30
+ # The files of the project
31
+ attr_reader :project_files
32
+
33
+ # The fully-qualified namespace of the project
34
+ attr_reader :namespace
35
+
36
+ # The infered namespace modules of the project
37
+ attr_reader :namespace_modules
38
+
39
+ # The directory contain the project code.
40
+ attr_reader :namespace_dir
41
+
42
+ # The name of the project
43
+ attr_reader :name
44
+
45
+ # The version of the project
46
+ attr_reader :version
47
+
48
+ # The project summary
49
+ attr_reader :summary
50
+
51
+ # The project description
52
+ attr_reader :description
53
+
54
+ # The licenses of the project
55
+ attr_reader :licenses
56
+
57
+ # The authors of the project
58
+ attr_reader :authors
59
+
60
+ # The homepage for the project
61
+ attr_reader :homepage
62
+
63
+ # The email contact for the project
64
+ attr_reader :email
65
+
66
+ # The build date for any project gems
67
+ attr_reader :date
68
+
69
+ # The parsed `.document` file
70
+ attr_reader :document
71
+
72
+ # The directories to search within the project when requiring files
73
+ attr_reader :require_paths
74
+
75
+ # The names of the executable scripts
76
+ attr_reader :executables
77
+
78
+ # The default executable
79
+ attr_reader :default_executable
80
+
81
+ # The documentation of the project
82
+ attr_reader :documentation
83
+
84
+ # Any extra files to include in the project documentation
85
+ attr_reader :extra_doc_files
86
+
87
+ # The files of the project
88
+ attr_reader :files
89
+
90
+ # The test files for the project
91
+ attr_reader :test_files
92
+
93
+ # The version of Ruby required by the project
94
+ attr_reader :required_ruby_version
95
+
96
+ # The version of RubyGems required by the project
97
+ attr_reader :required_rubygems_version
98
+
99
+ # The dependencies of the project
100
+ attr_reader :dependencies
101
+
102
+ # The runtime-dependencies of the project
103
+ attr_reader :runtime_dependencies
104
+
105
+ # The development-dependencies of the project
106
+ attr_reader :development_dependencies
107
+
108
+ #
109
+ # Creates a new {Project}.
110
+ #
111
+ # @param [String] root
112
+ # The root directory of the project.
113
+ #
114
+ def initialize(root)
115
+ @root = Pathname.new(root).expand_path
116
+
117
+ unless @root.directory?
118
+ raise(ProjectNotFound,"#{@root} is not a directory")
119
+ end
120
+
121
+ infer_scm!
122
+ infer_project_files!
123
+
124
+ metadata_file = @root.join(@@metadata_file)
125
+
126
+ unless metadata_file.file?
127
+ raise(ProjectNotFound,"#{@root} does not contain #{@@metadata_file}")
128
+ end
129
+
130
+ metadata = YAML.load_file(metadata_file)
131
+
132
+ unless metadata.kind_of?(Hash)
133
+ raise(InvalidMetadata,"#{metadata_file} did not contain valid metadata")
134
+ end
135
+
136
+ if metadata['name']
137
+ @name = metadata['name'].to_s
138
+ else
139
+ default_name!
140
+ end
141
+
142
+ # infer the namespace from the project name
143
+ infer_namespace!
144
+
145
+ if metadata['version']
146
+ set_version! metadata['version']
147
+ else
148
+ default_version!
149
+ end
150
+
151
+ @summary = (metadata['summary'] || metadata['description'])
152
+ @description = (metadata['description'] || metadata['summary'])
153
+
154
+ @licenses = []
155
+
156
+ if metadata['license']
157
+ set_license!(metadata['license'])
158
+ end
159
+
160
+ @authors = []
161
+
162
+ if metadata['authors']
163
+ set_authors! metadata['authors']
164
+ end
165
+
166
+ @homepage = metadata['homepage']
167
+ @email = metadata['email']
168
+
169
+ if metadata['date']
170
+ set_date! metadata['date']
171
+ else
172
+ default_date!
173
+ end
174
+
175
+ @document = DocumentFile.find(self)
176
+
177
+ @require_paths = []
178
+
179
+ if metadata['require_paths']
180
+ set_require_paths! metadata['require_paths']
181
+ else
182
+ default_require_paths!
183
+ end
184
+
185
+ @executables = []
186
+
187
+ if metadata['executables']
188
+ set_executables! metadata['executables']
189
+ else
190
+ default_executables!
191
+ end
192
+
193
+ @default_executable = nil
194
+
195
+ if metadata['default_executable']
196
+ set_default_executable! metadata['default_executable']
197
+ else
198
+ default_executable!
199
+ end
200
+
201
+ if metadata['has_yard']
202
+ @documentation = :yard
203
+ elsif metadata.has_key?('has_rdoc')
204
+ @documentation = if metadata['has_rdoc']
205
+ :rdoc
206
+ end
207
+ else
208
+ default_documentation!
209
+ end
210
+
211
+ @extra_doc_files = []
212
+
213
+ if metadata['extra_doc_files']
214
+ set_extra_doc_files! metadata['extra_doc_files']
215
+ else
216
+ default_extra_doc_files!
217
+ end
218
+
219
+ @files = []
220
+
221
+ if metadata['files']
222
+ set_files! metadata['files']
223
+ else
224
+ default_files!
225
+ end
226
+
227
+ @test_files = []
228
+
229
+ if metadata['test_files']
230
+ set_test_files! metadata['test_files']
231
+ else
232
+ default_test_files!
233
+ end
234
+
235
+ if metadata['required_ruby_version']
236
+ set_required_ruby_version! metadata['required_ruby_version']
237
+ end
238
+
239
+ if metadata['required_rubygems_version']
240
+ set_required_rubygems_version! metadata['required_rubygems_version']
241
+ else
242
+ default_required_rubygems_version!
243
+ end
244
+
245
+ @dependencies = []
246
+
247
+ if metadata['dependencies']
248
+ set_dependencies! metadata['dependencies']
249
+ end
250
+
251
+ @runtime_dependencies = []
252
+
253
+ if metadata['runtime_dependencies']
254
+ set_runtime_dependencies! metadata['runtime_dependencies']
255
+ end
256
+
257
+ @development_dependencies = []
258
+
259
+ if metadata['development_dependencies']
260
+ set_development_dependencies! metadata['development_dependencies']
261
+ end
262
+ end
263
+
264
+ #
265
+ # Finds the project metadata file and creates a new {Project} object.
266
+ #
267
+ # @param [String] dir (Dir.pwd)
268
+ # The directory to start searching upward from.
269
+ #
270
+ # @return [Project]
271
+ # The found project.
272
+ #
273
+ # @raise [ProjectNotFound]
274
+ # No project metadata file could be found.
275
+ #
276
+ def self.find(dir=Dir.pwd)
277
+ Pathname.new(dir).ascend do |root|
278
+ return self.new(root) if root.join(@@metadata_file).file?
279
+ end
280
+
281
+ raise(ProjectNotFound,"could not find #{@@metadata_file}")
282
+ end
283
+
284
+ #
285
+ # Executes code within the project.
286
+ #
287
+ # @param [String] sub_dir
288
+ # An optional sub-directory within the project to execute from.
289
+ #
290
+ # @yield []
291
+ # The given block will be called once the current working-directory
292
+ # has been switched. Once the block finishes executing, the current
293
+ # working-directory will be switched back.
294
+ #
295
+ # @see http://ruby-doc.org/core/classes/Dir.html#M002314
296
+ #
297
+ def within(sub_dir=nil,&block)
298
+ dir = if sub_dir
299
+ @root.join(sub_dir)
300
+ else
301
+ @root
302
+ end
303
+
304
+ Dir.chdir(dir,&block)
305
+ end
306
+
307
+ #
308
+ # The primary license of the project.
309
+ #
310
+ # @return [String, nil]
311
+ # The primary license for the project.
312
+ #
313
+ def license
314
+ @licenses.first
315
+ end
316
+
317
+ #
318
+ # Determines whether the project uses Bundler.
319
+ #
320
+ # @return [Boolean]
321
+ # Specifies whether the project uses Bundler.
322
+ #
323
+ def bundler?
324
+ file?('Gemfile')
325
+ end
326
+
327
+ #
328
+ # Determines whether the project has been bundled using Bundler.
329
+ #
330
+ # @return [Boolean]
331
+ # Specifies whether the project has been bundled.
332
+ #
333
+ def bundled?
334
+ file?('Gemfile.lock')
335
+ end
336
+
337
+ #
338
+ # Determines if the project contains RDoc documentation.
339
+ #
340
+ # @return [Boolean]
341
+ # Specifies whether the project has RDoc documentation.
342
+ #
343
+ def has_rdoc
344
+ @documentation == :rdoc
345
+ end
346
+
347
+ #
348
+ # Determines if the project contains YARD documentation.
349
+ #
350
+ # @return [Boolean]
351
+ # Specifies whether the project has YARD documentation.
352
+ #
353
+ def has_yard
354
+ @documentation == :yard
355
+ end
356
+
357
+ #
358
+ # Populates a Gem Specification using the metadata of the project.
359
+ #
360
+ # @yield [gemspec]
361
+ # The given block will be passed the populated Gem Specification
362
+ # object.
363
+ #
364
+ # @yieldparam [Gem::Specification] gemspec
365
+ # The newly created Gem Specification.
366
+ #
367
+ # @return [Gem::Specification]
368
+ # The Gem Specification.
369
+ #
370
+ # @see http://rubygems.rubyforge.org/rdoc/Gem/Specification.html
371
+ #
372
+ def to_gemspec
373
+ Gem::Specification.new do |gemspec|
374
+ gemspec.name = @name.to_s
375
+ gemspec.version = @version.to_s
376
+ gemspec.summary = @summary.to_s
377
+ gemspec.description = @description.to_s
378
+ gemspec.licenses = @licenses
379
+ gemspec.authors = @authors
380
+ gemspec.homepage = @homepage
381
+ gemspec.email = @email
382
+ gemspec.date = @date
383
+
384
+ @require_paths.each do |path|
385
+ unless gemspec.require_paths.include?(path)
386
+ gemspec.require_paths << path
387
+ end
388
+ end
389
+
390
+ gemspec.executables = @executables
391
+ gemspec.default_executable = @default_executable
392
+
393
+ gemspec.has_rdoc = if has_yard
394
+ 'yard'
395
+ elsif has_rdoc
396
+ true
397
+ end
398
+
399
+ gemspec.extra_rdoc_files = @extra_doc_files
400
+ gemspec.files = @files
401
+ gemspec.test_files = @test_files
402
+
403
+ if gemspec.respond_to?(:required_ruby_version=)
404
+ gemspec.required_ruby_version = @required_ruby_version
405
+ end
406
+
407
+ if gemspec.respond_to?(:required_rubygems_version=)
408
+ gemspec.required_rubygems_version = @required_rubygems_version
409
+ end
410
+
411
+ @dependencies.each do |dep|
412
+ gemspec.add_dependency(dep.name,*dep.versions)
413
+ end
414
+
415
+ if gemspec.respond_to?(:add_runtime_dependency)
416
+ @runtime_dependencies.each do |dep|
417
+ gemspec.add_runtime_dependency(dep.name,*dep.versions)
418
+ end
419
+ else
420
+ @runtime_dependencies.each do |dep|
421
+ gemspec.add_dependency(dep.name,*dep.versions)
422
+ end
423
+ end
424
+
425
+ if gemspec.respond_to?(:add_development_dependency)
426
+ @development_dependencies.each do |dep|
427
+ gemspec.add_development_dependency(dep.name,*dep.versions)
428
+ end
429
+ else
430
+ @development_dependencies.each do |dep|
431
+ gemspec.add_dependency(dep.name,*dep.versions)
432
+ end
433
+ end
434
+
435
+ yield gemspec if block_given?
436
+ end
437
+ end
438
+
439
+ #
440
+ # Builds a gem for the project.
441
+ #
442
+ # @return [Pathname]
443
+ # The path to the built gem file within the `pkg/` directory.
444
+ #
445
+ def build!
446
+ pkg_dir = @root.join(@@pkg_dir)
447
+ FileUtils.mkdir_p(pkg_dir)
448
+
449
+ gem_file = Gem::Builder.new(self.to_gemspec).build
450
+ pkg_path = @root.join(pkg_file)
451
+
452
+ FileUtils.mv(gem_file,pkg_path)
453
+ return pkg_path
454
+ end
455
+
456
+ protected
457
+
458
+ #
459
+ # Prints multiple warning messages.
460
+ #
461
+ # @param [Array] messages
462
+ # The messages to print.
463
+ #
464
+ def warn(*messages)
465
+ messages.each { |mesg| STDERR.puts("WARNING: #{mesg}") }
466
+ end
467
+
468
+ #
469
+ # Infers the Source Code Management used by the project.
470
+ #
471
+ def infer_scm!
472
+ if @root.join('.git').directory?
473
+ @scm = :git
474
+ else
475
+ @scm = nil
476
+ end
477
+ end
478
+
479
+ #
480
+ # Infers the project files.
481
+ #
482
+ def infer_project_files!
483
+ @project_files = Set[]
484
+
485
+ filter_path = lambda { |path|
486
+ check_readable(path) { |file| @project_files << file }
487
+ }
488
+
489
+ within do
490
+ case @scm
491
+ when :git
492
+ `git ls-files -z`.split("\0").each(&filter_path)
493
+ else
494
+ within { Dir.glob('{**/}*',&filter_path) }
495
+ end
496
+ end
497
+ end
498
+
499
+ #
500
+ # Infers the namespace of the project based on the project name.
501
+ #
502
+ def infer_namespace!
503
+ @namespace_modules = modules_of(@name)
504
+ @namespace = namespace_of(@name)
505
+
506
+ dir = namespace_path_of(@name)
507
+
508
+ @namespace_dir = if lib_directory?(dir)
509
+ dir
510
+ elsif lib_directory?(@name)
511
+ @name
512
+ end
513
+ end
514
+
515
+ #
516
+ # Adds a require-path to the project.
517
+ #
518
+ # @param [String] path
519
+ # A directory path relative to the project.
520
+ #
521
+ def add_require_path(path)
522
+ check_directory(path) { |dir| @require_paths << dir }
523
+ end
524
+
525
+ #
526
+ # Adds an executable to the project.
527
+ #
528
+ # @param [String] name
529
+ # The name of the executable.
530
+ #
531
+ def add_executable(name)
532
+ path = File.join(@@bin_dir,name)
533
+
534
+ check_executable(path) { |exe| @executables << exe }
535
+ end
536
+
537
+ #
538
+ # Adds an extra documentation file to the project.
539
+ #
540
+ # @param [String] path
541
+ # The path to the file, relative to the project.
542
+ #
543
+ def add_extra_doc_file(path)
544
+ check_file(path) { |file| @extra_doc_files << file }
545
+ end
546
+
547
+ #
548
+ # Adds a file to the project.
549
+ #
550
+ # @param [String] path
551
+ # The path to the file, relative to the project.
552
+ #
553
+ def add_file(path)
554
+ check_file(path) { |file| @files << file }
555
+ end
556
+
557
+ #
558
+ # Adds a testing-file to the project.
559
+ #
560
+ # @param [String] path
561
+ # The path to the testing-file, relative to the project.
562
+ #
563
+ def add_test_file(path)
564
+ check_file(path) { |file| @test_files << file }
565
+ end
566
+
567
+ end
568
+ end