buildozer 1.0.0.dev1 → 1.0.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.
- data/.buildpath +2 -0
- data/bin/buildozer +5 -0
- data/buildozer.gemspec +1 -0
- data/lib/buildozer.rb +0 -2
- data/lib/buildozer/builder/exceptions.rb +6 -0
- data/lib/buildozer/builder/rpm.rb +55 -0
- data/lib/buildozer/cli/buildozer.rb +21 -0
- data/lib/buildozer/dsl.rb +19 -0
- data/lib/buildozer/dsl/compiler.rb +31 -0
- data/lib/buildozer/dsl/compiler/exceptions.rb +14 -0
- data/lib/buildozer/dsl/compiler/validator.rb +52 -0
- data/lib/buildozer/dsl/definition.rb +23 -0
- data/lib/buildozer/dsl/fragment.rb +18 -0
- data/lib/buildozer/dsl/package.rb +50 -0
- data/lib/buildozer/model/definition.rb +11 -0
- data/lib/buildozer/model/package.rb +25 -0
- data/lib/buildozer/version.rb +1 -1
- data/test/lib/buildozer/builder/test_rpm.rb +46 -0
- data/test/lib/buildozer/dsl/test_compiler.rb +70 -0
- data/test/resources/definition_full.bd.rb +12 -0
- data/test/resources/definition_no_includes.bd.rb +10 -0
- metadata +49 -8
data/.buildpath
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
2
|
<buildpath>
|
3
3
|
<buildpathentry kind="src" path="lib"/>
|
4
|
+
<buildpathentry kind="src" path="script"/>
|
5
|
+
<buildpathentry kind="src" path="test"/>
|
4
6
|
<buildpathentry kind="con" path="org.eclipse.dltk.launching.INTERPRETER_CONTAINER"/>
|
5
7
|
</buildpath>
|
data/bin/buildozer
ADDED
data/buildozer.gemspec
CHANGED
data/lib/buildozer.rb
CHANGED
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'buildozer/builder/exceptions'
|
2
|
+
require 'stringio'
|
3
|
+
|
4
|
+
module Buildozer
|
5
|
+
module Builder
|
6
|
+
class Rpm
|
7
|
+
def initialize(package, directory)
|
8
|
+
@package = package
|
9
|
+
@directory = directory
|
10
|
+
|
11
|
+
validate()
|
12
|
+
end
|
13
|
+
|
14
|
+
def build()
|
15
|
+
system(command())
|
16
|
+
end
|
17
|
+
|
18
|
+
def command()
|
19
|
+
buffer = StringIO.new
|
20
|
+
|
21
|
+
buffer << "fpm -s dir -t rpm"
|
22
|
+
buffer << " -n \"#{@package.name}\""
|
23
|
+
buffer << " -v \"#{@package.version}\""
|
24
|
+
buffer << " -C \"#{@directory}\""
|
25
|
+
buffer << " -p \"#{name()}\""
|
26
|
+
|
27
|
+
buffer << " -m \"#{@package.maintainer}\"" if @package.maintainer
|
28
|
+
|
29
|
+
@package.provides.each do |provide|
|
30
|
+
buffer << " --provides \"#{provide}\""
|
31
|
+
end
|
32
|
+
|
33
|
+
@package.depends.each do |dependency|
|
34
|
+
buffer << " -d \"#{dependency}\""
|
35
|
+
end
|
36
|
+
|
37
|
+
@package.includes.each do |entry|
|
38
|
+
buffer << " #{entry}"
|
39
|
+
end
|
40
|
+
|
41
|
+
return buffer.string
|
42
|
+
end
|
43
|
+
|
44
|
+
def name()
|
45
|
+
"#{@package.archive}_ARCH.rpm"
|
46
|
+
end
|
47
|
+
|
48
|
+
def validate()
|
49
|
+
if @package.includes.empty?()
|
50
|
+
raise Builder::InvalidRpmPackage, "Invalid rpm package, must have at least on 'includes'"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'buildozer/builder/rpm'
|
2
|
+
require 'buildozer/dsl'
|
3
|
+
require 'thor'
|
4
|
+
|
5
|
+
module Buildozer
|
6
|
+
module Cli
|
7
|
+
class Buildozer < Thor
|
8
|
+
|
9
|
+
desc "rpm FILE", "Build a rpm package using fpm"
|
10
|
+
method_option :dir, :aliases => "-d", :default => ".", :desc => "Directory where package files are located"
|
11
|
+
def rpm(file)
|
12
|
+
definition = Dsl.compile(file)
|
13
|
+
|
14
|
+
definition.packages.each do |package|
|
15
|
+
builder = Builder::Rpm.new(package, File.expand_path(options[:dir]))
|
16
|
+
puts builder.build()
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'buildozer/dsl/compiler'
|
2
|
+
require 'buildozer/dsl/definition'
|
3
|
+
|
4
|
+
module Buildozer
|
5
|
+
module Dsl
|
6
|
+
def self.load(filename)
|
7
|
+
definition = Dsl::Definition.new()
|
8
|
+
definition.instance_eval(File.read(filename), filename)
|
9
|
+
|
10
|
+
return definition
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.compile(filename)
|
14
|
+
fragment = load(filename)
|
15
|
+
|
16
|
+
return Dsl::Compiler.compile(fragment)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'buildozer/dsl/compiler/validator'
|
2
|
+
require 'buildozer/dsl/compiler/exceptions'
|
3
|
+
require 'buildozer/model/definition'
|
4
|
+
require 'buildozer/model/package'
|
5
|
+
|
6
|
+
module Buildozer
|
7
|
+
module Dsl
|
8
|
+
module Compiler
|
9
|
+
def self.compile(fragment)
|
10
|
+
Validator.validate_fragment(fragment);
|
11
|
+
|
12
|
+
send("compile_#{fragment.type()}", fragment)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.compile_definition(definition)
|
16
|
+
Validator.validate_definition(definition);
|
17
|
+
|
18
|
+
options = definition.options()
|
19
|
+
return Model::Definition.new({
|
20
|
+
:packages => options[:packages].map { |package| compile(package) }
|
21
|
+
})
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.compile_package(package)
|
25
|
+
Validator.validate_package(package);
|
26
|
+
|
27
|
+
return Model::Package.new(package.options())
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Buildozer
|
2
|
+
module Dsl
|
3
|
+
module Compiler
|
4
|
+
module Validator
|
5
|
+
##
|
6
|
+
# Receive a dsl fragment and validates that it is
|
7
|
+
# well-formed. A dsl fragment is any valid dsl
|
8
|
+
# class that can be compiled.
|
9
|
+
#
|
10
|
+
# For now, exceptions are raised when something is wrong.
|
11
|
+
def self.validate_fragment(fragment)
|
12
|
+
if not fragment.kind_of?(Fragment) or not fragment.respond_to?(:type)
|
13
|
+
raise InvalidDslFragment, "Cannot compile, the argument received is not a dsl fragment"
|
14
|
+
end
|
15
|
+
|
16
|
+
compiler = "compile_#{fragment.type()}"
|
17
|
+
if not Compiler.respond_to?(compiler)
|
18
|
+
raise InvalidDslFragment, "Does not know how to compile fragment [#{fragment.type()}]"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
##
|
23
|
+
# Receive a dsl definition and validates that it is
|
24
|
+
# well-formed.
|
25
|
+
#
|
26
|
+
# For now, exceptions are raised when something is wrong.
|
27
|
+
def self.validate_definition(definition)
|
28
|
+
options = definition.options()
|
29
|
+
if not options.has_key?(:packages) or options[:packages].empty?()
|
30
|
+
raise InvalidDslDefinition, "Invalid definition, must have a least one 'package'"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
##
|
35
|
+
# Receive a dsl package and validates that it is
|
36
|
+
# well-formed.
|
37
|
+
#
|
38
|
+
# For now, exceptions are raised when something is wrong.
|
39
|
+
def self.validate_package(package)
|
40
|
+
options = package.options()
|
41
|
+
if not options.has_key?(:version)
|
42
|
+
raise InvalidDslPackage, "Invalid package, must have a 'version'"
|
43
|
+
end
|
44
|
+
|
45
|
+
if not options.has_key?(:url)
|
46
|
+
raise InvalidDslPackage, "Invalid package, must have an 'url'"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'buildozer/dsl/fragment'
|
2
|
+
require 'buildozer/dsl/package'
|
3
|
+
|
4
|
+
module Buildozer
|
5
|
+
module Dsl
|
6
|
+
class Definition < Fragment
|
7
|
+
def initialize()
|
8
|
+
@packages = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def package(name, &block)
|
12
|
+
package = Package.new(name, &block)
|
13
|
+
@packages << package
|
14
|
+
|
15
|
+
return package
|
16
|
+
end
|
17
|
+
|
18
|
+
def type()
|
19
|
+
return :definition
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Buildozer
|
2
|
+
module Dsl
|
3
|
+
class Fragment
|
4
|
+
def options()
|
5
|
+
return Hash[instance_variables.map { |name| [name_to_key(name), instance_variable_get(name)] } ]
|
6
|
+
end
|
7
|
+
|
8
|
+
:private
|
9
|
+
|
10
|
+
def name_to_key(name)
|
11
|
+
name = name.to_s
|
12
|
+
|
13
|
+
# Remove first char of instance name, i.e. the @ sign
|
14
|
+
return name.slice(1, name.length).to_sym
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'buildozer/dsl/fragment'
|
2
|
+
|
3
|
+
module Buildozer
|
4
|
+
module Dsl
|
5
|
+
class Package < Fragment
|
6
|
+
def initialize(name, &block)
|
7
|
+
@name = name
|
8
|
+
@provides = []
|
9
|
+
@depends = []
|
10
|
+
@includes = []
|
11
|
+
|
12
|
+
if block_given?
|
13
|
+
instance_eval(&block)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def url(url)
|
18
|
+
@url = url
|
19
|
+
end
|
20
|
+
|
21
|
+
def version(version)
|
22
|
+
@version = version
|
23
|
+
end
|
24
|
+
|
25
|
+
def archive(archive)
|
26
|
+
@archive = archive
|
27
|
+
end
|
28
|
+
|
29
|
+
def maintainer(maintainer)
|
30
|
+
@maintainer = maintainer
|
31
|
+
end
|
32
|
+
|
33
|
+
def depends(package)
|
34
|
+
@depends << package
|
35
|
+
end
|
36
|
+
|
37
|
+
def provides(package)
|
38
|
+
@provides << package
|
39
|
+
end
|
40
|
+
|
41
|
+
def includes(entry)
|
42
|
+
@includes << entry
|
43
|
+
end
|
44
|
+
|
45
|
+
def type()
|
46
|
+
return :package
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Buildozer
|
2
|
+
module Model
|
3
|
+
class Package
|
4
|
+
attr_accessor :name, :version, :revision, :archive, :url,
|
5
|
+
:maintainer,
|
6
|
+
:provides, :depends,
|
7
|
+
:includes
|
8
|
+
|
9
|
+
def initialize(options)
|
10
|
+
@name = options.fetch(:name)
|
11
|
+
@version = options.fetch(:version)
|
12
|
+
@revision = options.fetch(:revision, nil)
|
13
|
+
@archive = options.fetch(:archive, "#{@name}-#{@version}")
|
14
|
+
@url = options.fetch(:url)
|
15
|
+
|
16
|
+
@maintainer = options.fetch(:maintainer, nil)
|
17
|
+
|
18
|
+
@provides = options.fetch(:provides, [])
|
19
|
+
@depends = options.fetch(:depends, [])
|
20
|
+
|
21
|
+
@includes = options.fetch(:includes, [])
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/buildozer/version.rb
CHANGED
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'buildozer/builder/exceptions'
|
2
|
+
require 'buildozer/builder/rpm'
|
3
|
+
require 'buildozer/dsl/compiler'
|
4
|
+
require 'buildozer/model/package'
|
5
|
+
require 'test/unit'
|
6
|
+
|
7
|
+
module Buildozer
|
8
|
+
module Builder
|
9
|
+
class TestRpm < Test::Unit::TestCase
|
10
|
+
def setup()
|
11
|
+
@defaults = {
|
12
|
+
:name => "dummy",
|
13
|
+
:version => "1.5.2",
|
14
|
+
:url => "http://localhost/archive.tar.gz",
|
15
|
+
:includes => ["usr/bin"],
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
def base_package(options = {})
|
20
|
+
Model::Package.new(@defaults.merge(options))
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_command_without_maintainer()
|
24
|
+
package = base_package()
|
25
|
+
command = Builder::Rpm.new(package, ".").command()
|
26
|
+
|
27
|
+
assert(command !~ /-m/)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_command_with_maintainer()
|
31
|
+
package = base_package({:maintainer => "Joe Armstrong"})
|
32
|
+
command = Builder::Rpm.new(package, ".").command()
|
33
|
+
|
34
|
+
assert(command =~ /-m "Joe Armstrong"/)
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_package_no_includes()
|
38
|
+
package = base_package({:includes => []})
|
39
|
+
|
40
|
+
assert_raise(Builder::InvalidRpmPackage) do
|
41
|
+
Builder::Rpm.new(package, ".")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'buildozer/dsl'
|
2
|
+
require 'buildozer/dsl/compiler'
|
3
|
+
require 'buildozer/dsl/compiler/exceptions'
|
4
|
+
require 'buildozer/dsl/fragment'
|
5
|
+
require 'test/unit'
|
6
|
+
|
7
|
+
module Buildozer
|
8
|
+
module Dsl
|
9
|
+
class TestCompiler < Test::Unit::TestCase
|
10
|
+
def compile(definition_filename)
|
11
|
+
path = File.expand_path("#{File.dirname(__FILE__)}/../../../resources/#{definition_filename}")
|
12
|
+
fragment = Dsl.load(path)
|
13
|
+
|
14
|
+
return Compiler.compile(fragment)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_compile()
|
18
|
+
definition = compile("definition_full.bd.rb")
|
19
|
+
assert(definition.instance_of?(Model::Definition))
|
20
|
+
|
21
|
+
packages = definition.packages
|
22
|
+
assert_equal(1, packages.size())
|
23
|
+
|
24
|
+
package = packages[0]
|
25
|
+
assert_equal("erlang", package.name)
|
26
|
+
assert_equal("http://www.erlang.org/download/otp_src_R15B03-1.tar.gz", package.url)
|
27
|
+
assert_equal("R15B03", package.version)
|
28
|
+
assert_equal("erlang-R15B03", package.archive)
|
29
|
+
assert_equal("Nu Echo (Matthieu Vachon)", package.maintainer)
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_invalid_fragment_no_type()
|
33
|
+
assert_raise(Compiler::InvalidDslFragment) do
|
34
|
+
Compiler.compile(FakeFragment.new())
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_invalid_fragment_unknown_type()
|
39
|
+
assert_raise(Compiler::InvalidDslFragment) do
|
40
|
+
Compiler.compile(FakeFragmentInvalidType.new())
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_invalid_definition()
|
45
|
+
assert_raise(Compiler::InvalidDslDefinition) do
|
46
|
+
Compiler.compile(Definition.new())
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_no_includes()
|
51
|
+
definition = compile("definition_no_includes.bd.rb")
|
52
|
+
package = definition.packages.first
|
53
|
+
|
54
|
+
assert_equal([], package.includes)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class FakeFragment < Fragment
|
59
|
+
def type()
|
60
|
+
return :fragment
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
class FakeFragmentInvalidType < Fragment
|
65
|
+
def type()
|
66
|
+
return :element
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: buildozer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Matthieu Vachon
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-02-
|
12
|
+
date: 2013-02-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fpm
|
@@ -27,6 +27,22 @@ dependencies:
|
|
27
27
|
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: 0.4.29
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: thor
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 0.17.0
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 0.17.0
|
30
46
|
- !ruby/object:Gem::Dependency
|
31
47
|
name: rake
|
32
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -49,7 +65,8 @@ description: ! " Buildozer is an application that aims to ease the building\
|
|
49
65
|
\ a breeze in a fully automatic manner.\n"
|
50
66
|
email:
|
51
67
|
- matthieu.o.vachon@gmail.com
|
52
|
-
executables:
|
68
|
+
executables:
|
69
|
+
- buildozer
|
53
70
|
extensions: []
|
54
71
|
extra_rdoc_files: []
|
55
72
|
files:
|
@@ -62,9 +79,26 @@ files:
|
|
62
79
|
- LICENSE.txt
|
63
80
|
- README.md
|
64
81
|
- Rakefile
|
82
|
+
- bin/buildozer
|
65
83
|
- buildozer.gemspec
|
66
84
|
- lib/buildozer.rb
|
85
|
+
- lib/buildozer/builder/exceptions.rb
|
86
|
+
- lib/buildozer/builder/rpm.rb
|
87
|
+
- lib/buildozer/cli/buildozer.rb
|
88
|
+
- lib/buildozer/dsl.rb
|
89
|
+
- lib/buildozer/dsl/compiler.rb
|
90
|
+
- lib/buildozer/dsl/compiler/exceptions.rb
|
91
|
+
- lib/buildozer/dsl/compiler/validator.rb
|
92
|
+
- lib/buildozer/dsl/definition.rb
|
93
|
+
- lib/buildozer/dsl/fragment.rb
|
94
|
+
- lib/buildozer/dsl/package.rb
|
95
|
+
- lib/buildozer/model/definition.rb
|
96
|
+
- lib/buildozer/model/package.rb
|
67
97
|
- lib/buildozer/version.rb
|
98
|
+
- test/lib/buildozer/builder/test_rpm.rb
|
99
|
+
- test/lib/buildozer/dsl/test_compiler.rb
|
100
|
+
- test/resources/definition_full.bd.rb
|
101
|
+
- test/resources/definition_no_includes.bd.rb
|
68
102
|
homepage: https://github.com/maoueh/buildozer
|
69
103
|
licenses: []
|
70
104
|
post_install_message:
|
@@ -79,17 +113,24 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
79
113
|
version: '0'
|
80
114
|
segments:
|
81
115
|
- 0
|
82
|
-
hash:
|
116
|
+
hash: 181030610370950058
|
83
117
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
118
|
none: false
|
85
119
|
requirements:
|
86
|
-
- - ! '
|
120
|
+
- - ! '>='
|
87
121
|
- !ruby/object:Gem::Version
|
88
|
-
version:
|
122
|
+
version: '0'
|
123
|
+
segments:
|
124
|
+
- 0
|
125
|
+
hash: 181030610370950058
|
89
126
|
requirements: []
|
90
127
|
rubyforge_project:
|
91
128
|
rubygems_version: 1.8.24
|
92
129
|
signing_key:
|
93
130
|
specification_version: 3
|
94
131
|
summary: Application to build and package software.
|
95
|
-
test_files:
|
132
|
+
test_files:
|
133
|
+
- test/lib/buildozer/builder/test_rpm.rb
|
134
|
+
- test/lib/buildozer/dsl/test_compiler.rb
|
135
|
+
- test/resources/definition_full.bd.rb
|
136
|
+
- test/resources/definition_no_includes.bd.rb
|