packager-dsl 0.0.1 → 0.1.0
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 +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
|