packager-dsl 0.0.1

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.
@@ -0,0 +1,57 @@
1
+ require 'fileutils'
2
+ require 'tmpdir'
3
+
4
+ require './spec/shared_context/workdir.rb'
5
+ RSpec.shared_context :integration do
6
+ include_context :workdir
7
+
8
+ before(:all) { Packager::DSL.default_type('test') }
9
+ after(:all) { Packager::DSL.default_type = nil }
10
+
11
+ # This is to get access to the 'test' FPM type in the FPM executable.
12
+ before(:all) {
13
+ Packager::Struct::Command.default_executable =
14
+ "ruby -I#{File.join(@dir,'spec/lib')} -rfpm/package/test `which fpm`"
15
+ }
16
+ after(:all) {
17
+ Packager::Struct::Command.default_executable = 'fpm'
18
+ }
19
+
20
+ before(:each) { $sourcedir = sourcedir }
21
+ before(:all) {
22
+ Packager::DSL.add_helper(:sourcedir) do |path|
23
+ File.join($sourcedir, path)
24
+ end
25
+ }
26
+ after(:all) {
27
+ Packager::DSL.remove_helper(:sourcedir)
28
+ }
29
+ end
30
+
31
+ RSpec.shared_context :test_package do
32
+ # This is used to verify the FPM/test package format is created properly.
33
+ def verify_test_package(name, metadata={}, files={})
34
+ expect(File).to exist(name)
35
+ expect(File).to exist(File.join(name, 'META.json'))
36
+ expect(JSON.parse(IO.read(File.join(name, 'META.json')))).to eq({
37
+ 'requires' => [],
38
+ 'provides' => [],
39
+ }.merge(metadata))
40
+ if files.empty?
41
+ expect(Dir[File.join(name, 'contents/*')].empty?).to be(true)
42
+ else
43
+ file_expectations = files.clone
44
+ Dir[File.join(name, 'contents/**/*')].each do |filename|
45
+ if File.file?(filename)
46
+ content = IO.read(filename)
47
+ filename.gsub! /#{File.join(name, 'contents', '')}/, ''
48
+
49
+ expect(file_expectations).to have_key(filename)
50
+ expect(file_expectations[filename]).to eq(content)
51
+ file_expectations.delete(filename)
52
+ end
53
+ end
54
+ expect(file_expectations).to be_empty
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,51 @@
1
+ require './spec/integration/context.rb'
2
+ describe "Packager integration" do
3
+ context "dependencies" do
4
+ include_context :integration
5
+ include_context :test_package
6
+
7
+ it "can create a package with 1 dependency" do
8
+ append_to_file('definition', "
9
+ package {
10
+ name 'foo'
11
+ version '0.0.1'
12
+ requires 'bar'
13
+ }
14
+ ")
15
+
16
+ FileUtils.chdir(workdir) do
17
+ capture(:stdout) {
18
+ Packager::CLI.start(['execute', './definition'])
19
+ }
20
+
21
+ verify_test_package('foo.test', {
22
+ 'name' => 'foo',
23
+ 'version' => '0.0.1',
24
+ 'requires' => ['bar'],
25
+ })
26
+ end
27
+ end
28
+
29
+ it "can create a package with 1 provides" do
30
+ append_to_file('definition', "
31
+ package {
32
+ name 'foo'
33
+ version '0.0.1'
34
+ provides 'bar'
35
+ }
36
+ ")
37
+
38
+ FileUtils.chdir(workdir) do
39
+ capture(:stdout) {
40
+ Packager::CLI.start(['execute', './definition'])
41
+ }
42
+
43
+ verify_test_package('foo.test', {
44
+ 'name' => 'foo',
45
+ 'version' => '0.0.1',
46
+ 'provides' => ['bar'],
47
+ })
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,104 @@
1
+ # Because of the vagaries of producing OS-specific packages on varying platforms,
2
+ # we will test command execution using a new output target for FPM called 'test.
3
+ # This target is based on the 'dir' target and exists in spec/lib.
4
+ #
5
+ # Note: We assume that fpm produces good packages of other types, given a correct
6
+ # invocations.
7
+
8
+ require './spec/integration/context.rb'
9
+ describe "Packager integration" do
10
+ context 'files' do
11
+ include_context :integration
12
+ include_context :test_package
13
+
14
+ it "can create a package with no files" do
15
+ append_to_file('definition', "
16
+ package {
17
+ name 'foo'
18
+ version '0.0.1'
19
+ }
20
+ ")
21
+
22
+ FileUtils.chdir(workdir) do
23
+ capture(:stdout) {
24
+ Packager::CLI.start(['execute', './definition'])
25
+ }
26
+
27
+ verify_test_package('foo.test', {
28
+ 'name' => 'foo',
29
+ 'version' => '0.0.1',
30
+ })
31
+ end
32
+ end
33
+
34
+ it "can create a package with one file" do
35
+ FileUtils.chdir(sourcedir) do
36
+ FileUtils.touch('file1')
37
+ end
38
+
39
+ append_to_file('definition', "
40
+ package {
41
+ name 'foo'
42
+ version '0.0.1'
43
+
44
+ file {
45
+ source sourcedir('file1')
46
+ dest '/foo/bar/file2'
47
+ }
48
+ }
49
+ ")
50
+
51
+ # Stub out execute_command
52
+ FileUtils.chdir(workdir) do
53
+ capture(:stdout) {
54
+ Packager::CLI.start(['execute', './definition'])
55
+ }
56
+
57
+ verify_test_package('foo.test', {
58
+ 'name' => 'foo',
59
+ 'version' => '0.0.1',
60
+ }, {
61
+ 'foo/bar/file2' => '',
62
+ })
63
+ end
64
+ end
65
+
66
+ it "can create a package with two files" do
67
+ FileUtils.chdir(sourcedir) do
68
+ FileUtils.touch('file1')
69
+ append_to_file('file3', 'stuff')
70
+ end
71
+
72
+ append_to_file('definition', "
73
+ package {
74
+ name 'foo'
75
+ version '0.0.1'
76
+
77
+ file {
78
+ source sourcedir('file1')
79
+ dest '/foo/bar/file2'
80
+ }
81
+
82
+ file {
83
+ source sourcedir('file3')
84
+ dest '/bar/foo/file4'
85
+ }
86
+ }
87
+ ")
88
+
89
+ FileUtils.chdir(workdir) do
90
+ capture(:stdout) {
91
+ Packager::CLI.start(['execute', './definition'])
92
+ }
93
+
94
+ verify_test_package('foo.test', {
95
+ 'name' => 'foo',
96
+ 'version' => '0.0.1',
97
+ }, {
98
+ 'foo/bar/file2' => '',
99
+ 'bar/foo/file4' => 'stuff',
100
+ })
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,27 @@
1
+ require 'fpm/package/dir'
2
+
3
+ require 'fileutils'
4
+
5
+ class FPM::Package::Test < FPM::Package::Dir
6
+ # Trigger the inherited capture of subclasses.
7
+ FPM::Package.inherited(FPM::Package::Test)
8
+
9
+ def output(output_path)
10
+ output_check(output_path)
11
+
12
+ # We have to create the ouput_path so that the Dir type will write out to the
13
+ # contents subdirectory.
14
+ FileUtils.mkdir_p output_path
15
+ super(File.join(output_path, 'contents'))
16
+
17
+ # Write out the META.json file.
18
+ File.open(File.join(output_path, 'META.json'), 'w') do |f|
19
+ f.write({
20
+ :name => name,
21
+ :version => version,
22
+ :requires => dependencies.sort,
23
+ :provides => provides.sort,
24
+ }.to_json)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,18 @@
1
+ require 'fileutils'
2
+ require 'tmpdir'
3
+
4
+ RSpec.shared_context :workdir do
5
+ before(:all) { @dir = Dir.pwd }
6
+
7
+ # Need to clean up because doing the let() doesn't trigger the automatic
8
+ # removal using the block form of Dir.mktmpdir would do.
9
+ let(:sourcedir) { Dir.mktmpdir }
10
+ let(:workdir) { Dir.mktmpdir }
11
+ before(:each) { FileUtils.chdir(workdir) }
12
+ after(:each) {
13
+ FileUtils.chdir @dir
14
+ [sourcedir, workdir].each do |dir|
15
+ FileUtils.remove_entry_secure(dir)
16
+ end
17
+ }
18
+ end
@@ -0,0 +1,55 @@
1
+ require File.expand_path('on_what', File.dirname(File.dirname(__FILE__)))
2
+
3
+ RSpec.configure do |config|
4
+ config.expect_with :rspec do |c|
5
+ c.syntax = :expect
6
+ end
7
+ end
8
+
9
+ unless on_1_8?
10
+ begin
11
+ require 'simplecov'
12
+
13
+ SimpleCov.configure do
14
+ add_filter '/spec/'
15
+ add_filter '/vendor/'
16
+ minimum_coverage 100
17
+ refuse_coverage_drop
18
+ end
19
+
20
+ if on_travis?
21
+ require 'codecov'
22
+ SimpleCov.formatter = SimpleCov::Formatter::Codecov
23
+ end
24
+
25
+ SimpleCov.start
26
+ rescue LoadError
27
+ puts "Coverage is disabled - install simplecov to enable."
28
+ end
29
+ end
30
+
31
+ require 'packager'
32
+
33
+ # This is taken from:
34
+ # https://github.com/erikhuda/thor/blob/d634d240bdc0462fe677031e1dc6ed656e54f27e/spec/helper.rb#L49
35
+ # Found via http://bokstuff.com/blog/testing-thor-command-lines-with-rspec/
36
+ def capture(stream)
37
+ begin
38
+ stream = stream.to_s
39
+ eval "$#{stream} = StringIO.new"
40
+ yield
41
+ result = eval("$#{stream}").string
42
+ ensure
43
+ eval("$#{stream} = #{stream.upcase}")
44
+ end
45
+
46
+ result
47
+ end
48
+
49
+ require 'tempfile'
50
+ def append_to_file(file, content)
51
+ File.open(file, 'a+') do |f|
52
+ f.write(content)
53
+ f.flush # VERY IMPORTANT
54
+ end
55
+ end
@@ -0,0 +1,67 @@
1
+ describe Packager::Struct::Command do
2
+ context '#to_system' do
3
+ it "handles empty packages" do
4
+ expect(Packager::Struct::Command.new(
5
+ :name => 'foo',
6
+ :version => '0.0.1',
7
+ :target => 'test',
8
+ ).to_system).to eq([
9
+ 'fpm',
10
+ '--name', 'foo',
11
+ '--version', '0.0.1',
12
+ '-s', 'empty', '-t', 'test',
13
+ ])
14
+ end
15
+
16
+ it "handles packages with files" do
17
+ cmd = Packager::Struct::Command.new(
18
+ :name => 'foo',
19
+ :version => '0.0.1',
20
+ :target => 'test',
21
+ )
22
+ cmd.add_directory('foo')
23
+
24
+ expect(cmd.to_system).to eq([
25
+ 'fpm',
26
+ '--name', 'foo',
27
+ '--version', '0.0.1',
28
+ '-s', 'dir', '-t', 'test',
29
+ 'foo',
30
+ ])
31
+ end
32
+
33
+ it "handles dependencies" do
34
+ cmd = Packager::Struct::Command.new(
35
+ :name => 'foo',
36
+ :version => '0.0.1',
37
+ :target => 'test',
38
+ :requires => ['foo'],
39
+ )
40
+
41
+ expect(cmd.to_system).to eq([
42
+ 'fpm',
43
+ '--name', 'foo',
44
+ '--version', '0.0.1',
45
+ '--depends', 'foo',
46
+ '-s', 'empty', '-t', 'test',
47
+ ])
48
+ end
49
+
50
+ it "handles provides" do
51
+ cmd = Packager::Struct::Command.new(
52
+ :name => 'foo',
53
+ :version => '0.0.1',
54
+ :target => 'test',
55
+ :provides => ['foo'],
56
+ )
57
+
58
+ expect(cmd.to_system).to eq([
59
+ 'fpm',
60
+ '--name', 'foo',
61
+ '--version', '0.0.1',
62
+ '--provides', 'foo',
63
+ '-s', 'empty', '-t', 'test',
64
+ ])
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,12 @@
1
+ class Packager::Struct::Testing < Packager::Struct.new(:foo, :bar)
2
+ end
3
+
4
+ describe Packager::Struct do
5
+ context "throws an error if" do
6
+ it "is passed an unknown parameter" do
7
+ expect {
8
+ Packager::Struct::Testing.new(:baz => 1)
9
+ }.to raise_error('Passed in unknown params: baz')
10
+ end
11
+ end
12
+ end
metadata ADDED
@@ -0,0 +1,268 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: packager-dsl
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Rob Kinyon
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-08-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: dsl_maker
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '0.1'
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: 0.1.1
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '0.1'
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: 0.1.1
33
+ - !ruby/object:Gem::Dependency
34
+ name: fpm
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ~>
38
+ - !ruby/object:Gem::Version
39
+ version: '1.4'
40
+ - - ! '>='
41
+ - !ruby/object:Gem::Version
42
+ version: 1.1.0
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ~>
48
+ - !ruby/object:Gem::Version
49
+ version: '1.4'
50
+ - - ! '>='
51
+ - !ruby/object:Gem::Version
52
+ version: 1.1.0
53
+ - !ruby/object:Gem::Dependency
54
+ name: thor
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ~>
58
+ - !ruby/object:Gem::Version
59
+ version: '0.0'
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: 0.19.0
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: '0.0'
70
+ - - ! '>='
71
+ - !ruby/object:Gem::Version
72
+ version: 0.19.0
73
+ - !ruby/object:Gem::Dependency
74
+ name: rake
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ~>
78
+ - !ruby/object:Gem::Version
79
+ version: '10'
80
+ type: :development
81
+ prerelease: false
82
+ version_requirements: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ~>
85
+ - !ruby/object:Gem::Version
86
+ version: '10'
87
+ - !ruby/object:Gem::Dependency
88
+ name: rspec
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 3.0.0
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: 3.0.0
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: 3.0.0
104
+ - - ! '>='
105
+ - !ruby/object:Gem::Version
106
+ version: 3.0.0
107
+ - !ruby/object:Gem::Dependency
108
+ name: simplecov
109
+ requirement: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ~>
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ type: :development
115
+ prerelease: false
116
+ version_requirements: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ~>
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ - !ruby/object:Gem::Dependency
122
+ name: rubygems-tasks
123
+ requirement: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ~>
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ type: :development
129
+ prerelease: false
130
+ version_requirements: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ~>
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ - !ruby/object:Gem::Dependency
136
+ name: json
137
+ requirement: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ~>
140
+ - !ruby/object:Gem::Version
141
+ version: '1'
142
+ - - ! '>='
143
+ - !ruby/object:Gem::Version
144
+ version: 1.7.7
145
+ type: :development
146
+ prerelease: false
147
+ version_requirements: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ~>
150
+ - !ruby/object:Gem::Version
151
+ version: '1'
152
+ - - ! '>='
153
+ - !ruby/object:Gem::Version
154
+ version: 1.7.7
155
+ - !ruby/object:Gem::Dependency
156
+ name: yard
157
+ requirement: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ~>
160
+ - !ruby/object:Gem::Version
161
+ version: '0.8'
162
+ type: :development
163
+ prerelease: false
164
+ version_requirements: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - ~>
167
+ - !ruby/object:Gem::Version
168
+ version: '0.8'
169
+ - !ruby/object:Gem::Dependency
170
+ name: redcarpet
171
+ requirement: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - ~>
174
+ - !ruby/object:Gem::Version
175
+ version: '3'
176
+ type: :development
177
+ prerelease: false
178
+ version_requirements: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - ~>
181
+ - !ruby/object:Gem::Version
182
+ version: '3'
183
+ - !ruby/object:Gem::Dependency
184
+ name: github-markup
185
+ requirement: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - ~>
188
+ - !ruby/object:Gem::Version
189
+ version: '1.3'
190
+ type: :development
191
+ prerelease: false
192
+ version_requirements: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - ~>
195
+ - !ruby/object:Gem::Version
196
+ version: '1.3'
197
+ description: DSL for creating a package that is easy to work with.
198
+ email: rob.kinyon@gmail.com
199
+ executables: []
200
+ extensions: []
201
+ extra_rdoc_files: []
202
+ files:
203
+ - .rspec
204
+ - Changes
205
+ - Gemfile
206
+ - LICENSE
207
+ - README.md
208
+ - Rakefile
209
+ - bin/packager
210
+ - lib/packager.rb
211
+ - lib/packager/cli.rb
212
+ - lib/packager/dsl.rb
213
+ - lib/packager/executor.rb
214
+ - lib/packager/struct.rb
215
+ - lib/packager/version.rb
216
+ - on_what.rb
217
+ - packager.gemspec
218
+ - spec/cli/context.rb
219
+ - spec/cli/execute_spec.rb
220
+ - spec/cli/validate_spec.rb
221
+ - spec/cli/version_spec.rb
222
+ - spec/dsl/args_spec.rb
223
+ - spec/dsl/context.rb
224
+ - spec/dsl/defaults_spec.rb
225
+ - spec/dsl/dependency_spec.rb
226
+ - spec/dsl/error_spec.rb
227
+ - spec/dsl/files_spec.rb
228
+ - spec/executor/basic_spec.rb
229
+ - spec/executor/command_spec.rb
230
+ - spec/executor/context.rb
231
+ - spec/executor/dependency_spec.rb
232
+ - spec/executor/execute_command_spec.rb
233
+ - spec/executor/files_spec.rb
234
+ - spec/fpm-test_spec.rb
235
+ - spec/integration/context.rb
236
+ - spec/integration/dependency_spec.rb
237
+ - spec/integration/files_spec.rb
238
+ - spec/lib/fpm/package/test.rb
239
+ - spec/shared_context/workdir.rb
240
+ - spec/spec_helper.rb
241
+ - spec/struct/command_spec.rb
242
+ - spec/struct/error_spec.rb
243
+ homepage: https://github.com/robkinyon/ruby-packager
244
+ licenses:
245
+ - GPL2
246
+ metadata: {}
247
+ post_install_message:
248
+ rdoc_options: []
249
+ require_paths:
250
+ - lib
251
+ required_ruby_version: !ruby/object:Gem::Requirement
252
+ requirements:
253
+ - - ! '>='
254
+ - !ruby/object:Gem::Version
255
+ version: 1.9.3
256
+ required_rubygems_version: !ruby/object:Gem::Requirement
257
+ requirements:
258
+ - - ! '>='
259
+ - !ruby/object:Gem::Version
260
+ version: '0'
261
+ requirements: []
262
+ rubyforge_project:
263
+ rubygems_version: 2.4.3
264
+ signing_key:
265
+ specification_version: 4
266
+ summary: DSL for creating packages
267
+ test_files: []
268
+ has_rdoc: