baldrick 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +5 -0
- data/Manifest.txt +18 -0
- data/README.rdoc +98 -0
- data/Rakefile +30 -0
- data/lib/baldrick.rb +17 -0
- data/lib/baldrick/command.rb +53 -0
- data/lib/baldrick/listeners/feed_listener.rb +25 -0
- data/lib/baldrick/listeners/feed_orders.rb +23 -0
- data/lib/baldrick/listeners/injour_listener.rb +34 -0
- data/lib/baldrick/listeners/xpath_locator.rb +37 -0
- data/lib/baldrick/run_servant.rb +22 -0
- data/lib/baldrick/servant.rb +40 -0
- data/lib/baldrick/task.rb +16 -0
- data/lib/baldrick_serve.rb +3 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/tasks/rspec.rake +21 -0
- metadata +133 -0
data/History.txt
ADDED
data/Manifest.txt
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
History.txt
|
2
|
+
Manifest.txt
|
3
|
+
README.rdoc
|
4
|
+
Rakefile
|
5
|
+
lib/baldrick.rb
|
6
|
+
lib/baldrick_serve.rb
|
7
|
+
lib/baldrick/command.rb
|
8
|
+
lib/baldrick/run_servant.rb
|
9
|
+
lib/baldrick/servant.rb
|
10
|
+
lib/baldrick/task.rb
|
11
|
+
lib/baldrick/listeners/feed_listener.rb
|
12
|
+
lib/baldrick/listeners/feed_orders.rb
|
13
|
+
lib/baldrick/listeners/injour_listener.rb
|
14
|
+
lib/baldrick/listeners/xpath_locator.rb
|
15
|
+
script/console
|
16
|
+
script/destroy
|
17
|
+
script/generate
|
18
|
+
tasks/rspec.rake
|
data/README.rdoc
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
= Baldrick
|
2
|
+
|
3
|
+
* http://github.com/brentsnook/baldrick
|
4
|
+
|
5
|
+
A dogsbody. Does what you tell it.
|
6
|
+
|
7
|
+
Baldrick recognises orders and then performs appropriate tasks.
|
8
|
+
Baldrick acts as the glue between the source of the order (for example a twitter Atom feed) and the task you would like performed (put the kettle on).
|
9
|
+
|
10
|
+
== Installation
|
11
|
+
|
12
|
+
<em>Note: the rubyforge project application is currently being considered. First gem should be up within a few days. Please build yourself in the meantime - 2009-02-23</em>
|
13
|
+
|
14
|
+
Make Baldrick cower 'neath *your* boot:
|
15
|
+
|
16
|
+
sudo gem install baldrick
|
17
|
+
|
18
|
+
If you want to use the injour listener you will also need to install injour[http://github.com/arunthampi/injour]
|
19
|
+
|
20
|
+
=== Building the Gem yourself
|
21
|
+
|
22
|
+
Grab the code from github:
|
23
|
+
|
24
|
+
git clone git://github.com/brentsnook/baldrick.git
|
25
|
+
cd baldrick
|
26
|
+
rake install_gem
|
27
|
+
|
28
|
+
== How does it work?
|
29
|
+
|
30
|
+
You tell Baldrick:
|
31
|
+
|
32
|
+
* how to perform tasks
|
33
|
+
* which tasks will be performed when a particular order is received
|
34
|
+
* where to listen for new orders
|
35
|
+
|
36
|
+
Baldrick keeps an ear out at the places you tell it to listen and then does its thing.
|
37
|
+
|
38
|
+
To tell Baldrick to print out a list of people in the twitterverse who desire a tasty beverage:
|
39
|
+
|
40
|
+
#cuppa.rb
|
41
|
+
require 'rubygems'
|
42
|
+
require 'baldrick_serve'
|
43
|
+
|
44
|
+
listen_to :feed, :at => 'http://search.twitter.com/search.atom?q=cup+of'
|
45
|
+
|
46
|
+
on_hearing /cup of (.*?)[\.,]/ do |beverage, order|
|
47
|
+
puts "#{order[:who]} would like a cup of #{beverage}"
|
48
|
+
end
|
49
|
+
|
50
|
+
Just run the script and the magic ruby fairies will take care of the rest:
|
51
|
+
|
52
|
+
ruby cuppa.rb
|
53
|
+
|
54
|
+
Dismiss Baldrick with <tt>CTRL C</tt>.
|
55
|
+
|
56
|
+
== How does it all work?
|
57
|
+
|
58
|
+
The regex describes the phrase that triggers the task, the contents of any capturing groups are passed to the body of your task along with the order.
|
59
|
+
The order contains *who*, *what*, *where* and *when*.
|
60
|
+
|
61
|
+
Check out http://wiki.github.com/brentsnook/baldrick for details.
|
62
|
+
|
63
|
+
== What is it good for?
|
64
|
+
|
65
|
+
Don't look at me, I just made it. How about these for suggestions?
|
66
|
+
|
67
|
+
* do cool stuff based on injour[http://github.com/arunthampi/injour] statuses
|
68
|
+
* do cool stuff based on web (RSS/Atom) feeds
|
69
|
+
* do cool stuff with an {Arduino board}[http://www.arduino.cc/]
|
70
|
+
* control a continuous integration build light
|
71
|
+
* control a nuclear power plant
|
72
|
+
|
73
|
+
I'd love to hear what you use it for.
|
74
|
+
|
75
|
+
== License
|
76
|
+
|
77
|
+
(The MIT License)
|
78
|
+
|
79
|
+
Copyright (c) 2009 Brent Snook http://fuglylogic.com
|
80
|
+
|
81
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
82
|
+
a copy of this software and associated documentation files (the
|
83
|
+
'Software'), to deal in the Software without restriction, including
|
84
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
85
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
86
|
+
permit persons to whom the Software is furnished to do so, subject to
|
87
|
+
the following conditions:
|
88
|
+
|
89
|
+
The above copyright notice and this permission notice shall be
|
90
|
+
included in all copies or substantial portions of the Software.
|
91
|
+
|
92
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
93
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
94
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
95
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
96
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
97
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
98
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
%w[rubygems rake rake/clean fileutils newgem rubigen].each { |f| require f }
|
2
|
+
require File.dirname(__FILE__) + '/lib/baldrick'
|
3
|
+
|
4
|
+
# Generate all the Rake tasks
|
5
|
+
# Run 'rake -T' to see list of generated tasks (from gem root directory)
|
6
|
+
$hoe = Hoe.new('baldrick', Baldrick::VERSION) do |p|
|
7
|
+
p.developer 'Brent Snook', 'brent@fuglylogic.com'
|
8
|
+
p.summary = %q{Does what you tell it - glues orders to tasks.}
|
9
|
+
p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
|
10
|
+
p.rubyforge_name = p.name
|
11
|
+
p.extra_deps = [
|
12
|
+
['nokogiri','>= 1.1.1'],
|
13
|
+
]
|
14
|
+
p.extra_dev_deps = [
|
15
|
+
['newgem', ">= #{::Newgem::VERSION}"],
|
16
|
+
['rspec', '>= 1.1.12'],
|
17
|
+
['cucumber', '>= 0.1.16'],
|
18
|
+
['injour', '>= 0.2.3'],
|
19
|
+
]
|
20
|
+
|
21
|
+
p.clean_globs |= %w[**/.DS_Store tmp *.log]
|
22
|
+
path = (p.rubyforge_name == p.name) ? p.rubyforge_name : "\#{p.rubyforge_name}/\#{p.name}"
|
23
|
+
p.remote_rdoc_dir = File.join(path.gsub(/^#{p.rubyforge_name}\/?/,''), 'rdoc')
|
24
|
+
p.rsync_args = '-av --delete --ignore-errors'
|
25
|
+
end
|
26
|
+
|
27
|
+
require 'newgem/tasks' # load /tasks/*.rake
|
28
|
+
Dir['tasks/**/*.rake'].each { |t| load t }
|
29
|
+
|
30
|
+
task :default => [:spec, :features]
|
data/lib/baldrick.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
|
+
|
4
|
+
module Baldrick
|
5
|
+
VERSION = '0.0.1'
|
6
|
+
end
|
7
|
+
|
8
|
+
require 'baldrick/listeners/xpath_locator'
|
9
|
+
require 'baldrick/listeners/injour_listener'
|
10
|
+
require 'baldrick/listeners/feed_listener'
|
11
|
+
require 'baldrick/listeners/feed_orders'
|
12
|
+
|
13
|
+
require 'baldrick/servant'
|
14
|
+
require 'baldrick/task'
|
15
|
+
|
16
|
+
require 'baldrick/command'
|
17
|
+
require 'baldrick/run_servant'
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
module Baldrick
|
4
|
+
class Command
|
5
|
+
include Singleton
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@listener_classes = {:injour => Listeners::InjourListener, :feed => Listeners::FeedListener}
|
9
|
+
@servant = Servant.new
|
10
|
+
@wait_period = 2
|
11
|
+
@should_serve = true
|
12
|
+
end
|
13
|
+
|
14
|
+
def execute(stdout)
|
15
|
+
stdout << "Servant started...\n"; stdout.flush
|
16
|
+
while should_serve? do
|
17
|
+
@servant.serve
|
18
|
+
sleep @wait_period
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def should_serve?
|
23
|
+
@should_serve
|
24
|
+
end
|
25
|
+
|
26
|
+
def stop!
|
27
|
+
@should_serve = false
|
28
|
+
end
|
29
|
+
|
30
|
+
def listen_every period
|
31
|
+
@wait_period = period
|
32
|
+
end
|
33
|
+
|
34
|
+
def listen_to listener_type, options={}
|
35
|
+
listener_class = listener_class_for(listener_type) || raise("No order listener implementation found for #{listener_type}")
|
36
|
+
@servant.add_listener(listener_class.new(options))
|
37
|
+
end
|
38
|
+
|
39
|
+
def on_hearing(matcher, &procedure)
|
40
|
+
@servant.add_task Task.new(matcher, procedure)
|
41
|
+
end
|
42
|
+
alias :to :on_hearing
|
43
|
+
|
44
|
+
def register_listener_type type, listener_class
|
45
|
+
@listener_classes[type] = listener_class
|
46
|
+
end
|
47
|
+
|
48
|
+
def listener_class_for type
|
49
|
+
@listener_classes[type]
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
|
3
|
+
module Baldrick::Listeners
|
4
|
+
class FeedListener
|
5
|
+
|
6
|
+
def initialize options
|
7
|
+
@url = options[:at]
|
8
|
+
# just don't go trying to consume feeds before 1970
|
9
|
+
@time_of_last_order = Time.at 0
|
10
|
+
end
|
11
|
+
|
12
|
+
def orders
|
13
|
+
content = open(@url){|f| f.read}
|
14
|
+
select_new_orders_from FeedOrders.within(content)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def select_new_orders_from orders
|
20
|
+
new_orders = orders.select {|order| order[:when] and order[:when] > @time_of_last_order}
|
21
|
+
@time_of_last_order = new_orders.collect {|order| order[:when]}.sort.last || @time_of_last_order
|
22
|
+
new_orders
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Baldrick::Listeners
|
2
|
+
|
3
|
+
class FeedOrders
|
4
|
+
|
5
|
+
def self.within xml
|
6
|
+
XPathLocator.from_xml(xml).find_nodes_matching('//item', '//entry').collect {|item| order_from item}
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def self.order_from item
|
12
|
+
locator = XPathLocator.from_node item
|
13
|
+
publish_time = locator.find_text_matching 'published/text()', 'pubDate/text()', 'date/text()', 'updated/text()'
|
14
|
+
{
|
15
|
+
:what => item.to_s,
|
16
|
+
:who => locator.find_text_matching('author/name/text()', 'author/text()'),
|
17
|
+
:when => publish_time ? Time.parse(publish_time) : nil,
|
18
|
+
:where => locator.find_text_matching('link/text()', "link[@rel='alternate']/@href")
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Baldrick::Listeners
|
2
|
+
class InjourListener
|
3
|
+
|
4
|
+
def initialize options = {}
|
5
|
+
@last_orders = {}
|
6
|
+
end
|
7
|
+
|
8
|
+
def orders
|
9
|
+
order_pattern = /=== (.*?) on (.*?) ===\n\* \[(.*?)\] (.*?)\n/m
|
10
|
+
all_orders = `injour ls`.scan(order_pattern).collect do |match|
|
11
|
+
{
|
12
|
+
:who => match[0],
|
13
|
+
:where => match[1],
|
14
|
+
:when => Time.parse(match[2]),
|
15
|
+
:what => match[3]
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
select_new_orders_from all_orders
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def select_new_orders_from all_orders
|
25
|
+
new_orders = all_orders.reject do |order|
|
26
|
+
who = order[:who]
|
27
|
+
previous_order = @last_orders[who]
|
28
|
+
@last_orders[who] = order
|
29
|
+
!previous_order.nil? and previous_order == order
|
30
|
+
end
|
31
|
+
new_orders
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
|
3
|
+
module Baldrick::Listeners
|
4
|
+
|
5
|
+
class XPathLocator
|
6
|
+
|
7
|
+
def self.from_xml xml
|
8
|
+
from_node Nokogiri::XML(strip_default_namespaces_from xml)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.from_node node
|
12
|
+
self.new node
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize node
|
16
|
+
@doc = node
|
17
|
+
end
|
18
|
+
|
19
|
+
def find_text_matching *paths
|
20
|
+
matches = find_nodes_matching *paths
|
21
|
+
matches.first.text unless matches.empty?
|
22
|
+
end
|
23
|
+
|
24
|
+
def find_nodes_matching *paths
|
25
|
+
@doc.search *paths || []
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
# need to do this so that default namespaced elements can be located
|
31
|
+
# http://nokogiri.lighthouseapp.com/projects/19607/tickets/8-nokogirixml-str-not-allow-an-xpath-result
|
32
|
+
# has to be a better way though
|
33
|
+
def self.strip_default_namespaces_from xml
|
34
|
+
xml.gsub /xmlns="[^"]*"/, ''
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Baldrick
|
2
|
+
module RunServant
|
3
|
+
|
4
|
+
def self.included clazz
|
5
|
+
# register shutdown hook ONLY when the module is included
|
6
|
+
at_exit do
|
7
|
+
raise $! if $!
|
8
|
+
Baldrick::Command.instance.execute STDOUT
|
9
|
+
end
|
10
|
+
|
11
|
+
trap(:INT) do
|
12
|
+
Baldrick::Command.instance.stop!
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# send configuration messages to the command
|
17
|
+
def method_missing name, *args, &block
|
18
|
+
Baldrick::Command.instance.respond_to?(name) ? Baldrick::Command.instance.send(name, *args, &block) : super(name, args)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Baldrick
|
2
|
+
|
3
|
+
class Servant
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@tasks, @listeners = [], []
|
7
|
+
end
|
8
|
+
|
9
|
+
def add_task task
|
10
|
+
@tasks << task
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_listener listener
|
14
|
+
@listeners << listener
|
15
|
+
end
|
16
|
+
|
17
|
+
def serve
|
18
|
+
orders.each {|order| follow order}
|
19
|
+
end
|
20
|
+
|
21
|
+
def follow order
|
22
|
+
@tasks.each{|task| task.run order}
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def orders
|
28
|
+
@listeners.inject([]) do |all_orders, listener|
|
29
|
+
begin
|
30
|
+
all_orders + listener.orders
|
31
|
+
rescue Exception => exception
|
32
|
+
puts exception
|
33
|
+
all_orders
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Baldrick
|
2
|
+
class Task
|
3
|
+
def initialize(matcher, procedure)
|
4
|
+
@matcher, @procedure = matcher, procedure
|
5
|
+
end
|
6
|
+
|
7
|
+
def run order
|
8
|
+
if matches = @matcher.match(order[:what])
|
9
|
+
all_arguments = matches[1..-1] << order
|
10
|
+
accepted_arguments = all_arguments[0..(@procedure.arity - 1)]
|
11
|
+
@procedure.call(*accepted_arguments)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
data/script/console
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# File: script/console
|
3
|
+
irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
|
4
|
+
|
5
|
+
libs = " -r irb/completion"
|
6
|
+
# Perhaps use a console_lib to store any extra methods I may want available in the cosole
|
7
|
+
# libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
|
8
|
+
libs << " -r #{File.dirname(__FILE__) + '/../lib/baldrick.rb'}"
|
9
|
+
puts "Loading baldrick gem"
|
10
|
+
exec "#{irb} #{libs} --simple-prompt"
|
data/script/destroy
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/destroy'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
+
RubiGen::Scripts::Destroy.new.run(ARGV)
|
data/script/generate
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/generate'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
+
RubiGen::Scripts::Generate.new.run(ARGV)
|
data/tasks/rspec.rake
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
begin
|
2
|
+
require 'spec'
|
3
|
+
rescue LoadError
|
4
|
+
require 'rubygems'
|
5
|
+
require 'spec'
|
6
|
+
end
|
7
|
+
begin
|
8
|
+
require 'spec/rake/spectask'
|
9
|
+
rescue LoadError
|
10
|
+
puts <<-EOS
|
11
|
+
To use rspec for testing you must install rspec gem:
|
12
|
+
gem install rspec
|
13
|
+
EOS
|
14
|
+
exit(0)
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "Run the specs under spec/models"
|
18
|
+
Spec::Rake::SpecTask.new do |t|
|
19
|
+
t.spec_opts = ['--options', "spec/spec.opts"]
|
20
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
21
|
+
end
|
metadata
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: baldrick
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Brent Snook
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-02-24 00:00:00 +11:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: nokogiri
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 1.1.1
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: newgem
|
27
|
+
type: :development
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.2.3
|
34
|
+
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: rspec
|
37
|
+
type: :development
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 1.1.12
|
44
|
+
version:
|
45
|
+
- !ruby/object:Gem::Dependency
|
46
|
+
name: cucumber
|
47
|
+
type: :development
|
48
|
+
version_requirement:
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.1.16
|
54
|
+
version:
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: injour
|
57
|
+
type: :development
|
58
|
+
version_requirement:
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: 0.2.3
|
64
|
+
version:
|
65
|
+
- !ruby/object:Gem::Dependency
|
66
|
+
name: hoe
|
67
|
+
type: :development
|
68
|
+
version_requirement:
|
69
|
+
version_requirements: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: 1.8.0
|
74
|
+
version:
|
75
|
+
description: ""
|
76
|
+
email:
|
77
|
+
- brent@fuglylogic.com
|
78
|
+
executables: []
|
79
|
+
|
80
|
+
extensions: []
|
81
|
+
|
82
|
+
extra_rdoc_files:
|
83
|
+
- History.txt
|
84
|
+
- Manifest.txt
|
85
|
+
- README.rdoc
|
86
|
+
files:
|
87
|
+
- History.txt
|
88
|
+
- Manifest.txt
|
89
|
+
- README.rdoc
|
90
|
+
- Rakefile
|
91
|
+
- lib/baldrick.rb
|
92
|
+
- lib/baldrick_serve.rb
|
93
|
+
- lib/baldrick/command.rb
|
94
|
+
- lib/baldrick/run_servant.rb
|
95
|
+
- lib/baldrick/servant.rb
|
96
|
+
- lib/baldrick/task.rb
|
97
|
+
- lib/baldrick/listeners/feed_listener.rb
|
98
|
+
- lib/baldrick/listeners/feed_orders.rb
|
99
|
+
- lib/baldrick/listeners/injour_listener.rb
|
100
|
+
- lib/baldrick/listeners/xpath_locator.rb
|
101
|
+
- script/console
|
102
|
+
- script/destroy
|
103
|
+
- script/generate
|
104
|
+
- tasks/rspec.rake
|
105
|
+
has_rdoc: true
|
106
|
+
homepage: http://github.com/brentsnook/baldrick
|
107
|
+
post_install_message:
|
108
|
+
rdoc_options:
|
109
|
+
- --main
|
110
|
+
- README.rdoc
|
111
|
+
require_paths:
|
112
|
+
- lib
|
113
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: "0"
|
118
|
+
version:
|
119
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: "0"
|
124
|
+
version:
|
125
|
+
requirements: []
|
126
|
+
|
127
|
+
rubyforge_project: baldrick
|
128
|
+
rubygems_version: 1.3.1
|
129
|
+
signing_key:
|
130
|
+
specification_version: 2
|
131
|
+
summary: Does what you tell it - glues orders to tasks.
|
132
|
+
test_files: []
|
133
|
+
|