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/lib/packager/struct.rb
CHANGED
@@ -1,80 +1,80 @@
|
|
1
|
-
require 'packager/version'
|
2
|
-
|
3
|
-
# This exists so that you can pass in a Hash or an Array. While passing an Array
|
4
|
-
# can be useful, passing in a Hash is far more self-documenting.
|
5
|
-
class Packager::Struct < Struct
|
6
|
-
def initialize(*args)
|
7
|
-
if args.length == 1 and args[0].instance_of?(Hash)
|
8
|
-
difference = Set.new(args[0].keys) - Set.new(self.class.members)
|
9
|
-
unless difference.empty?
|
10
|
-
raise 'Passed in unknown params: ' + difference.to_a.sort.join(', ')
|
11
|
-
end
|
12
|
-
super(*args[0].values_at(*self.class.members))
|
13
|
-
else
|
14
|
-
super(*args)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
class Package < Packager::Struct.new(
|
19
|
-
:name, :version, :type, :files, :requires, :provides,
|
20
|
-
)
|
21
|
-
def initialize(*args)
|
22
|
-
super(*args)
|
23
|
-
self.files ||= []
|
24
|
-
self.requires ||= []
|
25
|
-
self.provides ||= []
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
class File < Packager::Struct.new(
|
30
|
-
:source, :dest,
|
31
|
-
)
|
32
|
-
end
|
33
|
-
|
34
|
-
class Command < Packager::Struct.new(
|
35
|
-
:executable, :name, :version,
|
36
|
-
:source, :target, :directories, :requires, :provides,
|
37
|
-
)
|
38
|
-
class << self
|
39
|
-
attr_accessor :default_executable
|
40
|
-
end
|
41
|
-
|
42
|
-
def initialize(*args)
|
43
|
-
super(*args)
|
44
|
-
self.source ||= 'empty'
|
45
|
-
self.executable ||= self.class.default_executable || 'fpm'
|
46
|
-
self.directories ||= {}
|
47
|
-
self.requires ||= []
|
48
|
-
self.provides ||= []
|
49
|
-
end
|
50
|
-
|
51
|
-
def add_directory(*items)
|
52
|
-
self.source = 'dir'
|
53
|
-
items.each do |item|
|
54
|
-
directories[item] = true
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
def to_system
|
59
|
-
cmd = [
|
60
|
-
executable,
|
61
|
-
'--name', name,
|
62
|
-
'--version', version,
|
63
|
-
]
|
64
|
-
|
65
|
-
self.requires.uniq.each do |req|
|
66
|
-
cmd.concat(['--depends', req])
|
67
|
-
end
|
68
|
-
|
69
|
-
self.provides.uniq.each do |req|
|
70
|
-
cmd.concat(['--provides', req])
|
71
|
-
end
|
72
|
-
|
73
|
-
cmd.concat(['-s', source, '-t', target])
|
74
|
-
cmd.concat(directories.keys)
|
75
|
-
|
76
|
-
return cmd
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
1
|
+
require 'packager/version'
|
2
|
+
|
3
|
+
# This exists so that you can pass in a Hash or an Array. While passing an Array
|
4
|
+
# can be useful, passing in a Hash is far more self-documenting.
|
5
|
+
class Packager::Struct < Struct
|
6
|
+
def initialize(*args)
|
7
|
+
if args.length == 1 and args[0].instance_of?(Hash)
|
8
|
+
difference = Set.new(args[0].keys) - Set.new(self.class.members)
|
9
|
+
unless difference.empty?
|
10
|
+
raise 'Passed in unknown params: ' + difference.to_a.sort.join(', ')
|
11
|
+
end
|
12
|
+
super(*args[0].values_at(*self.class.members))
|
13
|
+
else
|
14
|
+
super(*args)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Package < Packager::Struct.new(
|
19
|
+
:name, :version, :type, :files, :requires, :provides,
|
20
|
+
)
|
21
|
+
def initialize(*args)
|
22
|
+
super(*args)
|
23
|
+
self.files ||= []
|
24
|
+
self.requires ||= []
|
25
|
+
self.provides ||= []
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class File < Packager::Struct.new(
|
30
|
+
:source, :dest,
|
31
|
+
)
|
32
|
+
end
|
33
|
+
|
34
|
+
class Command < Packager::Struct.new(
|
35
|
+
:executable, :name, :version,
|
36
|
+
:source, :target, :directories, :requires, :provides,
|
37
|
+
)
|
38
|
+
class << self
|
39
|
+
attr_accessor :default_executable
|
40
|
+
end
|
41
|
+
|
42
|
+
def initialize(*args)
|
43
|
+
super(*args)
|
44
|
+
self.source ||= 'empty'
|
45
|
+
self.executable ||= self.class.default_executable || 'fpm'
|
46
|
+
self.directories ||= {}
|
47
|
+
self.requires ||= []
|
48
|
+
self.provides ||= []
|
49
|
+
end
|
50
|
+
|
51
|
+
def add_directory(*items)
|
52
|
+
self.source = 'dir'
|
53
|
+
items.each do |item|
|
54
|
+
directories[item] = true
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def to_system
|
59
|
+
cmd = [
|
60
|
+
executable,
|
61
|
+
'--name', name,
|
62
|
+
'--version', version,
|
63
|
+
]
|
64
|
+
|
65
|
+
self.requires.uniq.each do |req|
|
66
|
+
cmd.concat(['--depends', req])
|
67
|
+
end
|
68
|
+
|
69
|
+
self.provides.uniq.each do |req|
|
70
|
+
cmd.concat(['--provides', req])
|
71
|
+
end
|
72
|
+
|
73
|
+
cmd.concat(['-s', source, '-t', target])
|
74
|
+
cmd.concat(directories.keys)
|
75
|
+
|
76
|
+
return cmd
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
data/lib/packager/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
class Packager
|
2
|
-
VERSION = '0.0
|
3
|
-
end
|
1
|
+
class Packager
|
2
|
+
VERSION = '0.1.0'
|
3
|
+
end
|
data/on_what.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
|
-
# NOTE: Very simple tests for what system we are on, extracted for sharing
|
2
|
-
# between Rakefile, gemspec, and spec_helper. Not for use in actual library.
|
3
|
-
# This is copied from https://github.com/ms-ati/docile/blob/master/on_what.rb
|
4
|
-
|
5
|
-
def on_travis?
|
6
|
-
ENV['CI'] == 'true'
|
7
|
-
end
|
8
|
-
|
9
|
-
def on_jruby?
|
10
|
-
defined?(RUBY_ENGINE) && 'jruby' == RUBY_ENGINE
|
11
|
-
end
|
12
|
-
|
13
|
-
def on_1_8?
|
14
|
-
RUBY_VERSION.start_with? '1.8'
|
15
|
-
end
|
1
|
+
# NOTE: Very simple tests for what system we are on, extracted for sharing
|
2
|
+
# between Rakefile, gemspec, and spec_helper. Not for use in actual library.
|
3
|
+
# This is copied from https://github.com/ms-ati/docile/blob/master/on_what.rb
|
4
|
+
|
5
|
+
def on_travis?
|
6
|
+
ENV['CI'] == 'true'
|
7
|
+
end
|
8
|
+
|
9
|
+
def on_jruby?
|
10
|
+
defined?(RUBY_ENGINE) && 'jruby' == RUBY_ENGINE
|
11
|
+
end
|
12
|
+
|
13
|
+
def on_1_8?
|
14
|
+
RUBY_VERSION.start_with? '1.8'
|
15
|
+
end
|
data/packager.gemspec
CHANGED
@@ -1,44 +1,44 @@
|
|
1
|
-
require File.expand_path('on_what', File.dirname(__FILE__))
|
2
|
-
$:.push File.expand_path('../lib', __FILE__)
|
3
|
-
require 'packager/version'
|
4
|
-
|
5
|
-
Gem::Specification.new do |s|
|
6
|
-
s.name = 'packager-dsl'
|
7
|
-
s.version = Packager::VERSION
|
8
|
-
s.author = 'Rob Kinyon'
|
9
|
-
s.email = 'rob.kinyon@gmail.com'
|
10
|
-
s.summary = 'DSL for creating packages'
|
11
|
-
s.description = 'DSL for creating a package that is easy to work with.'
|
12
|
-
s.license = '
|
13
|
-
s.homepage = 'https://github.com/robkinyon/ruby-packager'
|
14
|
-
|
15
|
-
# Don't tramp along our dot-files, except for .rspec
|
16
|
-
s.files = `git ls-files`.split("\n").select { |filename|
|
17
|
-
!filename.match(/^\./) || filename == '.rspec'
|
18
|
-
}
|
19
|
-
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
20
|
-
s.executables = `git ls-files -- {bin}/*`.split("\n")
|
21
|
-
s.require_paths = %w(lib)
|
22
|
-
|
23
|
-
s.required_ruby_version = '>= 1.9.3'
|
24
|
-
|
25
|
-
s.add_dependency 'dsl_maker', '~> 0
|
26
|
-
s.add_dependency 'fpm', '~> 1.4', '>= 1.1.0'
|
27
|
-
s.add_dependency 'thor', '~> 0.0', '>= 0.19.0'
|
28
|
-
|
29
|
-
s.add_development_dependency 'rake', '~> 10'
|
30
|
-
s.add_development_dependency 'rspec', '~> 3.0.0', '>= 3.0.0'
|
31
|
-
s.add_development_dependency 'simplecov', '~> 0'
|
32
|
-
s.add_development_dependency 'rubygems-tasks', '~> 0'
|
33
|
-
s.add_development_dependency 'json', '~> 1', '>=1.7.7'
|
34
|
-
|
35
|
-
# To limit needed compatibility with versions of dependencies, only configure
|
36
|
-
# yard doc generation when *not* on Travis, JRuby, or 1.8
|
37
|
-
if !on_travis? && !on_jruby? && !on_1_8?
|
38
|
-
# Github flavored markdown in YARD documentation
|
39
|
-
# http://blog.nikosd.com/2011/11/github-flavored-markdown-in-yard.html
|
40
|
-
s.add_development_dependency 'yard', '
|
41
|
-
s.add_development_dependency 'redcarpet', '~> 3'
|
42
|
-
s.add_development_dependency 'github-markup', '~> 1.3'
|
43
|
-
end
|
44
|
-
end
|
1
|
+
require File.expand_path('on_what', File.dirname(__FILE__))
|
2
|
+
$:.push File.expand_path('../lib', __FILE__)
|
3
|
+
require 'packager/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'packager-dsl'
|
7
|
+
s.version = Packager::VERSION
|
8
|
+
s.author = 'Rob Kinyon'
|
9
|
+
s.email = 'rob.kinyon@gmail.com'
|
10
|
+
s.summary = 'DSL for creating packages'
|
11
|
+
s.description = 'DSL for creating a package that is easy to work with.'
|
12
|
+
s.license = 'MIT'
|
13
|
+
s.homepage = 'https://github.com/robkinyon/ruby-packager'
|
14
|
+
|
15
|
+
# Don't tramp along our dot-files, except for .rspec
|
16
|
+
s.files = `git ls-files`.split("\n").select { |filename|
|
17
|
+
!filename.match(/^\./) || filename == '.rspec'
|
18
|
+
}
|
19
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
20
|
+
s.executables = `git ls-files -- {bin}/*`.split("\n")
|
21
|
+
s.require_paths = %w(lib)
|
22
|
+
|
23
|
+
s.required_ruby_version = '>= 1.9.3'
|
24
|
+
|
25
|
+
s.add_dependency 'dsl_maker', '~> 1.0', '>= 1.0.0'
|
26
|
+
s.add_dependency 'fpm', '~> 1.4', '>= 1.1.0'
|
27
|
+
s.add_dependency 'thor', '~> 0.0', '>= 0.19.0'
|
28
|
+
|
29
|
+
s.add_development_dependency 'rake', '~> 10'
|
30
|
+
s.add_development_dependency 'rspec', '~> 3.0.0', '>= 3.0.0'
|
31
|
+
s.add_development_dependency 'simplecov', '~> 0'
|
32
|
+
s.add_development_dependency 'rubygems-tasks', '~> 0'
|
33
|
+
s.add_development_dependency 'json', '~> 1', '>=1.7.7'
|
34
|
+
|
35
|
+
# To limit needed compatibility with versions of dependencies, only configure
|
36
|
+
# yard doc generation when *not* on Travis, JRuby, or 1.8
|
37
|
+
if !on_travis? && !on_jruby? && !on_1_8?
|
38
|
+
# Github flavored markdown in YARD documentation
|
39
|
+
# http://blog.nikosd.com/2011/11/github-flavored-markdown-in-yard.html
|
40
|
+
s.add_development_dependency 'yard', '>= 0.9.11'
|
41
|
+
s.add_development_dependency 'redcarpet', '~> 3'
|
42
|
+
s.add_development_dependency 'github-markup', '~> 1.3'
|
43
|
+
end
|
44
|
+
end
|
data/spec/cli/context.rb
CHANGED
@@ -1,17 +1,17 @@
|
|
1
|
-
# Examine:
|
2
|
-
# https://gabebw.wordpress.com/2011/03/21/temp-files-in-rspec/
|
3
|
-
|
4
|
-
require 'fileutils'
|
5
|
-
require 'tmpdir'
|
6
|
-
|
7
|
-
RSpec.shared_context :cli do
|
8
|
-
subject(:cli) { Packager::CLI.new }
|
9
|
-
|
10
|
-
let(:workdir) { Dir.mktmpdir }
|
11
|
-
before(:all) { @dir = Dir.pwd }
|
12
|
-
before(:each) { FileUtils.chdir(workdir) }
|
13
|
-
after(:each) {
|
14
|
-
FileUtils.chdir @dir
|
15
|
-
FileUtils.remove_entry_secure(workdir)
|
16
|
-
}
|
17
|
-
end
|
1
|
+
# Examine:
|
2
|
+
# https://gabebw.wordpress.com/2011/03/21/temp-files-in-rspec/
|
3
|
+
|
4
|
+
require 'fileutils'
|
5
|
+
require 'tmpdir'
|
6
|
+
|
7
|
+
RSpec.shared_context :cli do
|
8
|
+
subject(:cli) { Packager::CLI.new }
|
9
|
+
|
10
|
+
let(:workdir) { Dir.mktmpdir }
|
11
|
+
before(:all) { @dir = Dir.pwd }
|
12
|
+
before(:each) { FileUtils.chdir(workdir) }
|
13
|
+
after(:each) {
|
14
|
+
FileUtils.chdir @dir
|
15
|
+
FileUtils.remove_entry_secure(workdir)
|
16
|
+
}
|
17
|
+
end
|
data/spec/cli/execute_spec.rb
CHANGED
@@ -1,79 +1,79 @@
|
|
1
|
-
require './spec/cli/context.rb'
|
2
|
-
describe Packager::CLI do
|
3
|
-
context '#execute' do
|
4
|
-
include_context :cli
|
5
|
-
|
6
|
-
it "handles nothing passed" do
|
7
|
-
expect {
|
8
|
-
cli.execute
|
9
|
-
}.to raise_error(Thor::Error, "No filenames provided for execute")
|
10
|
-
end
|
11
|
-
|
12
|
-
it "handles a non-existent filename" do
|
13
|
-
expect {
|
14
|
-
cli.execute('foo')
|
15
|
-
}.to raise_error(Thor::Error, "'foo' cannot be found")
|
16
|
-
end
|
17
|
-
|
18
|
-
it "handles an empty file" do
|
19
|
-
FileUtils.touch('definition')
|
20
|
-
expect {
|
21
|
-
cli.execute('definition')
|
22
|
-
}.to raise_error(Thor::Error, "'definition' produces nothing")
|
23
|
-
end
|
24
|
-
|
25
|
-
it "handles a bad file" do
|
26
|
-
append_to_file('definition', 'package {}')
|
27
|
-
|
28
|
-
expect {
|
29
|
-
cli.execute('definition')
|
30
|
-
}.to raise_error(Thor::Error, "'definition' has the following errors:\nEvery package must have a name")
|
31
|
-
end
|
32
|
-
|
33
|
-
context "handles a file that works" do
|
34
|
-
before {
|
35
|
-
expect(Packager::DSL).to(
|
36
|
-
receive(:parse_dsl).
|
37
|
-
with('contents').
|
38
|
-
and_return(:stuff)
|
39
|
-
)
|
40
|
-
|
41
|
-
expect_any_instance_of(Packager::Executor).to(
|
42
|
-
receive(:execute_on).
|
43
|
-
with(:stuff).
|
44
|
-
and_return(['foo'])
|
45
|
-
)
|
46
|
-
}
|
47
|
-
|
48
|
-
it {
|
49
|
-
append_to_file('definition', 'contents')
|
50
|
-
expect(
|
51
|
-
capture(:stdout) { cli.execute('definition') }
|
52
|
-
).to eq("'definition' executed foo\n")
|
53
|
-
}
|
54
|
-
end
|
55
|
-
|
56
|
-
context "handles a file that works with two packages" do
|
57
|
-
before {
|
58
|
-
expect(Packager::DSL).to(
|
59
|
-
receive(:parse_dsl).
|
60
|
-
with('contents').
|
61
|
-
and_return(:stuff)
|
62
|
-
)
|
63
|
-
|
64
|
-
expect_any_instance_of(Packager::Executor).to(
|
65
|
-
receive(:execute_on).
|
66
|
-
with(:stuff).
|
67
|
-
and_return(['foo', 'bar'])
|
68
|
-
)
|
69
|
-
}
|
70
|
-
|
71
|
-
it {
|
72
|
-
append_to_file('definition', 'contents')
|
73
|
-
expect(
|
74
|
-
capture(:stdout) { cli.execute('definition') }
|
75
|
-
).to eq("'definition' executed foo, bar\n")
|
76
|
-
}
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
1
|
+
require './spec/cli/context.rb'
|
2
|
+
describe Packager::CLI do
|
3
|
+
context '#execute' do
|
4
|
+
include_context :cli
|
5
|
+
|
6
|
+
it "handles nothing passed" do
|
7
|
+
expect {
|
8
|
+
cli.execute
|
9
|
+
}.to raise_error(Thor::Error, "No filenames provided for execute")
|
10
|
+
end
|
11
|
+
|
12
|
+
it "handles a non-existent filename" do
|
13
|
+
expect {
|
14
|
+
cli.execute('foo')
|
15
|
+
}.to raise_error(Thor::Error, "'foo' cannot be found")
|
16
|
+
end
|
17
|
+
|
18
|
+
it "handles an empty file" do
|
19
|
+
FileUtils.touch('definition')
|
20
|
+
expect {
|
21
|
+
cli.execute('definition')
|
22
|
+
}.to raise_error(Thor::Error, "'definition' produces nothing")
|
23
|
+
end
|
24
|
+
|
25
|
+
it "handles a bad file" do
|
26
|
+
append_to_file('definition', 'package {}')
|
27
|
+
|
28
|
+
expect {
|
29
|
+
cli.execute('definition')
|
30
|
+
}.to raise_error(Thor::Error, "'definition' has the following errors:\nEvery package must have a name")
|
31
|
+
end
|
32
|
+
|
33
|
+
context "handles a file that works" do
|
34
|
+
before {
|
35
|
+
expect(Packager::DSL).to(
|
36
|
+
receive(:parse_dsl).
|
37
|
+
with('contents').
|
38
|
+
and_return(:stuff)
|
39
|
+
)
|
40
|
+
|
41
|
+
expect_any_instance_of(Packager::Executor).to(
|
42
|
+
receive(:execute_on).
|
43
|
+
with(:stuff).
|
44
|
+
and_return(['foo'])
|
45
|
+
)
|
46
|
+
}
|
47
|
+
|
48
|
+
it {
|
49
|
+
append_to_file('definition', 'contents')
|
50
|
+
expect(
|
51
|
+
capture(:stdout) { cli.execute('definition') }
|
52
|
+
).to eq("'definition' executed foo\n")
|
53
|
+
}
|
54
|
+
end
|
55
|
+
|
56
|
+
context "handles a file that works with two packages" do
|
57
|
+
before {
|
58
|
+
expect(Packager::DSL).to(
|
59
|
+
receive(:parse_dsl).
|
60
|
+
with('contents').
|
61
|
+
and_return(:stuff)
|
62
|
+
)
|
63
|
+
|
64
|
+
expect_any_instance_of(Packager::Executor).to(
|
65
|
+
receive(:execute_on).
|
66
|
+
with(:stuff).
|
67
|
+
and_return(['foo', 'bar'])
|
68
|
+
)
|
69
|
+
}
|
70
|
+
|
71
|
+
it {
|
72
|
+
append_to_file('definition', 'contents')
|
73
|
+
expect(
|
74
|
+
capture(:stdout) { cli.execute('definition') }
|
75
|
+
).to eq("'definition' executed foo, bar\n")
|
76
|
+
}
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|