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.
@@ -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
+
@@ -1,3 +1,3 @@
1
- class Packager
2
- VERSION = '0.0.1'
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 = 'GPL2'
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.1', '>= 0.1.1'
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.8'
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
@@ -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