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 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
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'buildozer/cli/buildozer'
4
+
5
+ Buildozer::Cli::Buildozer.start()
data/buildozer.gemspec CHANGED
@@ -26,6 +26,7 @@ Gem::Specification.new do |gem|
26
26
  gem.require_paths = ["lib"]
27
27
 
28
28
  gem.add_dependency "fpm", "~> 0.4.29"
29
+ gem.add_dependency "thor", "~> 0.17.0"
29
30
 
30
31
  gem.add_development_dependency "rake", "~> 10.0.3"
31
32
  end
data/lib/buildozer.rb CHANGED
@@ -1,5 +1,3 @@
1
- require 'buildozer'
2
1
 
3
2
  module Buildozer
4
-
5
3
  end
@@ -0,0 +1,6 @@
1
+ module Buildozer
2
+ module Builder
3
+ class InvalidRpmPackage < StandardError
4
+ end
5
+ end
6
+ end
@@ -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,14 @@
1
+ module Buildozer
2
+ module Dsl
3
+ module Compiler
4
+ class InvalidDslFragment < StandardError
5
+ end
6
+
7
+ class InvalidDslDefinition < InvalidDslFragment
8
+ end
9
+
10
+ class InvalidDslPackage < InvalidDslFragment
11
+ end
12
+ end
13
+ end
14
+ 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,11 @@
1
+ module Buildozer
2
+ module Model
3
+ class Definition
4
+ attr_accessor :packages
5
+
6
+ def initialize(options)
7
+ @packages = options.fetch(:packages)
8
+ end
9
+ end
10
+ end
11
+ 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
@@ -1,3 +1,3 @@
1
1
  module Buildozer
2
- VERSION = "1.0.0.dev1"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -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
@@ -0,0 +1,12 @@
1
+
2
+ package "erlang" do
3
+ url "http://www.erlang.org/download/otp_src_R15B03-1.tar.gz"
4
+ version "R15B03"
5
+ maintainer "Nu Echo (Matthieu Vachon)"
6
+
7
+ provides "erlang"
8
+
9
+ depends "libc.so6"
10
+
11
+ includes "usr/bin"
12
+ end
@@ -0,0 +1,10 @@
1
+
2
+ package "erlang" do
3
+ url "http://www.erlang.org/download/otp_src_R15B03-1.tar.gz"
4
+ version "R15B03"
5
+ maintainer "Nu Echo (Matthieu Vachon)"
6
+
7
+ provides "erlang"
8
+
9
+ depends "libc.so6"
10
+ 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.dev1
5
- prerelease: 6
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-18 00:00:00.000000000 Z
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: -2658688478664212903
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: 1.3.1
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