polisher 0.3 → 0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +84 -14
- data/Rakefile +21 -19
- data/TODO +5 -4
- data/bin/server +1 -0
- data/config/polisher.yml +0 -15
- data/db/connection.rb +13 -10
- data/db/migrations/{002_create_managed_gems.rb → 001_create_projects.rb} +4 -5
- data/db/migrations/{001_create_sources.rb → 002_create_sources.rb} +1 -3
- data/db/migrations/003_create_project_source_versions.rb +28 -0
- data/db/migrations/{003_create_events.rb → 004_create_events.rb} +2 -2
- data/db/migrations/005_create_project_dependencies.rb +28 -0
- data/db/models/event.rb +47 -21
- data/db/models/project.rb +110 -0
- data/db/models/project_dependency.rb +27 -0
- data/db/models/project_source_version.rb +31 -0
- data/db/models/source.rb +82 -16
- data/lib/common.rb +37 -5
- data/lib/dsl.rb +292 -0
- data/lib/event_handlers.rb +139 -73
- data/lib/gem_adapter.rb +94 -0
- data/polisher.rb +302 -50
- data/public/stylesheets/style.css +15 -31
- data/spec/common_spec.rb +28 -0
- data/spec/dsl_spec.rb +357 -0
- data/spec/event_handlers_spec.rb +166 -30
- data/spec/gem_adapter_spec.rb +89 -0
- data/spec/models_spec.rb +635 -107
- data/spec/polisher_spec.rb +496 -56
- data/views/layout.haml +3 -5
- data/views/projects/index.haml +42 -0
- data/views/projects/index.html.haml +38 -0
- data/views/result.haml +9 -0
- data/views/sources/index.haml +24 -41
- data/views/sources/index.html.haml +26 -0
- metadata +131 -12
- data/db/models/managed_gem.rb +0 -111
- data/public/javascripts/jquery-1.2.6.min.js +0 -32
- data/public/javascripts/polisher.js +0 -15
- data/views/gems/index.haml +0 -106
data/README.rdoc
CHANGED
@@ -1,35 +1,105 @@
|
|
1
|
-
==
|
1
|
+
== Polisher
|
2
2
|
Copyright (C) 2010 Red Hat, Inc.
|
3
3
|
|
4
4
|
Written by Mohammed Morsi <mmorsi@redhat.com>
|
5
5
|
|
6
6
|
=== Intro
|
7
|
-
Polisher is a
|
8
|
-
|
9
|
-
|
7
|
+
Polisher is a project release management tool which can be used to register various event
|
8
|
+
handlers to be invoked on specific versions of project / source releases. Polisher provides
|
9
|
+
a simple {REST}[http://en.wikipedia.org/wiki/Representational_State_Transfer] interface which
|
10
|
+
to create projects w/ sources and dependencies, and to download and transform them into any
|
11
|
+
target output format.
|
10
12
|
|
11
|
-
Polisher
|
12
|
-
|
13
|
-
|
13
|
+
Polisher also provides a simple {DSL}[http://en.wikipedia.org/wiki/Domain-specific_language]
|
14
|
+
frontend to the REST interface, able to be used to create and trigger elegant release
|
15
|
+
workflows for any number of projects simultaneously. Workflows for many major Ruby based projects
|
16
|
+
have been setup, transforming various versions into {Fedora}[http://fedoraproject.org/] repos and
|
17
|
+
can be found at [http://github.com/movitto/polisher-scripts].
|
14
18
|
|
15
|
-
|
19
|
+
|
20
|
+
== Running
|
16
21
|
To install simply run:
|
17
22
|
|
18
23
|
'gem install polisher'
|
19
24
|
|
25
|
+
|
20
26
|
Alternatively checkout the source from github via
|
21
27
|
|
22
28
|
'git clone git://github.com/movitto/polisher.git'
|
23
29
|
|
24
|
-
|
30
|
+
|
31
|
+
Polisher requires various rubygems to work. gem install should pull in all dependencies
|
32
|
+
but if running polisher from source, be sure to gem install:
|
33
|
+
|
34
|
+
* rubygems
|
35
|
+
* sinatra
|
36
|
+
* libxml
|
37
|
+
* curb
|
38
|
+
* activerecord
|
39
|
+
* libxml
|
40
|
+
|
41
|
+
For the complete list of dependencies, see the
|
42
|
+
{Rakefile}[http://github.com/movitto/polisher/blob/master/Rakefile].
|
43
|
+
|
44
|
+
|
45
|
+
Polisher currently pulls config from the config/ subdir, the database
|
46
|
+
params are defined in database.yml (currently defaulting to a sqlite flat file
|
47
|
+
db residing in db/data), and the general application config resides in
|
48
|
+
polisher.yml. The only general app config currently used is 'gem_api_key',
|
49
|
+
which will be read from ~/.gem/credentials if missing from polisher.yml.
|
50
|
+
|
51
|
+
To run the server, run './bin/server' in the project root.
|
25
52
|
|
26
53
|
To run the spec suite simply run 'rake spec'
|
27
54
|
|
28
|
-
|
29
|
-
in
|
55
|
+
Config is environment specific, the server runs in the 'development' environment
|
56
|
+
by default and the spec suite runs in 'test' by default. To change the environment
|
57
|
+
simply run
|
58
|
+
|
59
|
+
'export RACK_ENV="production"'
|
60
|
+
|
61
|
+
before './bin/server' or 'rake spec', etc
|
30
62
|
|
31
63
|
=== Using
|
32
|
-
|
64
|
+
Run 'rake spec' in the project root to generate the API docs in the doc/ subdir.
|
65
|
+
Also see the spec suite and polisher scripts for more detailed usage.
|
66
|
+
|
67
|
+
When running, the server can be accessed by navigating to 'http://localhost:3000'.
|
68
|
+
REST requests may be issued against that URI and the actions defined in polisher.rb.
|
69
|
+
The DSL sits on top of this REST interface and provides a nice / simple means which
|
70
|
+
to setup projects, sources, release workflows, etc, in an easily reproducable manner.
|
71
|
+
|
72
|
+
At typical DSL use case might look like:
|
73
|
+
|
74
|
+
project :name => "ruby" do |proj|
|
75
|
+
proj.add_archive :name => 'ruby_source', :uri => "ftp://ftp.ruby-lang.org/pub/ruby/%{rubyxver}/ruby-%{arcver}.tar.bz2" do |archive|
|
76
|
+
archive.version "1.8.6", :rubyxver => "1.8", :arcver => "1.8.7-p311", :corresponds_to => proj.version("1.8.6")
|
77
|
+
proj.version "1.9.1", :corresponds_to => archive.version("1.9.1", :rubyxver => "1.9", :arcver => "1.8.7-p300")
|
78
|
+
end
|
79
|
+
proj.add_patch "http://cvs.fedoraproject.org/viewvc/rpms/ruby/F-13/ruby-deadcode.patch?view=markup"
|
80
|
+
# etc...
|
81
|
+
|
82
|
+
proj.on_version "*", "create package"
|
83
|
+
proj.on_version "=", "1.8.6", "update repo", "stable"
|
84
|
+
proj.on_version ">=", "1.9.1", "update repo", "devel"
|
85
|
+
end
|
86
|
+
|
87
|
+
Polisher is a work in progress, and features are being added / removed as neccessary.
|
88
|
+
Comments, bug reports, and patches are all very welcome.
|
89
|
+
|
90
|
+
== Extending
|
91
|
+
Out of the box Polisher is able to handle {Rubygem}[http://rubygems.org/] based projects and
|
92
|
+
generate rpm packages and yum repos on project releases. The
|
93
|
+
{Gemcutter API}[http://rubygems.org/pages/api_docs],
|
94
|
+
{gem2rpm}[http://rubyforge.org/projects/gem2rpm/], and rpm / yum tools are used to
|
95
|
+
accomplish this, though Polisher can be easily extended to support any input / output format.
|
96
|
+
|
97
|
+
The code itself currently has to be modified (most likely will be changed in the future),
|
98
|
+
but to add support for downloading another input source format, extend
|
99
|
+
{source.rb::download_to}[http://github.com/movitto/polisher/blob/master/db/models/source.rb]
|
100
|
+
and optionally add another add_source_type method to the
|
101
|
+
{Polisher::Project DSL}[http://github.com/movitto/polisher/blob/master/lib/dsl.rb].
|
33
102
|
|
34
|
-
|
35
|
-
|
103
|
+
To add another event handler, simple add a new method to the
|
104
|
+
{EventHandlers}[http://github.com/movitto/polisher/blob/master/lib/event_handlers.rb] module.
|
105
|
+
Polisher will take care of the rest.
|
data/Rakefile
CHANGED
@@ -14,23 +14,23 @@ env ||= 'development'
|
|
14
14
|
logger = Logger.new(STDOUT)
|
15
15
|
|
16
16
|
GEM_NAME='polisher'
|
17
|
-
PKG_VERSION='0.
|
17
|
+
PKG_VERSION='0.4'
|
18
18
|
|
19
19
|
namespace :db do
|
20
|
+
desc "Migrate the database"
|
20
21
|
task :migrate do
|
21
|
-
desc "Migrate the database"
|
22
22
|
Polisher::DB.connect Polisher::DB.load_config('./config/database.yml', env), logger
|
23
23
|
Polisher::DB.migrate './db/migrations'
|
24
24
|
end
|
25
25
|
|
26
|
+
desc "Rollback the database"
|
26
27
|
task :rollback do
|
27
|
-
desc "Rollback the database"
|
28
28
|
Polisher::DB.connect Polisher::DB.load_config('./config/database.yml', env), logger
|
29
29
|
Polisher::DB.rollback './db/migrations'
|
30
30
|
end
|
31
31
|
|
32
|
+
desc "Drop all tables in the database"
|
32
33
|
task :drop_tables do
|
33
|
-
desc "Drop all tables in the database"
|
34
34
|
Polisher::DB.connect Polisher::DB.load_config('./config/database.yml', env), logger
|
35
35
|
Polisher::DB.drop_tables './db/migrations'
|
36
36
|
end
|
@@ -46,24 +46,14 @@ Spec::Rake::SpecTask.new('spec' => ['test_env', 'db:drop_tables', 'db:migrate'])
|
|
46
46
|
t.spec_files = FileList['spec/*_spec.rb']
|
47
47
|
end
|
48
48
|
|
49
|
-
task :rdoc do
|
50
|
-
desc "Create RDoc documentation"
|
51
|
-
system "rdoc --title 'Polisher documentation' lib/"
|
52
|
-
end
|
53
|
-
|
54
49
|
Rake::RDocTask.new do |rd|
|
55
50
|
rd.main = "README.rdoc"
|
56
51
|
rd.rdoc_dir = "doc/site/api"
|
57
|
-
rd.rdoc_files.include("README.rdoc", "polisher.rb", "db
|
52
|
+
rd.rdoc_files.include("README.rdoc", "polisher.rb", "db/models/*.rb", "lib/**/*.rb")
|
58
53
|
end
|
59
54
|
|
60
|
-
|
61
|
-
|
62
|
-
system "gem build polisher.gemspec"
|
63
|
-
end
|
64
|
-
|
65
|
-
PKG_FILES = FileList['bin/*', 'config/*.yml', 'config.ru', 'COPYING',
|
66
|
-
'db/**/*.rb', 'lib/**/*.rb', 'LICENSE', 'polisher.rb', 'public/**/*', 'Rakefile',
|
55
|
+
PKG_FILES = FileList['bin/*', 'config/*.yml', 'config.ru', 'COPYING',
|
56
|
+
'db/**/*.rb', 'lib/**/*.rb', 'LICENSE', 'polisher.rb', 'public/**/*', 'Rakefile',
|
67
57
|
'README.rdoc', 'spec/**/*.rb', 'TODO', 'views/**/*.haml']
|
68
58
|
|
69
59
|
DIST_FILES = FileList[
|
@@ -78,11 +68,23 @@ SPEC = Gem::Specification.new do |s|
|
|
78
68
|
s.required_ruby_version = '>= 1.8.1'
|
79
69
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.3.3")
|
80
70
|
|
71
|
+
s.add_dependency('sinatra', '>= 0.9.4')
|
72
|
+
s.add_dependency('thin', '>= 1.2.7')
|
73
|
+
s.add_dependency('activerecord', '>= 2.3.5')
|
74
|
+
s.add_dependency('haml', '>= 2.2.20')
|
75
|
+
s.add_dependency('curb', '>= 0.6.7') # eg curl
|
76
|
+
s.add_dependency('libxml-ruby', '>= 1.1.3')
|
77
|
+
s.add_dependency('rest-client', '>= 1.4.2')
|
78
|
+
s.add_dependency('json_pure', '>= 1.2.0')
|
79
|
+
s.add_dependency('gem2rpm', '>= 0.6.0')
|
80
|
+
s.add_dependency('rspec', '>= 1.3.0')
|
81
|
+
s.add_dependency('rack-test', '>= 0.5.3')
|
82
|
+
|
81
83
|
s.author = "Mohammed Morsi"
|
82
84
|
s.email = "mmorsi@redhat.com"
|
83
85
|
s.date = %q{2010-03-11}
|
84
|
-
s.
|
85
|
-
s.
|
86
|
+
s.summary = "A project release management tool"
|
87
|
+
s.description = "Polisher provides simple REST and DSL interfaces allowing you to configure event workflows to be invoked on specific versions of project/source releases"
|
86
88
|
s.homepage = "http://github.com/movitto/polisher"
|
87
89
|
end
|
88
90
|
|
data/TODO
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
- Remaining TODO's, FIXME's, etc
|
2
|
-
-
|
3
|
-
- More event handlers, generic handler interface,
|
2
|
+
- Parallelism w/ syncronization locks needed! (on all shared artifacts, db objects)
|
3
|
+
- More event handlers, generic handler interface,
|
4
4
|
workflow integration to automatically chain handlers together
|
5
|
-
-
|
6
|
-
|
5
|
+
- Generic source download interface, easily be able to download sources via and
|
6
|
+
number of mechanisms, and perform pre-release transformations (taring a source
|
7
|
+
checkout for example)
|
data/bin/server
CHANGED
data/config/polisher.yml
CHANGED
@@ -1,20 +1,5 @@
|
|
1
1
|
development:
|
2
|
-
gem_api_key: "YOUR GEMCUTTER API KEY HERE"
|
3
|
-
email_from: "foo@example.host"
|
4
|
-
email_server: "localhost"
|
5
|
-
email_subject: "gem #{gem_name} updated"
|
6
|
-
email_body: "gem #{gem_name} updated"
|
7
2
|
|
8
3
|
test:
|
9
|
-
gem_api_key: "YOUR GEMCUTTER API KEY HERE"
|
10
|
-
email_from: "foo@example.host"
|
11
|
-
email_server: "localhost"
|
12
|
-
email_subject: "gem #{gem_name} updated"
|
13
|
-
email_body: "gem #{gem_name} updated"
|
14
4
|
|
15
5
|
production:
|
16
|
-
gem_api_key: "YOUR GEMCUTTER API KEY HERE"
|
17
|
-
email_from: "foo@example.host"
|
18
|
-
email_server: "localhost"
|
19
|
-
email_subject: "gem #{gem_name} updated"
|
20
|
-
email_body: "gem #{gem_name} updated"
|
data/db/connection.rb
CHANGED
@@ -7,9 +7,9 @@
|
|
7
7
|
# it under the terms of the GNU Affero General Public License
|
8
8
|
# as published by the Free Software Foundation, either version 3
|
9
9
|
# of the License, or (at your option) any later version.
|
10
|
-
#
|
10
|
+
#
|
11
11
|
# You should have received a copy of the the GNU Affero
|
12
|
-
# General Public License, along with Polisher. If not, see
|
12
|
+
# General Public License, along with Polisher. If not, see
|
13
13
|
# <http://www.gnu.org/licenses/>
|
14
14
|
|
15
15
|
require 'active_record'
|
@@ -18,28 +18,31 @@ Dir[File.dirname(__FILE__) + '/models/*.rb'].each { |model| require model }
|
|
18
18
|
|
19
19
|
module Polisher
|
20
20
|
module DB
|
21
|
-
|
21
|
+
|
22
|
+
# Load db config from specified file / environment
|
22
23
|
def self.load_config(file_path, env = 'development')
|
23
24
|
YAML::load(File.open(file_path))[env.to_s]
|
24
25
|
end
|
25
|
-
|
26
|
+
|
27
|
+
# Connect to database specified in config
|
26
28
|
def self.connect(config, logger)
|
27
29
|
ActiveRecord::Base.logger = logger
|
28
30
|
ActiveRecord::Base.establish_connection config
|
29
31
|
end
|
30
|
-
|
32
|
+
|
33
|
+
# Perform any outstanding db migrations
|
31
34
|
def self.migrate(migrations_dir)
|
32
35
|
ActiveRecord::Migration.verbose = true
|
33
36
|
ActiveRecord::Migrator.migrate(migrations_dir)
|
34
|
-
end
|
35
|
-
|
36
|
-
#
|
37
|
+
end
|
38
|
+
|
39
|
+
# Perform a single polisher db rollback
|
37
40
|
def self.rollback(migrations_dir)
|
38
41
|
ActiveRecord::Migration.verbose = true
|
39
42
|
ActiveRecord::Migrator.rollback(migrations_dir)
|
40
|
-
end
|
43
|
+
end
|
41
44
|
|
42
|
-
#
|
45
|
+
# Drop all tables in the db
|
43
46
|
def self.drop_tables(migrations_dir)
|
44
47
|
ActiveRecord::Migration.verbose = true
|
45
48
|
ActiveRecord::Migrator.down(migrations_dir, 0)
|
@@ -10,15 +10,14 @@
|
|
10
10
|
# General Public License, along with Polisher. If not, see
|
11
11
|
# <http://www.gnu.org/licenses/>
|
12
12
|
|
13
|
-
class
|
13
|
+
class CreateProjects < ActiveRecord::Migration
|
14
14
|
def self.up
|
15
|
-
create_table :
|
16
|
-
t.string
|
17
|
-
t.references :source
|
15
|
+
create_table :projects do |t|
|
16
|
+
t.string :name
|
18
17
|
end
|
19
18
|
end
|
20
19
|
|
21
20
|
def self.down
|
22
|
-
drop_table :
|
21
|
+
drop_table :projects
|
23
22
|
end
|
24
23
|
end
|
@@ -14,11 +14,9 @@ class CreateSources < ActiveRecord::Migration
|
|
14
14
|
def self.up
|
15
15
|
create_table :sources do |t|
|
16
16
|
t.string :name
|
17
|
+
t.string :source_type
|
17
18
|
t.string :uri
|
18
19
|
end
|
19
|
-
|
20
|
-
# create entry for the official gemcutter repo
|
21
|
-
Source.create :name => "gemcutter", :uri => "http://gemcutter.org"
|
22
20
|
end
|
23
21
|
|
24
22
|
def self.down
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Copyright (C) 2010 Red Hat, Inc.
|
2
|
+
# Written by Mohammed Morsi <mmorsi@redhat.com>
|
3
|
+
#
|
4
|
+
# This program is free software, you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU Affero General Public License
|
6
|
+
# as published by the Free Software Foundation, either version 3
|
7
|
+
# of the License, or (at your option) any later version.
|
8
|
+
#
|
9
|
+
# You should have received a copy of the the GNU Affero
|
10
|
+
# General Public License, along with Polisher. If not, see
|
11
|
+
# <http://www.gnu.org/licenses/>
|
12
|
+
|
13
|
+
class CreateProjectSourceVersions < ActiveRecord::Migration
|
14
|
+
def self.up
|
15
|
+
create_table :project_source_versions do |t|
|
16
|
+
t.references :project
|
17
|
+
t.references :source
|
18
|
+
t.boolean :primary_source, :default => false
|
19
|
+
t.string :project_version
|
20
|
+
t.string :source_version
|
21
|
+
t.string :source_uri_params
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.down
|
26
|
+
drop_table :project_source_versions
|
27
|
+
end
|
28
|
+
end
|
@@ -13,9 +13,9 @@
|
|
13
13
|
class CreateEvents < ActiveRecord::Migration
|
14
14
|
def self.up
|
15
15
|
create_table :events do |t|
|
16
|
-
t.references :
|
16
|
+
t.references :project
|
17
17
|
t.string :process
|
18
|
-
t.string :
|
18
|
+
t.string :version
|
19
19
|
t.string :version_qualifier
|
20
20
|
t.string :process_options
|
21
21
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Copyright (C) 2010 Red Hat, Inc.
|
2
|
+
# Written by Mohammed Morsi <mmorsi@redhat.com>
|
3
|
+
#
|
4
|
+
# This program is free software, you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU Affero General Public License
|
6
|
+
# as published by the Free Software Foundation, either version 3
|
7
|
+
# of the License, or (at your option) any later version.
|
8
|
+
#
|
9
|
+
# You should have received a copy of the the GNU Affero
|
10
|
+
# General Public License, along with Polisher. If not, see
|
11
|
+
# <http://www.gnu.org/licenses/>
|
12
|
+
|
13
|
+
class CreateProjectDependencies < ActiveRecord::Migration
|
14
|
+
def self.up
|
15
|
+
create_table :project_dependencies do |t|
|
16
|
+
t.references :project
|
17
|
+
t.string :project_version, :default => nil
|
18
|
+
|
19
|
+
t.integer :depends_on_project_id
|
20
|
+
t.string :depends_on_project_version, :default => nil
|
21
|
+
t.string :depends_on_project_params
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.down
|
26
|
+
drop_table :project_dependencies
|
27
|
+
end
|
28
|
+
end
|
data/db/models/event.rb
CHANGED
@@ -10,32 +10,48 @@
|
|
10
10
|
# General Public License, along with Polisher. If not, see
|
11
11
|
# <http://www.gnu.org/licenses/>
|
12
12
|
|
13
|
+
require 'lib/event_handlers'
|
14
|
+
|
13
15
|
class Event < ActiveRecord::Base
|
14
|
-
|
15
|
-
|
16
|
+
include EventHandlers
|
17
|
+
|
18
|
+
belongs_to :project
|
16
19
|
|
17
|
-
validates_presence_of
|
20
|
+
validates_presence_of :project_id
|
21
|
+
validates_presence_of :process
|
18
22
|
|
19
|
-
#
|
23
|
+
# Dynamically generate from methods we define in the lib/event_handlers module.
|
24
|
+
# Add more methods to that module for them to appear here
|
20
25
|
def self.processes
|
21
|
-
|
26
|
+
EventHandlers.public_instance_methods.collect { |m| m.to_s }
|
22
27
|
end
|
23
28
|
|
24
|
-
#
|
29
|
+
# XXX FIXME we need this for security
|
30
|
+
#validates_inclusion_of :process, :in => Event.processes
|
31
|
+
|
32
|
+
# Version qualifiers
|
25
33
|
VERSION_QUALIFIERS = ['', '=', '>', '<', '>=', '<=']
|
26
34
|
|
27
35
|
validates_inclusion_of :version_qualifier, :in => VERSION_QUALIFIERS,
|
28
36
|
:if => Proc.new { |e| !e.version_qualifier.nil? }
|
29
37
|
|
30
|
-
|
38
|
+
# nil version and version_qualifier indicates event will be run for _all_ versons
|
39
|
+
|
40
|
+
validates_presence_of :version,
|
31
41
|
:if => Proc.new { |e| !e.version_qualifier.nil? }
|
32
42
|
|
33
43
|
validates_presence_of :version_qualifier,
|
34
|
-
:if => Proc.new { |e| !e.
|
44
|
+
:if => Proc.new { |e| !e.version.nil? }
|
45
|
+
|
46
|
+
# Determine if event applies to specified version
|
47
|
+
def applies_to_version?(cversion)
|
48
|
+
raise ArgumentError, "valid event version #{version} and version #{cversion} required" unless (version.nil? || version.class == String) && cversion.class == String
|
49
|
+
|
50
|
+
# XXX remove any non-numeric chars from the version number (eg if a version has a '-beta' or whatnot, not pretty but works for now
|
51
|
+
cversion.gsub(/[a-zA-Z]*/, '')
|
35
52
|
|
36
|
-
|
37
|
-
|
38
|
-
gv, ev = version.to_f, gem_version.to_f
|
53
|
+
# TODO this will evaluate to false "1.1" = "1.1.0" here, is this correct? (implement this in a more robust way, eg split version into array around delims, compare each array elements w/ special case handling)
|
54
|
+
gv, ev = cversion, version
|
39
55
|
return (["", nil].include? version_qualifier ) ||
|
40
56
|
(version_qualifier == "=" && gv == ev) ||
|
41
57
|
(version_qualifier == ">" && gv > ev) ||
|
@@ -44,18 +60,28 @@ class Event < ActiveRecord::Base
|
|
44
60
|
(version_qualifier == "<=" && gv <= ev)
|
45
61
|
end
|
46
62
|
|
47
|
-
#
|
48
|
-
|
49
|
-
|
50
|
-
|
63
|
+
# Run the event, :version should be passed in via args; any other keys/values are optional
|
64
|
+
# and will be forwarded onto the event handler
|
65
|
+
def run(args = {})
|
66
|
+
version = args[:version]
|
67
|
+
raise ArgumentError, "must specify version when running event" if version.nil?
|
51
68
|
|
52
|
-
|
53
|
-
|
69
|
+
handler = nil
|
70
|
+
begin
|
71
|
+
# covert process to method name
|
72
|
+
handler = method(process.intern)
|
73
|
+
rescue NameError => e
|
74
|
+
raise ArgumentError, "could not find event handler #{process}"
|
75
|
+
end
|
54
76
|
|
55
|
-
#
|
56
|
-
|
77
|
+
# generate array of event params from project, the event itself, the version being run, and any optional params passed in
|
78
|
+
event_params = [self, version, args]
|
57
79
|
|
58
|
-
|
59
|
-
|
80
|
+
begin
|
81
|
+
# invoke
|
82
|
+
handler.call *event_params
|
83
|
+
rescue Exception => e
|
84
|
+
raise RuntimeError, "error when running event handler #{process}: #{e}"
|
85
|
+
end
|
60
86
|
end
|
61
87
|
end
|