packager-dsl 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/.rspec +5 -5
- data/Changes +9 -4
- data/Gemfile +12 -12
- data/LICENSE +21 -340
- data/README.md +50 -48
- data/Rakefile +39 -37
- data/bin/packager +8 -8
- data/lib/packager.rb +5 -5
- data/lib/packager/cli.rb +72 -72
- data/lib/packager/dsl.rb +55 -55
- data/lib/packager/executor.rb +63 -63
- data/lib/packager/struct.rb +80 -80
- data/lib/packager/version.rb +3 -3
- data/on_what.rb +15 -15
- data/packager.gemspec +44 -44
- data/spec/cli/context.rb +17 -17
- data/spec/cli/execute_spec.rb +79 -79
- data/spec/cli/validate_spec.rb +47 -47
- data/spec/cli/version_spec.rb +7 -7
- data/spec/dsl/args_spec.rb +16 -16
- data/spec/dsl/context.rb +5 -5
- data/spec/dsl/defaults_spec.rb +19 -19
- data/spec/dsl/dependency_spec.rb +62 -62
- data/spec/dsl/error_spec.rb +48 -48
- data/spec/dsl/files_spec.rb +46 -46
- data/spec/executor/basic_spec.rb +21 -21
- data/spec/executor/command_spec.rb +18 -18
- data/spec/executor/context.rb +4 -4
- data/spec/executor/dependency_spec.rb +46 -46
- data/spec/executor/execute_command_spec.rb +25 -25
- data/spec/executor/files_spec.rb +33 -33
- data/spec/fpm-test_spec.rb +98 -98
- data/spec/integration/context.rb +57 -57
- data/spec/integration/dependency_spec.rb +51 -51
- data/spec/integration/files_spec.rb +104 -104
- data/spec/lib/fpm/package/test.rb +27 -27
- data/spec/shared_context/workdir.rb +18 -18
- data/spec/spec_helper.rb +55 -55
- data/spec/struct/command_spec.rb +67 -67
- data/spec/struct/error_spec.rb +12 -12
- metadata +45 -46
data/Rakefile
CHANGED
@@ -1,37 +1,39 @@
|
|
1
|
-
require 'rake/clean'
|
2
|
-
require 'bundler/gem_tasks'
|
3
|
-
require 'rubygems/tasks'
|
4
|
-
require 'rspec/core/rake_task'
|
5
|
-
|
6
|
-
# This is used by the Yardoc stuff in docile's Rakefile. We're not there yet.
|
7
|
-
require File.expand_path('on_what', File.dirname(__FILE__))
|
8
|
-
|
9
|
-
# Default task for `rake` is to run rspec
|
10
|
-
task :default => [:spec]
|
11
|
-
|
12
|
-
# Use default rspec rake task
|
13
|
-
RSpec::Core::RakeTask.new
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
require '
|
30
|
-
require '
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
1
|
+
require 'rake/clean'
|
2
|
+
require 'bundler/gem_tasks'
|
3
|
+
require 'rubygems/tasks'
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
|
6
|
+
# This is used by the Yardoc stuff in docile's Rakefile. We're not there yet.
|
7
|
+
require File.expand_path('on_what', File.dirname(__FILE__))
|
8
|
+
|
9
|
+
# Default task for `rake` is to run rspec
|
10
|
+
task :default => [:spec]
|
11
|
+
|
12
|
+
# Use default rspec rake task
|
13
|
+
RSpec::Core::RakeTask.new do |t|
|
14
|
+
t.verbose = false
|
15
|
+
end
|
16
|
+
|
17
|
+
task :unitspec do
|
18
|
+
sh('rspec', *Dir.glob('spec/{cli,dsl,executor,struct}'))
|
19
|
+
end
|
20
|
+
|
21
|
+
# Configure `rake clobber` to delete all generated files
|
22
|
+
CLOBBER.include('pkg', 'doc', 'coverage', '*.gem')
|
23
|
+
|
24
|
+
# Add the gem tasks:
|
25
|
+
# :build, :console, :install, :release
|
26
|
+
Gem::Tasks.new
|
27
|
+
|
28
|
+
if !on_travis? && !on_jruby? && !on_1_8?
|
29
|
+
require 'github/markup'
|
30
|
+
require 'redcarpet'
|
31
|
+
require 'yard'
|
32
|
+
require 'yard/rake/yardoc_task'
|
33
|
+
|
34
|
+
YARD::Rake::YardocTask.new do |t|
|
35
|
+
OTHER_PATHS = %w()
|
36
|
+
t.files = ['lib/**/*.rb', OTHER_PATHS]
|
37
|
+
t.options = %w(--markup-provider=redcarpet --markup=markdown --main=README.md)
|
38
|
+
end
|
39
|
+
end
|
data/bin/packager
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
$:.unshift File.expand_path('../../lib', __FILE__)
|
4
|
-
|
5
|
-
require 'rubygems' unless defined? Gem
|
6
|
-
require 'packager/cli'
|
7
|
-
|
8
|
-
Packager::CLI.start
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.unshift File.expand_path('../../lib', __FILE__)
|
4
|
+
|
5
|
+
require 'rubygems' unless defined? Gem
|
6
|
+
require 'packager/cli'
|
7
|
+
|
8
|
+
Packager::CLI.start
|
data/lib/packager.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
require 'packager/version'
|
2
|
-
|
3
|
-
require 'packager/cli'
|
4
|
-
require 'packager/dsl'
|
5
|
-
require 'packager/executor'
|
1
|
+
require 'packager/version'
|
2
|
+
|
3
|
+
require 'packager/cli'
|
4
|
+
require 'packager/dsl'
|
5
|
+
require 'packager/executor'
|
data/lib/packager/cli.rb
CHANGED
@@ -1,72 +1,72 @@
|
|
1
|
-
require 'thor'
|
2
|
-
|
3
|
-
require 'packager'
|
4
|
-
|
5
|
-
class Packager::CLI < Thor
|
6
|
-
# Make sure to exit(1) on failure. This isn't covered in the specs.
|
7
|
-
# :nocov:
|
8
|
-
def self.exit_on_failure?
|
9
|
-
true
|
10
|
-
end
|
11
|
-
# :nocov:
|
12
|
-
|
13
|
-
# Taken from http://stackoverflow.com/a/27804972/1732954
|
14
|
-
map %w[--version] => :__print_version
|
15
|
-
desc "--version", "Print the version"
|
16
|
-
def __print_version
|
17
|
-
puts Packager::VERSION
|
18
|
-
end
|
19
|
-
|
20
|
-
desc :execute, "Execute one or more package DSL definition(s)"
|
21
|
-
default_task :execute
|
22
|
-
def execute(*args)
|
23
|
-
if args.empty?
|
24
|
-
raise Thor::Error, "No filenames provided for execute"
|
25
|
-
end
|
26
|
-
|
27
|
-
args.each do |filename|
|
28
|
-
unless File.exists? filename
|
29
|
-
raise Thor::Error, "'#{filename}' cannot be found"
|
30
|
-
end
|
31
|
-
|
32
|
-
begin
|
33
|
-
items = Packager::DSL.parse_dsl(IO.read(filename))
|
34
|
-
rescue Exception => e
|
35
|
-
raise Thor::Error, "'#{filename}' has the following errors:\n#{e}"
|
36
|
-
end
|
37
|
-
|
38
|
-
if items.empty?
|
39
|
-
raise Thor::Error, "'#{filename}' produces nothing"
|
40
|
-
end
|
41
|
-
|
42
|
-
packages = Packager::Executor.new.execute_on(items)
|
43
|
-
|
44
|
-
puts "'#{filename}' executed #{packages.join(', ')}"
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
desc :validate, "Validate one or more package DSL definition(s)"
|
49
|
-
def validate(*args)
|
50
|
-
if args.empty?
|
51
|
-
raise Thor::Error, "No filenames provided for validate"
|
52
|
-
end
|
53
|
-
|
54
|
-
args.each do |filename|
|
55
|
-
unless File.exists? filename
|
56
|
-
raise Thor::Error, "'#{filename}' cannot be found"
|
57
|
-
end
|
58
|
-
|
59
|
-
begin
|
60
|
-
items = Packager::DSL.parse_dsl(IO.read(filename))
|
61
|
-
rescue Exception => e
|
62
|
-
raise Thor::Error, "'#{filename}' has the following errors:\n#{e}"
|
63
|
-
end
|
64
|
-
|
65
|
-
if items.empty?
|
66
|
-
raise Thor::Error, "'#{filename}' produces nothing"
|
67
|
-
end
|
68
|
-
|
69
|
-
puts "'#{filename}' parses cleanly"
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
1
|
+
require 'thor'
|
2
|
+
|
3
|
+
require 'packager'
|
4
|
+
|
5
|
+
class Packager::CLI < Thor
|
6
|
+
# Make sure to exit(1) on failure. This isn't covered in the specs.
|
7
|
+
# :nocov:
|
8
|
+
def self.exit_on_failure?
|
9
|
+
true
|
10
|
+
end
|
11
|
+
# :nocov:
|
12
|
+
|
13
|
+
# Taken from http://stackoverflow.com/a/27804972/1732954
|
14
|
+
map %w[--version] => :__print_version
|
15
|
+
desc "--version", "Print the version"
|
16
|
+
def __print_version
|
17
|
+
puts Packager::VERSION
|
18
|
+
end
|
19
|
+
|
20
|
+
desc :execute, "Execute one or more package DSL definition(s)"
|
21
|
+
default_task :execute
|
22
|
+
def execute(*args)
|
23
|
+
if args.empty?
|
24
|
+
raise Thor::Error, "No filenames provided for execute"
|
25
|
+
end
|
26
|
+
|
27
|
+
args.each do |filename|
|
28
|
+
unless File.exists? filename
|
29
|
+
raise Thor::Error, "'#{filename}' cannot be found"
|
30
|
+
end
|
31
|
+
|
32
|
+
begin
|
33
|
+
items = Packager::DSL.parse_dsl(IO.read(filename))
|
34
|
+
rescue Exception => e
|
35
|
+
raise Thor::Error, "'#{filename}' has the following errors:\n#{e}"
|
36
|
+
end
|
37
|
+
|
38
|
+
if items.empty?
|
39
|
+
raise Thor::Error, "'#{filename}' produces nothing"
|
40
|
+
end
|
41
|
+
|
42
|
+
packages = Packager::Executor.new.execute_on(items)
|
43
|
+
|
44
|
+
puts "'#{filename}' executed #{packages.join(', ')}"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
desc :validate, "Validate one or more package DSL definition(s)"
|
49
|
+
def validate(*args)
|
50
|
+
if args.empty?
|
51
|
+
raise Thor::Error, "No filenames provided for validate"
|
52
|
+
end
|
53
|
+
|
54
|
+
args.each do |filename|
|
55
|
+
unless File.exists? filename
|
56
|
+
raise Thor::Error, "'#{filename}' cannot be found"
|
57
|
+
end
|
58
|
+
|
59
|
+
begin
|
60
|
+
items = Packager::DSL.parse_dsl(IO.read(filename))
|
61
|
+
rescue Exception => e
|
62
|
+
raise Thor::Error, "'#{filename}' has the following errors:\n#{e}"
|
63
|
+
end
|
64
|
+
|
65
|
+
if items.empty?
|
66
|
+
raise Thor::Error, "'#{filename}' produces nothing"
|
67
|
+
end
|
68
|
+
|
69
|
+
puts "'#{filename}' parses cleanly"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/lib/packager/dsl.rb
CHANGED
@@ -1,55 +1,55 @@
|
|
1
|
-
require 'packager/version'
|
2
|
-
require 'packager/struct'
|
3
|
-
|
4
|
-
require 'dsl/maker'
|
5
|
-
|
6
|
-
class Packager::DSL < DSL::Maker
|
7
|
-
class << self
|
8
|
-
attr_writer :default_type
|
9
|
-
def default_type(*args)
|
10
|
-
@default_type = args[0] unless args.empty?
|
11
|
-
@default_type
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
add_type(VersionString = {}) do |attr, *args|
|
16
|
-
unless args.empty?
|
17
|
-
begin
|
18
|
-
___set(attr, Gem::Version.new(args[0]).to_s)
|
19
|
-
rescue ArgumentError
|
20
|
-
raise "'#{args[0]}' is not a legal version string"
|
21
|
-
end
|
22
|
-
end
|
23
|
-
___get(attr)
|
24
|
-
end
|
25
|
-
|
26
|
-
copy_file_dsl = generate_dsl({
|
27
|
-
:source => String,
|
28
|
-
:dest => String,
|
29
|
-
}) do
|
30
|
-
Packager::Struct::File.new(source, dest)
|
31
|
-
end
|
32
|
-
|
33
|
-
add_entrypoint(:package, {
|
34
|
-
:name => String,
|
35
|
-
:version => VersionString,
|
36
|
-
:type => Any,
|
37
|
-
:files => ArrayOf[copy_file_dsl],
|
38
|
-
:file => AliasOf(:files),
|
39
|
-
:requires => ArrayOf[String],
|
40
|
-
:provides => ArrayOf[String],
|
41
|
-
}) do |*args|
|
42
|
-
type(Packager::DSL.default_type) unless type
|
43
|
-
default(:name, args, 0)
|
44
|
-
|
45
|
-
Packager::Struct::Package.new(
|
46
|
-
name, version, type, files, requires, provides,
|
47
|
-
)
|
48
|
-
end
|
49
|
-
add_verification(:package) do |item|
|
50
|
-
return 'Every package must have a name' unless item.name
|
51
|
-
return 'Every package must have a version' unless item.version
|
52
|
-
return 'Every package must have a type' unless item.type
|
53
|
-
return
|
54
|
-
end
|
55
|
-
end
|
1
|
+
require 'packager/version'
|
2
|
+
require 'packager/struct'
|
3
|
+
|
4
|
+
require 'dsl/maker'
|
5
|
+
|
6
|
+
class Packager::DSL < DSL::Maker
|
7
|
+
class << self
|
8
|
+
attr_writer :default_type
|
9
|
+
def default_type(*args)
|
10
|
+
@default_type = args[0] unless args.empty?
|
11
|
+
@default_type
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
add_type(VersionString = {}) do |attr, *args|
|
16
|
+
unless args.empty?
|
17
|
+
begin
|
18
|
+
___set(attr, Gem::Version.new(args[0]).to_s)
|
19
|
+
rescue ArgumentError
|
20
|
+
raise "'#{args[0]}' is not a legal version string"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
___get(attr)
|
24
|
+
end
|
25
|
+
|
26
|
+
copy_file_dsl = generate_dsl({
|
27
|
+
:source => String,
|
28
|
+
:dest => String,
|
29
|
+
}) do
|
30
|
+
Packager::Struct::File.new(source, dest)
|
31
|
+
end
|
32
|
+
|
33
|
+
add_entrypoint(:package, {
|
34
|
+
:name => String,
|
35
|
+
:version => VersionString,
|
36
|
+
:type => Any,
|
37
|
+
:files => ArrayOf[copy_file_dsl],
|
38
|
+
:file => AliasOf(:files),
|
39
|
+
:requires => ArrayOf[String],
|
40
|
+
:provides => ArrayOf[String],
|
41
|
+
}) do |*args|
|
42
|
+
type(Packager::DSL.default_type) unless type
|
43
|
+
default(:name, args, 0)
|
44
|
+
|
45
|
+
Packager::Struct::Package.new(
|
46
|
+
name, version, type, files, requires, provides,
|
47
|
+
)
|
48
|
+
end
|
49
|
+
add_verification(:package) do |item|
|
50
|
+
return 'Every package must have a name' unless item.name
|
51
|
+
return 'Every package must have a version' unless item.version
|
52
|
+
return 'Every package must have a type' unless item.type
|
53
|
+
return
|
54
|
+
end
|
55
|
+
end
|
data/lib/packager/executor.rb
CHANGED
@@ -1,63 +1,63 @@
|
|
1
|
-
require 'packager/version'
|
2
|
-
|
3
|
-
require 'tmpdir'
|
4
|
-
|
5
|
-
class Packager
|
6
|
-
class Executor
|
7
|
-
attr_accessor :commands, :dryrun
|
8
|
-
|
9
|
-
def initialize(opts={})
|
10
|
-
self.dryrun = !!opts[:dryrun]
|
11
|
-
self.commands = []
|
12
|
-
end
|
13
|
-
|
14
|
-
def execute_on(items)
|
15
|
-
curdir = Dir.pwd
|
16
|
-
items.collect do |item|
|
17
|
-
Dir.mktmpdir do |tempdir|
|
18
|
-
Dir.chdir(tempdir) do
|
19
|
-
path = create_package_for(item)
|
20
|
-
FileUtils.mv(path, curdir) if path
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def create_package_for(item)
|
27
|
-
unless item.files.empty?
|
28
|
-
item.files.each do |file|
|
29
|
-
dest = (file.dest || '').gsub /^\//, ''
|
30
|
-
FileUtils.mkdir_p File.dirname(dest)
|
31
|
-
FileUtils.cp_r(file.source, dest)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
cmd = Packager::Struct::Command.new(
|
36
|
-
:name => item.name,
|
37
|
-
:version => item.version,
|
38
|
-
:target => item.type,
|
39
|
-
:requires => item.requires,
|
40
|
-
:provides => item.provides,
|
41
|
-
)
|
42
|
-
|
43
|
-
Dir.glob('*') do |entry|
|
44
|
-
if File.directory?(entry)
|
45
|
-
cmd.add_directory(entry)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
commands.push(cmd)
|
50
|
-
|
51
|
-
execute_command(cmd)
|
52
|
-
end
|
53
|
-
|
54
|
-
def execute_command(cmd)
|
55
|
-
return if dryrun
|
56
|
-
|
57
|
-
x = `#{cmd.to_system.join(' ')}`
|
58
|
-
rv = eval(x)
|
59
|
-
raise rv[:error] if rv[:error]
|
60
|
-
return rv[:path]
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
1
|
+
require 'packager/version'
|
2
|
+
|
3
|
+
require 'tmpdir'
|
4
|
+
|
5
|
+
class Packager
|
6
|
+
class Executor
|
7
|
+
attr_accessor :commands, :dryrun
|
8
|
+
|
9
|
+
def initialize(opts={})
|
10
|
+
self.dryrun = !!opts[:dryrun]
|
11
|
+
self.commands = []
|
12
|
+
end
|
13
|
+
|
14
|
+
def execute_on(items)
|
15
|
+
curdir = Dir.pwd
|
16
|
+
items.collect do |item|
|
17
|
+
Dir.mktmpdir do |tempdir|
|
18
|
+
Dir.chdir(tempdir) do
|
19
|
+
path = create_package_for(item)
|
20
|
+
FileUtils.mv(path, curdir) if path
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def create_package_for(item)
|
27
|
+
unless item.files.empty?
|
28
|
+
item.files.each do |file|
|
29
|
+
dest = (file.dest || '').gsub /^\//, ''
|
30
|
+
FileUtils.mkdir_p File.dirname(dest)
|
31
|
+
FileUtils.cp_r(file.source, dest)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
cmd = Packager::Struct::Command.new(
|
36
|
+
:name => item.name,
|
37
|
+
:version => item.version,
|
38
|
+
:target => item.type,
|
39
|
+
:requires => item.requires,
|
40
|
+
:provides => item.provides,
|
41
|
+
)
|
42
|
+
|
43
|
+
Dir.glob('*') do |entry|
|
44
|
+
if File.directory?(entry)
|
45
|
+
cmd.add_directory(entry)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
commands.push(cmd)
|
50
|
+
|
51
|
+
execute_command(cmd)
|
52
|
+
end
|
53
|
+
|
54
|
+
def execute_command(cmd)
|
55
|
+
return if dryrun
|
56
|
+
|
57
|
+
x = `#{cmd.to_system.join(' ')}`
|
58
|
+
rv = eval(x)
|
59
|
+
raise rv[:error] if rv[:error]
|
60
|
+
return rv[:path]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|