pug 0.2.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/bin/pug.rb +55 -0
- data/bin/pugdiff.rb +37 -0
- data/lib/commands/addcommand.rb +25 -0
- data/lib/commands/commandcontext.rb +56 -0
- data/lib/commands/diffcommand.rb +24 -0
- data/lib/commands/headlesscommandcontext.rb +4 -0
- data/lib/commands/helpcommand.rb +28 -0
- data/lib/commands/initcommand.rb +22 -0
- data/lib/commands/listcommand.rb +28 -0
- data/lib/configuration.rb +47 -0
- data/lib/deltatracker.rb +35 -0
- data/lib/format.rb +10 -0
- data/lib/meta.rb +16 -0
- data/lib/parse.rb +12 -0
- data/lib/pug.rb +6 -0
- data/lib/pugversion.rb +3 -0
- data/lib/tracker.rb +125 -0
- metadata +68 -0
data/bin/pug.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "pug"
|
3
|
+
require "tracker"
|
4
|
+
require "configuration"
|
5
|
+
require "commands/commandcontext"
|
6
|
+
require "commands/initcommand"
|
7
|
+
require "commands/addcommand"
|
8
|
+
require "commands/helpcommand"
|
9
|
+
require "commands/diffcommand"
|
10
|
+
require "commands/listcommand"
|
11
|
+
|
12
|
+
onprompt = lambda do |text|
|
13
|
+
puts text
|
14
|
+
$stdin.gets.chomp
|
15
|
+
end
|
16
|
+
onoutput = lambda do |o|
|
17
|
+
puts o.to_s
|
18
|
+
end
|
19
|
+
onerror = lambda do |e|
|
20
|
+
puts e
|
21
|
+
end
|
22
|
+
onexit = lambda do |x|
|
23
|
+
exit(x)
|
24
|
+
end
|
25
|
+
|
26
|
+
commandcontext = Commands::CommandContext.new(ARGV, onerror, onoutput, onprompt, onexit)
|
27
|
+
commandname = commandcontext.pop_argument!("Missing command, try help ;-)")
|
28
|
+
|
29
|
+
configuration = Configuration.new('.')
|
30
|
+
|
31
|
+
# make sure that we are configured
|
32
|
+
if commandname == 'init' || !configuration.has_globalconfiguration?
|
33
|
+
puts "There is no configuration available, please provide me with some info..." if commandname != "init"
|
34
|
+
Commands::InitCommand.new(configuration).run commandcontext
|
35
|
+
exit 0 if commandname == 'init'
|
36
|
+
end
|
37
|
+
|
38
|
+
if commandname == nil
|
39
|
+
commandname = 'help'
|
40
|
+
end
|
41
|
+
|
42
|
+
globalconfiguration = configuration.get_globalconfiguration()
|
43
|
+
|
44
|
+
# path to directory should be read from .pug_global
|
45
|
+
pugspath = globalconfiguration.pugspath
|
46
|
+
tracker = Tracker.new(pugspath)
|
47
|
+
|
48
|
+
command = Meta::command_from_name(commandname, tracker)
|
49
|
+
if command != nil
|
50
|
+
command.run commandcontext
|
51
|
+
exit 0
|
52
|
+
else
|
53
|
+
puts "Unknown command #{commandname}"
|
54
|
+
exit 1
|
55
|
+
end
|
data/bin/pugdiff.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "pug"
|
3
|
+
require "erb"
|
4
|
+
|
5
|
+
#$:.unshift(File.dirname(__FILE__))
|
6
|
+
|
7
|
+
require "tracker"
|
8
|
+
require "deltatracker"
|
9
|
+
|
10
|
+
class DeltasModel
|
11
|
+
def initialize(deltas)
|
12
|
+
@deltas = deltas
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_binding
|
16
|
+
binding
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
type = ARGV.shift
|
21
|
+
pugspath_is = ARGV.shift
|
22
|
+
pugspath_was = ARGV.shift
|
23
|
+
templatepath = ARGV.shift
|
24
|
+
|
25
|
+
tracker_is = Tracker.new(pugspath_is)
|
26
|
+
tracker_was = Tracker.new(pugspath_was)
|
27
|
+
|
28
|
+
deltatracker = DeltaTracker.new
|
29
|
+
diffs = []
|
30
|
+
deltatracker.get(type, tracker_is, tracker_was){|d| diffs.push(d)}
|
31
|
+
|
32
|
+
model = DeltasModel.new(diffs)
|
33
|
+
templatecontent = File.read(templatepath)
|
34
|
+
template = ERB.new(templatecontent)
|
35
|
+
|
36
|
+
report = template.result(model.get_binding)
|
37
|
+
puts report
|
@@ -0,0 +1,25 @@
|
|
1
|
+
$:.unshift(File.expand_path('../../', __FILE__))
|
2
|
+
require "meta"
|
3
|
+
require "parse"
|
4
|
+
|
5
|
+
module Commands
|
6
|
+
|
7
|
+
class AddCommand
|
8
|
+
def initialize(tracker)
|
9
|
+
@tracker = tracker
|
10
|
+
end
|
11
|
+
|
12
|
+
def run(commandcontext)
|
13
|
+
type = commandcontext.pop_argument! 'Missing type'
|
14
|
+
status = commandcontext.pop_argument! 'Missing status'
|
15
|
+
|
16
|
+
title = commandcontext.prompt "Enter a title"
|
17
|
+
|
18
|
+
@tracker.add(type, status, title)
|
19
|
+
end
|
20
|
+
|
21
|
+
def help(commandcontext)
|
22
|
+
commandcontext.output 'Use pug add <type of report> <initial status>'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
$:.unshift(File.expand_path('../../', __FILE__))
|
2
|
+
require 'time'
|
3
|
+
require "commands/headlesscommandcontext"
|
4
|
+
|
5
|
+
module Commands
|
6
|
+
class CommandContext
|
7
|
+
attr_accessor :output_lambda, :prompt_lambda, :now_lambda
|
8
|
+
|
9
|
+
def initialize(arguments, onerror, onoutput, onprompt, onexit)
|
10
|
+
@arguments = arguments
|
11
|
+
@headless = (@arguments.any? { |arg| arg == '--headless' })
|
12
|
+
@onerror = onerror
|
13
|
+
@onexit = onexit
|
14
|
+
@onoutput = onoutput
|
15
|
+
@onprompt = onprompt
|
16
|
+
@now_lambda = lambda {|| DateTime.now }
|
17
|
+
end
|
18
|
+
|
19
|
+
def pop_argument!(text_when_missing = nil)
|
20
|
+
if number_of_arguments == 0
|
21
|
+
@onerror.call(text_when_missing)
|
22
|
+
@onexit.call(1)
|
23
|
+
end
|
24
|
+
@arguments.shift
|
25
|
+
end
|
26
|
+
|
27
|
+
def number_of_arguments
|
28
|
+
@arguments.length
|
29
|
+
end
|
30
|
+
|
31
|
+
def output(s)
|
32
|
+
@onoutput.call(s)
|
33
|
+
end
|
34
|
+
|
35
|
+
def error(s)
|
36
|
+
@onerror.call(s)
|
37
|
+
end
|
38
|
+
|
39
|
+
def prompt(text)
|
40
|
+
if @headless
|
41
|
+
raise HeadLessCommandContextException.new()
|
42
|
+
end
|
43
|
+
@onprompt.call(text)
|
44
|
+
end
|
45
|
+
|
46
|
+
#def prompt_as_lambda
|
47
|
+
# lambda {|field, text, defaultvalue| prompt field, text, defaultvalue }
|
48
|
+
#end
|
49
|
+
|
50
|
+
def get_now
|
51
|
+
@now_lambda.call
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
$:.unshift(File.expand_path('../../', __FILE__))
|
2
|
+
|
3
|
+
require "tracker"
|
4
|
+
require "deltatracker"
|
5
|
+
|
6
|
+
module Commands
|
7
|
+
|
8
|
+
class DiffCommand
|
9
|
+
def initialize(tracker)
|
10
|
+
@tracker_is = tracker
|
11
|
+
end
|
12
|
+
|
13
|
+
def run(commandcontext)
|
14
|
+
type = commandcontext.pop_argument! 'Missing type'
|
15
|
+
pugspath_was = commandcontext.pop_argument! 'Missing path to pugs'
|
16
|
+
tracker_was = Tracker.new(pugspath_was)
|
17
|
+
DeltaTracker.new().get(type, @tracker_is, tracker_was){|d| commandcontext.output(d) }
|
18
|
+
end
|
19
|
+
|
20
|
+
def help(commandcontext)
|
21
|
+
commandcontext.output 'Use pug diff <type> <path to pugs to compare to>'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
$:.unshift(File.expand_path('../../', __FILE__))
|
2
|
+
require "meta"
|
3
|
+
|
4
|
+
module Commands
|
5
|
+
|
6
|
+
class HelpCommand
|
7
|
+
def initialize(tracker)
|
8
|
+
@tracker = tracker
|
9
|
+
end
|
10
|
+
|
11
|
+
def run(commandcontext)
|
12
|
+
if commandcontext.number_of_arguments == 0
|
13
|
+
help(commandcontext)
|
14
|
+
else
|
15
|
+
commandname = commandcontext.pop_argument!("")
|
16
|
+
command = Meta::command_from_name(commandname, @tracker)
|
17
|
+
if command != nil
|
18
|
+
command.help(commandcontext)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def help(commandcontext)
|
24
|
+
commandcontext.output 'Use pug help <command>'
|
25
|
+
Meta::list_of_commands.each {|command| commandcontext.output command}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
$:.unshift(File.expand_path('../../', __FILE__))
|
2
|
+
|
3
|
+
require "configuration"
|
4
|
+
|
5
|
+
module Commands
|
6
|
+
class InitCommand
|
7
|
+
def initialize(configuration)
|
8
|
+
@configuration = configuration
|
9
|
+
end
|
10
|
+
|
11
|
+
def run(commandcontext)
|
12
|
+
globalconfiguration = GlobalConfiguration.new
|
13
|
+
globalconfiguration.pugspath = commandcontext.prompt "Enter full path to where pugs will be placed"
|
14
|
+
@configuration.set_globalconfiguration(globalconfiguration)
|
15
|
+
end
|
16
|
+
|
17
|
+
def help(commandcontext)
|
18
|
+
commandcontext.output 'Use pug init'
|
19
|
+
commandcontext.output 'Configures settings file'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
$:.unshift(File.expand_path('../../', __FILE__))
|
2
|
+
|
3
|
+
require "tracker"
|
4
|
+
require "deltatracker"
|
5
|
+
|
6
|
+
module Commands
|
7
|
+
|
8
|
+
class ListCommand
|
9
|
+
def initialize(tracker)
|
10
|
+
@tracker = tracker
|
11
|
+
end
|
12
|
+
|
13
|
+
def run(commandcontext)
|
14
|
+
type = commandcontext.pop_argument!.downcase if commandcontext.number_of_arguments > 0
|
15
|
+
status = commandcontext.pop_argument!.downcase if commandcontext.number_of_arguments > 0
|
16
|
+
|
17
|
+
@tracker.all {|x|
|
18
|
+
if (x.type.downcase == type || type == nil) && (x.status.downcase == status || status == nil)
|
19
|
+
commandcontext.output(x)
|
20
|
+
end
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
def help(commandcontext)
|
25
|
+
commandcontext.output 'Use pug list [type [status]]'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require "yaml"
|
2
|
+
|
3
|
+
class GlobalConfiguration
|
4
|
+
attr_accessor :pugspath
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@pugspath = ''
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class Configuration
|
12
|
+
def initialize(path)
|
13
|
+
@path = path
|
14
|
+
end
|
15
|
+
|
16
|
+
def _globalconfiguration_filename()
|
17
|
+
File.join(@path, '.pug_global')
|
18
|
+
end
|
19
|
+
|
20
|
+
def has_globalconfiguration?
|
21
|
+
File.exists?(_globalconfiguration_filename)
|
22
|
+
end
|
23
|
+
|
24
|
+
def set_globalconfiguration(model)
|
25
|
+
content = model.to_yaml
|
26
|
+
begin
|
27
|
+
file = File.new(_globalconfiguration_filename, 'w')
|
28
|
+
file.write(content)
|
29
|
+
ensure
|
30
|
+
file.close
|
31
|
+
end
|
32
|
+
|
33
|
+
if !Dir.exists?(model.pugspath)
|
34
|
+
Dir.mkdir(model.pugspath)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def get_globalconfiguration()
|
39
|
+
begin
|
40
|
+
file = File.open(_globalconfiguration_filename)
|
41
|
+
model = YAML::load(file) if file != nil
|
42
|
+
model
|
43
|
+
ensure
|
44
|
+
file.close if file != nil
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/deltatracker.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
|
2
|
+
class Delta
|
3
|
+
attr_accessor :is, :was
|
4
|
+
|
5
|
+
def to_s
|
6
|
+
if was == nil
|
7
|
+
diff = "void => #{is.status}"
|
8
|
+
elsif is == nil
|
9
|
+
diff = "#{was.status} => void"
|
10
|
+
else
|
11
|
+
diff = "#{was.status} => #{is.status}"
|
12
|
+
end
|
13
|
+
"-#{is.title}\n" +
|
14
|
+
" #{diff}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class DeltaTracker
|
19
|
+
def get(type, tracker_is, tracker_was)
|
20
|
+
tracker_is.all() {|is|
|
21
|
+
delta = Delta.new
|
22
|
+
delta.is = is
|
23
|
+
delta.was = tracker_was.find(is.filename)
|
24
|
+
|
25
|
+
yield delta if is.type.downcase == type.downcase && (delta.was == nil || delta.is.status != delta.was.status)
|
26
|
+
}
|
27
|
+
tracker_was.all() {|was|
|
28
|
+
delta = Delta.new
|
29
|
+
delta.was = was
|
30
|
+
delta.is = tracker_is.find(was.filename)
|
31
|
+
|
32
|
+
yield delta if was.type.downcase == type.downcase && delta.is == nil
|
33
|
+
}
|
34
|
+
end
|
35
|
+
end
|
data/lib/format.rb
ADDED
data/lib/meta.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
|
2
|
+
module Meta
|
3
|
+
|
4
|
+
def Meta.command_from_name(commandname, tracker)
|
5
|
+
begin
|
6
|
+
klass = Commands.const_get(commandname.capitalize + 'Command')
|
7
|
+
klass.new tracker
|
8
|
+
rescue NameError
|
9
|
+
nil
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def Meta.list_of_commands()
|
14
|
+
Commands.constants.select{|x| x =~ /Command$/ }.map{|c| c.to_s.gsub /Command$/, '' }
|
15
|
+
end
|
16
|
+
end
|
data/lib/parse.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
module Parse
|
2
|
+
def Parse.option_to_name_and_value(option)
|
3
|
+
splitted = option.split('=')
|
4
|
+
name = splitted[0]
|
5
|
+
name = name.gsub(/[-]/, '')
|
6
|
+
|
7
|
+
value = splitted[1]
|
8
|
+
value = value.gsub(/^"/, '').gsub(/"$/, '')
|
9
|
+
|
10
|
+
{ :name => name, :value => value }
|
11
|
+
end
|
12
|
+
end
|
data/lib/pug.rb
ADDED
data/lib/pugversion.rb
ADDED
data/lib/tracker.rb
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
require "date"
|
2
|
+
require "find"
|
3
|
+
|
4
|
+
require "format"
|
5
|
+
|
6
|
+
class Tracked
|
7
|
+
attr_accessor :filepath, :type, :status, :title, :filename
|
8
|
+
|
9
|
+
def to_s
|
10
|
+
"-#{title}\n" +
|
11
|
+
" #{type}:#{status}\n" +
|
12
|
+
" #{filepath}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class Tracker
|
17
|
+
attr_reader :root
|
18
|
+
|
19
|
+
def initialize(root)
|
20
|
+
@root = root
|
21
|
+
raise "#{root} is not a directory" if !File.directory?root
|
22
|
+
end
|
23
|
+
|
24
|
+
def filename_from(title)
|
25
|
+
nowpart = Format::compact_datetime(DateTime.now)
|
26
|
+
titlepart = Format::safe_for_filename(title)
|
27
|
+
filename = "#{titlepart}_#{nowpart}.txt"
|
28
|
+
end
|
29
|
+
|
30
|
+
def ensure_directory_exists(directory)
|
31
|
+
Dir.mkdir(directory) if !File.directory?(directory)
|
32
|
+
end
|
33
|
+
|
34
|
+
def add(type, status, title)
|
35
|
+
directory = File.join(@root, type)
|
36
|
+
ensure_directory_exists directory
|
37
|
+
directory = File.join(directory, status)
|
38
|
+
ensure_directory_exists directory
|
39
|
+
filename = filename_from(title)
|
40
|
+
filepath = File.join(directory, filename)
|
41
|
+
begin
|
42
|
+
file = File.new(filepath, 'w')
|
43
|
+
file.puts title
|
44
|
+
ensure
|
45
|
+
file.close
|
46
|
+
end
|
47
|
+
|
48
|
+
tracked = Tracked.new()
|
49
|
+
tracked.type = type
|
50
|
+
tracked.status = status
|
51
|
+
tracked.title = title
|
52
|
+
tracked.filepath = filepath
|
53
|
+
tracked.filename = filename
|
54
|
+
|
55
|
+
tracked
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
def get(type, status, filename)
|
60
|
+
filepath = File.join(@root, type, status, filename)
|
61
|
+
title = nil
|
62
|
+
File.open(filepath) {|f| title = f.readline }
|
63
|
+
title = title.gsub(/\n/, '')
|
64
|
+
|
65
|
+
tracked = Tracked.new()
|
66
|
+
tracked.type = type
|
67
|
+
tracked.status = status
|
68
|
+
tracked.filepath = filepath
|
69
|
+
tracked.filename = filename
|
70
|
+
tracked.title = title
|
71
|
+
|
72
|
+
tracked
|
73
|
+
end
|
74
|
+
|
75
|
+
def all()
|
76
|
+
if File.directory?@root
|
77
|
+
Find.find(@root) do |path|
|
78
|
+
if FileTest.directory?(path)
|
79
|
+
if File.basename(path)[0] == '.'
|
80
|
+
Find.prune
|
81
|
+
else
|
82
|
+
next
|
83
|
+
end
|
84
|
+
else
|
85
|
+
if File.file?(path)
|
86
|
+
# split into parts to extract status
|
87
|
+
parts = path.split(File::SEPARATOR).reverse
|
88
|
+
trackedfilename = parts.shift
|
89
|
+
trackedstatus = parts.shift
|
90
|
+
trackedtype = parts.shift
|
91
|
+
yield get(trackedtype, trackedstatus, trackedfilename)
|
92
|
+
else
|
93
|
+
next
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def find(filename)
|
101
|
+
return nil if !File.directory?@root
|
102
|
+
|
103
|
+
Find.find(@root) do |path|
|
104
|
+
if FileTest.directory?(path)
|
105
|
+
if File.basename(path)[0] == '.'
|
106
|
+
Find.prune
|
107
|
+
else
|
108
|
+
next
|
109
|
+
end
|
110
|
+
else
|
111
|
+
if File.basename(path) == filename
|
112
|
+
# split into parts to extract status
|
113
|
+
parts = path.split(File::SEPARATOR).reverse
|
114
|
+
parts.shift # pops filename
|
115
|
+
status = parts.shift
|
116
|
+
type = parts.shift
|
117
|
+
return get type, status, filename
|
118
|
+
else
|
119
|
+
next
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
nil
|
124
|
+
end
|
125
|
+
end
|
metadata
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pug
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- 2hdddg
|
9
|
+
- wallymathieu
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2013-02-26 00:00:00.000000000Z
|
14
|
+
dependencies: []
|
15
|
+
description: Pug is a simple light-weight distributed issue tracker, main purpose
|
16
|
+
is to automatically create release reports.
|
17
|
+
email: []
|
18
|
+
executables:
|
19
|
+
- pug.rb
|
20
|
+
- pugdiff.rb
|
21
|
+
extensions: []
|
22
|
+
extra_rdoc_files: []
|
23
|
+
files:
|
24
|
+
- lib/commands/addcommand.rb
|
25
|
+
- lib/commands/commandcontext.rb
|
26
|
+
- lib/commands/diffcommand.rb
|
27
|
+
- lib/commands/headlesscommandcontext.rb
|
28
|
+
- lib/commands/helpcommand.rb
|
29
|
+
- lib/commands/initcommand.rb
|
30
|
+
- lib/commands/listcommand.rb
|
31
|
+
- lib/configuration.rb
|
32
|
+
- lib/deltatracker.rb
|
33
|
+
- lib/format.rb
|
34
|
+
- lib/meta.rb
|
35
|
+
- lib/parse.rb
|
36
|
+
- lib/pug.rb
|
37
|
+
- lib/pugversion.rb
|
38
|
+
- lib/tracker.rb
|
39
|
+
- bin/pug.rb
|
40
|
+
- bin/pugdiff.rb
|
41
|
+
homepage: https://github.com/2hdddg/pug
|
42
|
+
licenses: []
|
43
|
+
post_install_message:
|
44
|
+
rdoc_options: []
|
45
|
+
require_paths:
|
46
|
+
- lib
|
47
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
+
none: false
|
49
|
+
requirements:
|
50
|
+
- - ! '>='
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 1.9.3
|
53
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ! '>='
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: '0'
|
59
|
+
segments:
|
60
|
+
- 0
|
61
|
+
hash: -183053119
|
62
|
+
requirements: []
|
63
|
+
rubyforge_project:
|
64
|
+
rubygems_version: 1.7.2
|
65
|
+
signing_key:
|
66
|
+
specification_version: 3
|
67
|
+
summary: Light-weight issue tracker
|
68
|
+
test_files: []
|