ore 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +4 -0
- data/.rspec +1 -0
- data/.yardopts +1 -0
- data/ChangeLog.md +31 -0
- data/GemspecYML.md +252 -0
- data/LICENSE.txt +21 -0
- data/README.md +104 -0
- data/Rakefile +9 -0
- data/bin/mine +12 -0
- data/bin/ore +12 -0
- data/data/ore/templates/base/.document +3 -0
- data/data/ore/templates/base/.gitignore.erb +3 -0
- data/data/ore/templates/base/:name:.gemspec.erb +10 -0
- data/data/ore/templates/base/ChangeLog.md.erb +4 -0
- data/data/ore/templates/base/ChangeLog.rdoc.erb +4 -0
- data/data/ore/templates/base/ChangeLog.tt.erb +4 -0
- data/data/ore/templates/base/LICENSE.txt.erb +20 -0
- data/data/ore/templates/base/README.md.erb +42 -0
- data/data/ore/templates/base/README.rdoc.erb +38 -0
- data/data/ore/templates/base/README.tt.erb +44 -0
- data/data/ore/templates/base/Rakefile.erb +23 -0
- data/data/ore/templates/base/gemspec.yml.erb +23 -0
- data/data/ore/templates/base/lib/:namespace_dir:.rb.erb +1 -0
- data/data/ore/templates/base/lib/:namespace_dir:/version.rb.erb +8 -0
- data/data/ore/templates/bundler/Gemfile.erb +20 -0
- data/data/ore/templates/bundler/_dependencies.erb +1 -0
- data/data/ore/templates/jeweler_tasks/_dependencies.erb +3 -0
- data/data/ore/templates/jeweler_tasks/_tasks.erb +17 -0
- data/data/ore/templates/ore_tasks/_dependencies.erb +1 -0
- data/data/ore/templates/ore_tasks/_tasks.erb +12 -0
- data/data/ore/templates/rdoc/_tasks.erb +6 -0
- data/data/ore/templates/rspec/.rspec +1 -0
- data/data/ore/templates/rspec/_dependencies.erb +3 -0
- data/data/ore/templates/rspec/_tasks.erb +14 -0
- data/data/ore/templates/rspec/spec/:namespace_dir:_spec.rb.erb +8 -0
- data/data/ore/templates/rspec/spec/spec_helper.rb.erb +7 -0
- data/data/ore/templates/test_unit/test/helper.rb.erb +24 -0
- data/data/ore/templates/test_unit/test/test_:name:.rb.erb +5 -0
- data/data/ore/templates/yard/.yardopts.erb +1 -0
- data/data/ore/templates/yard/_dependencies.erb +1 -0
- data/data/ore/templates/yard/_gem.erb +1 -0
- data/data/ore/templates/yard/_tasks.erb +13 -0
- data/gemspec.yml +21 -0
- data/lib/ore.rb +3 -0
- data/lib/ore/checks.rb +85 -0
- data/lib/ore/cli.rb +120 -0
- data/lib/ore/config.rb +52 -0
- data/lib/ore/defaults.rb +137 -0
- data/lib/ore/dependency.rb +62 -0
- data/lib/ore/document_file.rb +118 -0
- data/lib/ore/exceptions.rb +3 -0
- data/lib/ore/exceptions/exception.rb +4 -0
- data/lib/ore/exceptions/invalid_metadata.rb +6 -0
- data/lib/ore/exceptions/project_not_found.rb +6 -0
- data/lib/ore/generator.rb +247 -0
- data/lib/ore/naming.rb +95 -0
- data/lib/ore/paths.rb +143 -0
- data/lib/ore/project.rb +568 -0
- data/lib/ore/settings.rb +236 -0
- data/lib/ore/specification.rb +29 -0
- data/lib/ore/template.rb +3 -0
- data/lib/ore/template/directory.rb +179 -0
- data/lib/ore/template/helpers.rb +144 -0
- data/lib/ore/template/interpolations.rb +31 -0
- data/lib/ore/versions.rb +3 -0
- data/lib/ore/versions/exceptions.rb +1 -0
- data/lib/ore/versions/exceptions/invalid_version.rb +8 -0
- data/lib/ore/versions/version.rb +75 -0
- data/lib/ore/versions/version_constant.rb +126 -0
- data/lib/ore/versions/version_file.rb +66 -0
- data/lib/rubygems_plugin.rb +40 -0
- data/ore.gemspec +6 -0
- data/spec/dependency_spec.rb +36 -0
- data/spec/document_file_spec.rb +29 -0
- data/spec/helpers/files.rb +7 -0
- data/spec/helpers/files/.document +5 -0
- data/spec/helpers/files/VERSION +1 -0
- data/spec/helpers/files/VERSION.yml +5 -0
- data/spec/helpers/projects.rb +13 -0
- data/spec/helpers/projects/dm-plugin/Gemfile +3 -0
- data/spec/helpers/projects/dm-plugin/VERSION +1 -0
- data/spec/helpers/projects/dm-plugin/dm-plugin.gemspec +10 -0
- data/spec/helpers/projects/dm-plugin/gemspec.yml +7 -0
- data/spec/helpers/projects/dm-plugin/lib/dm-plugin.rb +1 -0
- data/spec/helpers/projects/explicit/gemspec.yml +10 -0
- data/spec/helpers/projects/explicit/lib/explicit/version.rb +15 -0
- data/spec/helpers/projects/ffi-binding/gemspec.yml +7 -0
- data/spec/helpers/projects/ffi-binding/lib/ffi/binding/version.rb +5 -0
- data/spec/helpers/projects/jewelery/VERSION +1 -0
- data/spec/helpers/projects/jewelery/bin/jewelery +3 -0
- data/spec/helpers/projects/jewelery/gemspec.yml +4 -0
- data/spec/helpers/projects/jewelery/jewelery.gemspec +10 -0
- data/spec/helpers/projects/jewelery/lib/jewelery.rb +4 -0
- data/spec/helpers/projects/jewelery/lib/jewelery/rubies.rb +4 -0
- data/spec/helpers/projects/minimal/gemspec.yml +4 -0
- data/spec/helpers/projects/minimal/lib/minimal.rb +2 -0
- data/spec/naming_spec.rb +48 -0
- data/spec/projects/dm_plugin_project_spec.rb +29 -0
- data/spec/projects/explicit_project_spec.rb +33 -0
- data/spec/projects/ffi_binding_project_spec.rb +21 -0
- data/spec/projects/jeweler_project_spec.rb +17 -0
- data/spec/projects/minimal_project_spec.rb +17 -0
- data/spec/projects/project_examples.rb +34 -0
- data/spec/spec_helper.rb +4 -0
- data/spec/versions/version_file_spec.rb +28 -0
- data/spec/versions/version_spec.rb +53 -0
- metadata +226 -0
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'set'
|
2
|
+
|
3
|
+
module Ore
|
4
|
+
#
|
5
|
+
# Parses the contents of a `.document`.
|
6
|
+
#
|
7
|
+
class DocumentFile
|
8
|
+
|
9
|
+
# The path to the `.document` file.
|
10
|
+
attr_reader :path
|
11
|
+
|
12
|
+
# The glob-patterns to find all code-files.
|
13
|
+
attr_reader :file_globs
|
14
|
+
|
15
|
+
# The glob-patterns to find all extra-files.
|
16
|
+
attr_reader :extra_file_globs
|
17
|
+
|
18
|
+
#
|
19
|
+
# Creates a new {DocumentFile}.
|
20
|
+
#
|
21
|
+
# @param [String] path
|
22
|
+
# The path of the `.document` file.
|
23
|
+
#
|
24
|
+
def initialize(path)
|
25
|
+
@path = File.expand_path(path)
|
26
|
+
|
27
|
+
@file_globs = Set[]
|
28
|
+
@extra_file_globs = Set[]
|
29
|
+
|
30
|
+
parse!
|
31
|
+
end
|
32
|
+
|
33
|
+
@@file = '.document'
|
34
|
+
|
35
|
+
#
|
36
|
+
# Finds the document file in a project.
|
37
|
+
#
|
38
|
+
# @param [Project] project
|
39
|
+
# The project to search within.
|
40
|
+
#
|
41
|
+
# @return [DocumentFile, nil]
|
42
|
+
# The found document file.
|
43
|
+
#
|
44
|
+
def self.find(project)
|
45
|
+
self.new(project.path(@@file)) if project.file?(@@file)
|
46
|
+
end
|
47
|
+
|
48
|
+
#
|
49
|
+
# All files described in the `.document` file.
|
50
|
+
#
|
51
|
+
# @yield [path]
|
52
|
+
# The given block will be passed every path that matches the file
|
53
|
+
# globs in the `.document` file.
|
54
|
+
#
|
55
|
+
# @yieldparam [String] path
|
56
|
+
# A match that matches the `.document` file patterns.
|
57
|
+
#
|
58
|
+
# @return [Enumerator]
|
59
|
+
# If no block was given, an enumerator object will be returned.
|
60
|
+
#
|
61
|
+
def each_file(&block)
|
62
|
+
return enum_for(:each_file) unless block
|
63
|
+
|
64
|
+
@file_globs.each do |pattern|
|
65
|
+
Dir.glob(pattern,&block)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
#
|
70
|
+
# All extra-files described in the `.document` file.
|
71
|
+
#
|
72
|
+
# @yield [path]
|
73
|
+
# The given block will be passed every path that matches the
|
74
|
+
# extra-file globs in the `.document` file.
|
75
|
+
#
|
76
|
+
# @yieldparam [String] path
|
77
|
+
# A match that matches the `.document` extra-file patterns.
|
78
|
+
#
|
79
|
+
# @return [Enumerator]
|
80
|
+
# If no block was given, an enumerator object will be returned.
|
81
|
+
#
|
82
|
+
def each_extra_file(&block)
|
83
|
+
return enum_for(:each_extra_file) unless block
|
84
|
+
|
85
|
+
@extra_file_globs.each do |pattern|
|
86
|
+
Dir.glob(pattern,&block)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
protected
|
91
|
+
|
92
|
+
#
|
93
|
+
# Parses the contents of a `.document` file.
|
94
|
+
#
|
95
|
+
def parse!
|
96
|
+
separator = false
|
97
|
+
|
98
|
+
File.open(@path) do |file|
|
99
|
+
file.each_line do |line|
|
100
|
+
line = line.chomp.strip
|
101
|
+
|
102
|
+
next if line.empty?
|
103
|
+
|
104
|
+
unless separator
|
105
|
+
if line == '-'
|
106
|
+
separator = true
|
107
|
+
else
|
108
|
+
@file_globs << line
|
109
|
+
end
|
110
|
+
else
|
111
|
+
@extra_file_globs << line
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,247 @@
|
|
1
|
+
require 'ore/template/directory'
|
2
|
+
require 'ore/template/interpolations'
|
3
|
+
require 'ore/template/helpers'
|
4
|
+
require 'ore/naming'
|
5
|
+
require 'ore/config'
|
6
|
+
|
7
|
+
require 'thor/group'
|
8
|
+
require 'date'
|
9
|
+
require 'set'
|
10
|
+
|
11
|
+
module Ore
|
12
|
+
class Generator < Thor::Group
|
13
|
+
|
14
|
+
include Thor::Actions
|
15
|
+
include Naming
|
16
|
+
include Template::Interpolations
|
17
|
+
include Template::Helpers
|
18
|
+
|
19
|
+
# The base template for all RubyGems
|
20
|
+
@@base_template = :base
|
21
|
+
|
22
|
+
#
|
23
|
+
# The templates registered with the generator.
|
24
|
+
#
|
25
|
+
def Generator.templates
|
26
|
+
@templates ||= {}
|
27
|
+
end
|
28
|
+
|
29
|
+
#
|
30
|
+
# Registers a template with the generator.
|
31
|
+
#
|
32
|
+
# @param [String] path
|
33
|
+
# The path to the template.
|
34
|
+
#
|
35
|
+
# @raise [StandardError]
|
36
|
+
# The given path was not a directory.
|
37
|
+
#
|
38
|
+
def Generator.register_template(path)
|
39
|
+
unless File.directory?(path)
|
40
|
+
raise(StandardError,"#{path.dump} is must be a directory")
|
41
|
+
end
|
42
|
+
|
43
|
+
name = File.basename(path).to_sym
|
44
|
+
Generator.templates[name] = path
|
45
|
+
end
|
46
|
+
|
47
|
+
Config.builtin_templates { |path| Generator.register_template(path) }
|
48
|
+
Config.installed_templates { |path| Generator.register_template(path) }
|
49
|
+
|
50
|
+
namespace ''
|
51
|
+
|
52
|
+
class_option :markdown, :type => :boolean, :default => false
|
53
|
+
class_option :textile, :type => :boolean, :default => false
|
54
|
+
class_option :templates, :type => :array,
|
55
|
+
:default => [],
|
56
|
+
:aliases => '-T'
|
57
|
+
class_option :name, :type => :string, :aliases => '-n'
|
58
|
+
class_option :version, :type => :string,
|
59
|
+
:default => '0.1.0',
|
60
|
+
:aliases => '-V'
|
61
|
+
class_option :summary, :default => 'TODO: Summary',
|
62
|
+
:aliases => '-s'
|
63
|
+
class_option :description, :default => 'TODO: Description',
|
64
|
+
:aliases => '-D'
|
65
|
+
class_option :license, :default => 'MIT', :aliases => '-L'
|
66
|
+
class_option :homepage, :type => :string, :aliases => '-U'
|
67
|
+
class_option :email, :type => :string, :aliases => '-e'
|
68
|
+
class_option :authors, :type => :array,
|
69
|
+
:default => [ENV['USER']], :aliases => '-a'
|
70
|
+
class_option :rdoc, :type => :boolean, :default => true
|
71
|
+
class_option :yard, :type => :boolean, :default => false
|
72
|
+
class_option :test_unit, :type => :boolean, :default => false
|
73
|
+
class_option :rspec, :type => :boolean, :default => true
|
74
|
+
class_option :bundler, :type => :boolean, :default => false
|
75
|
+
class_option :jeweler_tasks, :type => :boolean, :default => false
|
76
|
+
class_option :ore_tasks, :type => :boolean, :default => false
|
77
|
+
class_option :git, :type => :boolean, :default => true
|
78
|
+
argument :path, :required => true
|
79
|
+
|
80
|
+
def generate
|
81
|
+
self.destination_root = path
|
82
|
+
|
83
|
+
enable_templates!
|
84
|
+
load_templates!
|
85
|
+
initialize_variables!
|
86
|
+
|
87
|
+
say "Generating #{self.destination_root}", :green
|
88
|
+
|
89
|
+
generate_directories!
|
90
|
+
generate_files!
|
91
|
+
|
92
|
+
if options.git?
|
93
|
+
in_root do
|
94
|
+
unless File.directory?('.git')
|
95
|
+
run 'git init'
|
96
|
+
run 'git add .'
|
97
|
+
run 'git commit -m "Initial commit."'
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
protected
|
104
|
+
|
105
|
+
#
|
106
|
+
# Enables templates.
|
107
|
+
#
|
108
|
+
def enable_templates!
|
109
|
+
@enabled_templates = [@@base_template]
|
110
|
+
|
111
|
+
@enabled_templates << :bundler if options.bundler?
|
112
|
+
@enabled_templates << :jeweler_tasks if options.jeweler_tasks?
|
113
|
+
@enabled_templates << :ore_tasks if options.ore_tasks?
|
114
|
+
|
115
|
+
if options.rspec?
|
116
|
+
@enabled_templates << :rspec
|
117
|
+
elsif options.test_unit?
|
118
|
+
@enabled_templates << :test_unit
|
119
|
+
end
|
120
|
+
|
121
|
+
if options.yard?
|
122
|
+
@enabled_templates << :yard
|
123
|
+
elsif options.rdoc?
|
124
|
+
@enabled_templates << :rdoc
|
125
|
+
end
|
126
|
+
|
127
|
+
options.templates.each do |name|
|
128
|
+
name = name.to_sym
|
129
|
+
|
130
|
+
unless @enabled_templates.include?(name)
|
131
|
+
@enabled_templates << name
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
#
|
137
|
+
# Loads the given templates.
|
138
|
+
#
|
139
|
+
def load_templates!
|
140
|
+
@templates = []
|
141
|
+
|
142
|
+
@enabled_templates.each do |name|
|
143
|
+
unless (template_dir = Generator.templates[name])
|
144
|
+
say "Unknown template #{name.dump}", :red
|
145
|
+
exit -1
|
146
|
+
end
|
147
|
+
|
148
|
+
self.source_paths << template_dir
|
149
|
+
@templates << Template::Directory.new(template_dir)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
#
|
154
|
+
# Initializes variables for the templates.
|
155
|
+
#
|
156
|
+
def initialize_variables!
|
157
|
+
@ore_version = '0.1.0'
|
158
|
+
|
159
|
+
@project_dir = File.basename(destination_root)
|
160
|
+
@name = (options.name || @project_dir)
|
161
|
+
|
162
|
+
@modules = modules_of(@name)
|
163
|
+
@module_depth = @modules.length
|
164
|
+
@module = @modules.last
|
165
|
+
|
166
|
+
@namespace = namespace_of(@name)
|
167
|
+
@namespace_dirs = namespace_dirs_of(@name)
|
168
|
+
@namespace_dir = namespace_path_of(@name)
|
169
|
+
|
170
|
+
@version = options.version
|
171
|
+
@summary = options.summary
|
172
|
+
@description = options.description
|
173
|
+
@license = options.license
|
174
|
+
@email = options.email
|
175
|
+
@safe_email = @email.sub('@',' at ') if @email
|
176
|
+
@homepage = (options.homepage || "http://rubygems.org/gems/#{@name}")
|
177
|
+
@authors = options.authors
|
178
|
+
@author = options.authors.first
|
179
|
+
|
180
|
+
@markup = if options.yard?
|
181
|
+
if options.markdown?
|
182
|
+
:markdown
|
183
|
+
elsif options.textile?
|
184
|
+
:textile
|
185
|
+
else
|
186
|
+
:rdoc
|
187
|
+
end
|
188
|
+
else
|
189
|
+
:rdoc
|
190
|
+
end
|
191
|
+
|
192
|
+
@date = Date.today
|
193
|
+
@year = @date.year
|
194
|
+
@month = @date.month
|
195
|
+
@day = @date.day
|
196
|
+
end
|
197
|
+
|
198
|
+
#
|
199
|
+
# Creates directories listed in the template directories.
|
200
|
+
#
|
201
|
+
def generate_directories!
|
202
|
+
generated = Set[]
|
203
|
+
|
204
|
+
@templates.each do |template|
|
205
|
+
template.each_directory do |dir|
|
206
|
+
unless generated.include?(dir)
|
207
|
+
path = interpolate(dir)
|
208
|
+
empty_directory path
|
209
|
+
|
210
|
+
generated << dir
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
#
|
217
|
+
# Copies static files and renders templates in the template directories.
|
218
|
+
#
|
219
|
+
def generate_files!
|
220
|
+
generated = Set[]
|
221
|
+
|
222
|
+
@templates.reverse_each do |template|
|
223
|
+
template.each_file(@markup) do |dest,file|
|
224
|
+
unless generated.include?(dest)
|
225
|
+
path = interpolate(dest)
|
226
|
+
copy_file file, path
|
227
|
+
|
228
|
+
generated << dest
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
template.each_template(@markup) do |dest,file|
|
233
|
+
unless generated.include?(dest)
|
234
|
+
path = interpolate(dest)
|
235
|
+
|
236
|
+
@current_template_dir = File.dirname(dest)
|
237
|
+
template file, path
|
238
|
+
@current_template_dir = nil
|
239
|
+
|
240
|
+
generated << dest
|
241
|
+
end
|
242
|
+
end
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
end
|
247
|
+
end
|
data/lib/ore/naming.rb
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
module Ore
|
2
|
+
#
|
3
|
+
# Provides methods for guessing the namespaces and directories
|
4
|
+
# of projects. {Naming} uses the naming conventions of project names
|
5
|
+
# defined by the
|
6
|
+
# [Ruby Packaging Standard (RPS)](http://chneukirchen.github.com/rps/).
|
7
|
+
#
|
8
|
+
module Naming
|
9
|
+
# The directory which contains executables for a project
|
10
|
+
@@bin_dir = 'bin'
|
11
|
+
|
12
|
+
# The directory which contains the code for a project
|
13
|
+
@@lib_dir = 'lib'
|
14
|
+
|
15
|
+
# The directory which contains C extension code for a project
|
16
|
+
@@ext_dir = 'ext'
|
17
|
+
|
18
|
+
# The directory which contains data files for a project
|
19
|
+
@@data_dir = 'data'
|
20
|
+
|
21
|
+
# The directory which contains unit-tests for a project
|
22
|
+
@@test_dir = 'test'
|
23
|
+
|
24
|
+
# The directory which contains spec-tests for a project
|
25
|
+
@@spec_dir = 'spec'
|
26
|
+
|
27
|
+
# The directory which contains built packages
|
28
|
+
@@pkg_dir = 'pkg'
|
29
|
+
|
30
|
+
# Common project prefixes and namespaces
|
31
|
+
@@common_namespaces = {
|
32
|
+
'ffi' => 'FFI',
|
33
|
+
'dm' => 'DataMapper'
|
34
|
+
}
|
35
|
+
|
36
|
+
#
|
37
|
+
# Guesses the module names from a project name.
|
38
|
+
#
|
39
|
+
# @return [Array<String>]
|
40
|
+
# The module names for a project.
|
41
|
+
#
|
42
|
+
def modules_of(name)
|
43
|
+
name.split('-').map do |words|
|
44
|
+
words.split('_').map { |word|
|
45
|
+
@@common_namespaces[word] || word.capitalize
|
46
|
+
}.join
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
#
|
51
|
+
# Guesses the full namespace for a project.
|
52
|
+
#
|
53
|
+
# @return [String]
|
54
|
+
# The full module namespace for a project.
|
55
|
+
#
|
56
|
+
def namespace_of(name)
|
57
|
+
modules_of(name).join('::')
|
58
|
+
end
|
59
|
+
|
60
|
+
#
|
61
|
+
# Converts a camel-case name to an underscored file name.
|
62
|
+
#
|
63
|
+
# @param [String] name
|
64
|
+
# The name to underscore.
|
65
|
+
#
|
66
|
+
# @return [String]
|
67
|
+
# The underscored version of the name.
|
68
|
+
#
|
69
|
+
def underscore(name)
|
70
|
+
name.gsub(/[^A-Z_][A-Z][^A-Z_]/) { |cap|
|
71
|
+
cap[0,1] + '_' + cap[1..-1]
|
72
|
+
}.downcase
|
73
|
+
end
|
74
|
+
|
75
|
+
#
|
76
|
+
# Guesses the namespace directories within `lib/` for a project.
|
77
|
+
#
|
78
|
+
# @return [Array<String>]
|
79
|
+
# The namespace directories for the project.
|
80
|
+
#
|
81
|
+
def namespace_dirs_of(name)
|
82
|
+
name.split('-').map { |word| underscore(word) }
|
83
|
+
end
|
84
|
+
|
85
|
+
#
|
86
|
+
# Guesses the namespace directory within `lib/` for a project.
|
87
|
+
#
|
88
|
+
# @return [String]
|
89
|
+
# The namespace directory for the project.
|
90
|
+
#
|
91
|
+
def namespace_path_of(name)
|
92
|
+
File.join(namespace_dirs_of(name))
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|