loki 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -0
- data/Gemfile +4 -0
- data/Rakefile +2 -0
- data/bin/loki +5 -0
- data/lib/loki.rb +33 -0
- data/lib/loki/file_path.rb +41 -0
- data/lib/loki/file_pattern.rb +79 -0
- data/lib/loki/identity.rb +21 -0
- data/lib/loki/logger.rb +70 -0
- data/lib/loki/task/base.rb +74 -0
- data/lib/loki/task/file.rb +48 -0
- data/lib/loki/task/make.rb +41 -0
- data/lib/loki/task/proc.rb +34 -0
- data/lib/loki/task/task.rb +91 -0
- data/lib/loki/time.rb +46 -0
- data/lib/loki/version.rb +3 -0
- data/loki.gemspec +21 -0
- metadata +77 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
data/bin/loki
ADDED
data/lib/loki.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require "singleton"
|
2
|
+
require "fileutils"
|
3
|
+
|
4
|
+
require "loki/time"
|
5
|
+
require "loki/logger"
|
6
|
+
require "loki/identity"
|
7
|
+
require "loki/file_pattern"
|
8
|
+
require "loki/file_path"
|
9
|
+
require "loki/task/base"
|
10
|
+
require "loki/task/proc"
|
11
|
+
require "loki/task/task"
|
12
|
+
require "loki/task/file"
|
13
|
+
require "loki/task/make"
|
14
|
+
|
15
|
+
|
16
|
+
module Loki
|
17
|
+
|
18
|
+
def self.task(name = :task, &block)
|
19
|
+
task = Task::Task.new(name)
|
20
|
+
task.instance_eval(&block)
|
21
|
+
# task.list
|
22
|
+
task.work
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def self.block_unique_id(&block)
|
29
|
+
source = block.source_location
|
30
|
+
::File.expand_path(source[0]) + ":#{source[1]}"
|
31
|
+
end
|
32
|
+
|
33
|
+
end # module
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Loki
|
2
|
+
class FilePath
|
3
|
+
attr_reader :path
|
4
|
+
|
5
|
+
|
6
|
+
def initialize(path)
|
7
|
+
self.path = path
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
def path=(path)
|
12
|
+
@path = ::File.expand_path(path.to_s)
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
def relative(from = Dir.pwd)
|
17
|
+
@path.gsub(/^#{from}\//, '')
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def absolute
|
22
|
+
::File.expand_path(@path)
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
def mtime
|
27
|
+
::File.mtime(@path)
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
def exists?
|
32
|
+
::File.exists?(@path)
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
def to_s
|
37
|
+
@path.to_s
|
38
|
+
end
|
39
|
+
|
40
|
+
end # class
|
41
|
+
end # module
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module Loki
|
2
|
+
class FilePattern
|
3
|
+
include Enumerable
|
4
|
+
attr_reader :path
|
5
|
+
|
6
|
+
|
7
|
+
def initialize(path)
|
8
|
+
self.path = path
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
def path=(new_path)
|
13
|
+
@path = new_path.to_s
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
def each(&block)
|
18
|
+
Dir.glob(@path).each do |file|
|
19
|
+
yield FilePath.new(file) if block_given?
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
def interpolate_each(result_pattern, &block)
|
25
|
+
each do |source_path|
|
26
|
+
yield source_path, interpolate(source_path, result_pattern) if block_given?
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
def individual?
|
32
|
+
!(@path =~ /[\?\[\]\{\}\*]/)
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
def collection?
|
37
|
+
!individual?
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
def relative(from = Dir.pwd)
|
42
|
+
@path.gsub(/^#{from}\//, '')
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
def absolute
|
47
|
+
::File.expand_path(@path)
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
def to_s
|
52
|
+
@path.to_s
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def interpolate(source_path, result_pattern)
|
59
|
+
parts_regex = ""
|
60
|
+
parts = absolute.split("/") # File::SEPARATOR
|
61
|
+
parts.each_with_index do |part, index|
|
62
|
+
if part == "**"
|
63
|
+
parts_regex += "((?:[^\/]+\/)*)"
|
64
|
+
else
|
65
|
+
has_captures = !!(part =~ /[\?\[\]\{\}\*]/)
|
66
|
+
part.gsub!(/\?/, ".")
|
67
|
+
part.gsub!(/([\.\\])/, "\\\\\\1")
|
68
|
+
part.gsub!(/\{([^\}]+)\}/) { "(?:" + $1.split(",").join("|") + ")" }
|
69
|
+
part.gsub!(/\*/, "[^\/]+")
|
70
|
+
parts_regex += has_captures ? "(" + part + ")" : part
|
71
|
+
parts_regex += "/" unless index == parts.size - 1
|
72
|
+
end
|
73
|
+
end
|
74
|
+
parts = source_path.to_s.match(/^#{parts_regex}$/)
|
75
|
+
result_pattern.to_s.gsub(/\*+\/?/).each_with_index { |m, i| parts[i+1] }
|
76
|
+
end
|
77
|
+
|
78
|
+
end # class
|
79
|
+
end # module
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Loki
|
2
|
+
|
3
|
+
IDENTITY_MAP = {}
|
4
|
+
|
5
|
+
module Identity
|
6
|
+
def self.included(other)
|
7
|
+
other.class_eval %{
|
8
|
+
class << self
|
9
|
+
alias_method :__#{other.to_s.gsub(':','')}_new, :new
|
10
|
+
def new(name, *args, &block)
|
11
|
+
name = self.identify(name) if self.respond_to?(:identify)
|
12
|
+
IDENTITY_MAP.fetch(name) do
|
13
|
+
IDENTITY_MAP[name] = __#{other.to_s.gsub(':','')}_new(name, *args, &block)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end # module
|
data/lib/loki/logger.rb
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
module Loki
|
2
|
+
class Logger
|
3
|
+
include Singleton
|
4
|
+
|
5
|
+
|
6
|
+
COLORS = {
|
7
|
+
:red => 31,
|
8
|
+
:green => 32,
|
9
|
+
:yellow => 33,
|
10
|
+
:blue => 34,
|
11
|
+
:magenta => 35,
|
12
|
+
:cyan => 36,
|
13
|
+
:white => 37,
|
14
|
+
:r => 31,
|
15
|
+
:g => 32,
|
16
|
+
:y => 33,
|
17
|
+
:b => 34,
|
18
|
+
:m => 35,
|
19
|
+
:c => 36,
|
20
|
+
:w => 37
|
21
|
+
}
|
22
|
+
|
23
|
+
|
24
|
+
def initialize
|
25
|
+
@indent = 0
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
def push
|
30
|
+
@indent += 1
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
def pull
|
35
|
+
@indent -= 1
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
def puts(text, mark = ">")
|
40
|
+
$stdout.puts((" " * @indent * 2) + "#{mark} #{parse(text)}")
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
def line
|
45
|
+
$stdout.puts("-" * 80) if @indent == 0
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
public
|
50
|
+
|
51
|
+
def paint(text, color = :white)
|
52
|
+
"\e[#{COLORS[color]}m#{text}\e[0m"
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
def parse(text)
|
57
|
+
colors = COLORS.keys.collect(&:to_s).join('|')
|
58
|
+
text.gsub(/\<(#{colors})\>(.*)\<\/\1\>/) do
|
59
|
+
paint($2, $1.to_sym)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end # class
|
64
|
+
|
65
|
+
|
66
|
+
def self.logger
|
67
|
+
@logger ||= Logger.instance
|
68
|
+
end
|
69
|
+
|
70
|
+
end # module
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Loki
|
2
|
+
module Task
|
3
|
+
class Base
|
4
|
+
attr_reader :name
|
5
|
+
|
6
|
+
|
7
|
+
def initialize(name)
|
8
|
+
@name = name
|
9
|
+
@parent = nil
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
def work(&block)
|
14
|
+
Loki.logger.puts "#{@name}"
|
15
|
+
Loki.logger.push
|
16
|
+
yield if block_given?
|
17
|
+
Loki.logger.pull
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def time
|
22
|
+
Time.now
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
def done?
|
27
|
+
false
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
def sham?
|
32
|
+
false
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
def list(&block)
|
37
|
+
Loki.logger.line
|
38
|
+
Loki.logger.puts "#{self.class}: #{@name}, done: #{done?}, time: #{time}", "-"
|
39
|
+
Loki.logger.push
|
40
|
+
yield if block_given?
|
41
|
+
Loki.logger.pull
|
42
|
+
Loki.logger.line
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
protected
|
47
|
+
|
48
|
+
def parent
|
49
|
+
@parent
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
def parent=(parent)
|
54
|
+
@parent = parent
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
def siblings
|
59
|
+
@parent.children.reject { |task| task == self }
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
def evaluate(&block)
|
64
|
+
block_id = Loki.block_unique_id(&block)
|
65
|
+
@evaluated ||= {}
|
66
|
+
unless @evaluated.has_key?(block_id)
|
67
|
+
instance_eval(&block)
|
68
|
+
@evaluated[block_id] = true
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
end # class
|
73
|
+
end # module
|
74
|
+
end # module
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Loki
|
2
|
+
module Task
|
3
|
+
class File < Task
|
4
|
+
include Identity
|
5
|
+
|
6
|
+
|
7
|
+
def initialize(path)
|
8
|
+
@path = FilePath.new(path)
|
9
|
+
super(@path.relative)
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
def self.identify(name)
|
14
|
+
::File.expand_path(name.to_s)
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
def path
|
19
|
+
@path.path
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
def done?
|
24
|
+
exists? and up_to_date? and super
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
def exists?
|
29
|
+
@path.exists?
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
def up_to_date?
|
34
|
+
@children.none? { |task| task.time > time }
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
def time
|
39
|
+
if exists?
|
40
|
+
@path.mtime
|
41
|
+
else
|
42
|
+
Loki::PRIMEVAL
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end # class
|
47
|
+
end # module
|
48
|
+
end # module
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Loki
|
2
|
+
module Task
|
3
|
+
class Make < File
|
4
|
+
include Identity
|
5
|
+
|
6
|
+
|
7
|
+
def initialize(path, sources = nil)
|
8
|
+
@sources = Array(sources).map { |s| File.new(s) }
|
9
|
+
super(path)
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
def sources
|
14
|
+
@sources.collect(&:path)
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
def source_path
|
19
|
+
@sources.first.path
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
def result_path
|
24
|
+
@path.path
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
def up_to_date?
|
29
|
+
(@children + @sources).none? { |task| task.time > time }
|
30
|
+
end
|
31
|
+
|
32
|
+
def test?
|
33
|
+
@children.find_all { |task| task.time > time }.each do |o|
|
34
|
+
ap "#{o.name} #{o.time}"
|
35
|
+
end
|
36
|
+
(@children + @sources).reject(&:sham?).none? { |task| task.time > time }
|
37
|
+
end
|
38
|
+
|
39
|
+
end # class
|
40
|
+
end # module
|
41
|
+
end # module
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Loki
|
2
|
+
module Task
|
3
|
+
class Proc < Base
|
4
|
+
|
5
|
+
def initialize(name, &proc)
|
6
|
+
@proc = proc
|
7
|
+
super(name.gsub(/^#{Dir.pwd}\//, ''))
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
def work
|
12
|
+
super do
|
13
|
+
@proc.call unless @proc.nil?
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
def time
|
19
|
+
Loki::PRIMEVAL
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
def done?
|
24
|
+
siblings.reject(&:sham?).all?(&:done?) and @parent.done?
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
def sham?
|
29
|
+
true
|
30
|
+
end
|
31
|
+
|
32
|
+
end # class
|
33
|
+
end # module
|
34
|
+
end # module
|
@@ -0,0 +1,91 @@
|
|
1
|
+
module Loki
|
2
|
+
module Task
|
3
|
+
class Task < Base
|
4
|
+
include Identity
|
5
|
+
attr_reader :children
|
6
|
+
|
7
|
+
|
8
|
+
def initialize(name)
|
9
|
+
@children = []
|
10
|
+
super(name)
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
def task(name, &block)
|
15
|
+
add_dependency Task.new(name), &block
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
def proc(&block)
|
20
|
+
source = Loki.block_unique_id(&block)
|
21
|
+
add_dependency Proc.new(source, &block)
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
def make(result_pattern, source_pattern = nil, &block)
|
26
|
+
if source_pattern.nil?
|
27
|
+
add_dependency Make.new(result_pattern), &block
|
28
|
+
else
|
29
|
+
source_pattern = FilePattern.new(source_pattern)
|
30
|
+
result_pattern = FilePattern.new(result_pattern)
|
31
|
+
if result_pattern.individual?
|
32
|
+
add_dependency Make.new(result_pattern, source_pattern.to_a), &block
|
33
|
+
else
|
34
|
+
source_pattern.interpolate_each(result_pattern) do |source_path, result_path|
|
35
|
+
add_dependency Make.new(result_path, source_path), &block
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
def scan(dependencies, &block)
|
43
|
+
dependencies = Dir.glob(dependencies) if dependencies.is_a?(String)
|
44
|
+
dependencies.each do |dependency|
|
45
|
+
add_dependency(File.new(dependency), &block)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
def work
|
51
|
+
super do
|
52
|
+
@children.each do |task|
|
53
|
+
task.work unless task.done?
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
def done?
|
60
|
+
@children.reject(&:sham?).all?(&:done?)
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
def time
|
65
|
+
@children.collect(&:time).max || super
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
def list
|
70
|
+
super do
|
71
|
+
@children.each do |task|
|
72
|
+
task.list
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
|
78
|
+
protected
|
79
|
+
|
80
|
+
def add_dependency(task, &block)
|
81
|
+
unless children.include?(task)
|
82
|
+
task.parent = self
|
83
|
+
children << task
|
84
|
+
task.evaluate(&block) if block_given?
|
85
|
+
end
|
86
|
+
task
|
87
|
+
end
|
88
|
+
|
89
|
+
end # class
|
90
|
+
end # module
|
91
|
+
end # module
|
data/lib/loki/time.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
|
4
|
+
module Loki
|
5
|
+
class Primeval
|
6
|
+
include Comparable
|
7
|
+
include Singleton
|
8
|
+
|
9
|
+
|
10
|
+
def <=>(other)
|
11
|
+
-1
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
def to_s
|
16
|
+
"<Primeval>"
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
def strftime(*args)
|
21
|
+
"<Primeval>"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
PRIMEVAL = Primeval.instance
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
class Time
|
31
|
+
|
32
|
+
alias loki_original_compare :<=>
|
33
|
+
def <=>(other)
|
34
|
+
if Loki::Primeval === other
|
35
|
+
- other.<=>(self)
|
36
|
+
else
|
37
|
+
loki_original_compare(other)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
def to_s
|
43
|
+
strftime("%m-%d-%Y %H:%M:%S")
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
data/lib/loki/version.rb
ADDED
data/loki.gemspec
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "loki/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "loki"
|
7
|
+
s.version = Loki::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Patrick Hogan"]
|
10
|
+
s.email = ["pbhogan@gmail.com"]
|
11
|
+
s.homepage = "https://github.com/pbhogan/loki"
|
12
|
+
s.summary = "A highly experimental and simplistic Rake-like DSL."
|
13
|
+
s.description = s.summary
|
14
|
+
|
15
|
+
# s.rubyforge_project = "loki"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
end
|
metadata
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: loki
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.0.2
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Patrick Hogan
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-06-24 00:00:00 Z
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: A highly experimental and simplistic Rake-like DSL.
|
17
|
+
email:
|
18
|
+
- pbhogan@gmail.com
|
19
|
+
executables:
|
20
|
+
- loki
|
21
|
+
extensions: []
|
22
|
+
|
23
|
+
extra_rdoc_files: []
|
24
|
+
|
25
|
+
files:
|
26
|
+
- .gitignore
|
27
|
+
- Gemfile
|
28
|
+
- Rakefile
|
29
|
+
- bin/loki
|
30
|
+
- lib/loki.rb
|
31
|
+
- lib/loki/file_path.rb
|
32
|
+
- lib/loki/file_pattern.rb
|
33
|
+
- lib/loki/identity.rb
|
34
|
+
- lib/loki/logger.rb
|
35
|
+
- lib/loki/task/base.rb
|
36
|
+
- lib/loki/task/file.rb
|
37
|
+
- lib/loki/task/make.rb
|
38
|
+
- lib/loki/task/proc.rb
|
39
|
+
- lib/loki/task/task.rb
|
40
|
+
- lib/loki/time.rb
|
41
|
+
- lib/loki/version.rb
|
42
|
+
- loki.gemspec
|
43
|
+
homepage: https://github.com/pbhogan/loki
|
44
|
+
licenses: []
|
45
|
+
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options: []
|
48
|
+
|
49
|
+
require_paths:
|
50
|
+
- lib
|
51
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
hash: -3930385297513677759
|
57
|
+
segments:
|
58
|
+
- 0
|
59
|
+
version: "0"
|
60
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
hash: -3930385297513677759
|
66
|
+
segments:
|
67
|
+
- 0
|
68
|
+
version: "0"
|
69
|
+
requirements: []
|
70
|
+
|
71
|
+
rubyforge_project:
|
72
|
+
rubygems_version: 1.8.5
|
73
|
+
signing_key:
|
74
|
+
specification_version: 3
|
75
|
+
summary: A highly experimental and simplistic Rake-like DSL.
|
76
|
+
test_files: []
|
77
|
+
|