cardigan 0.0.1 → 0.0.2
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/README.rdoc +8 -3
- data/lib/cardigan/cli.rb +3 -2
- data/lib/cardigan/directory.rb +4 -0
- data/lib/cardigan/entry_context.rb +3 -3
- data/lib/cardigan/repository.rb +35 -0
- data/lib/cardigan/root_context.rb +86 -19
- data/lib/cardigan/text_report_formatter.rb +38 -0
- metadata +4 -2
data/README.rdoc
CHANGED
@@ -25,15 +25,20 @@ The commands available are (with the awesome power of tab completion):
|
|
25
25
|
* quit
|
26
26
|
* exit
|
27
27
|
* list - shows all cards
|
28
|
-
*
|
29
|
-
*
|
28
|
+
* filter <filter> - sets the filter for cards - this is ruby code such as card[:name].start_with?('a')
|
29
|
+
* claim <name> - sets the owner of the card
|
30
|
+
* unclaim <name> - removes the card owner
|
31
|
+
* create <name> - creates a card with the specified name
|
32
|
+
* open <name> - creates or opens the card and enters edit mode
|
33
|
+
* columns - changes the list of columns to be displayed
|
34
|
+
* destroy <numbers> - deletes the specified cards (by index number from the list view)
|
30
35
|
|
31
36
|
== Editing mode
|
32
37
|
|
33
38
|
* quit
|
34
39
|
* exit
|
35
40
|
* set <key> - creates a new key and prompts for the new value
|
36
|
-
|
41
|
+
|
37
42
|
== Future plans
|
38
43
|
|
39
44
|
Refer to the .cards for detailed story breakdown but mostly importing, exporting and generating pretty html reports/charts.
|
data/lib/cardigan/cli.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'cardigan/io'
|
2
2
|
require 'cardigan/root_context'
|
3
|
-
require 'cardigan/
|
3
|
+
require 'cardigan/repository'
|
4
4
|
|
5
5
|
module Cardigan
|
6
6
|
class Cli
|
@@ -20,7 +20,8 @@ module Cardigan
|
|
20
20
|
}
|
21
21
|
@home.store CONFIG_FILE, config
|
22
22
|
end
|
23
|
-
|
23
|
+
name = "\"#{config[:name]}\" <#{config[:email]}>"
|
24
|
+
RootContext.new(@io, Repository.new('.cards'), name).push
|
24
25
|
end
|
25
26
|
end
|
26
27
|
end
|
data/lib/cardigan/directory.rb
CHANGED
@@ -6,12 +6,12 @@ module Cardigan
|
|
6
6
|
|
7
7
|
def initialize io, entry
|
8
8
|
@io, @entry = io, entry
|
9
|
-
@prompt_text = "
|
9
|
+
@prompt_text = "#{File.expand_path('.').split('/').last.slice(0..1)}/#{entry['name']} > "
|
10
10
|
@commands = ['set']
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
def set_command key
|
14
|
-
@entry[
|
14
|
+
@entry[key] = @io.ask("Enter the new value for #{key}")
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'cardigan/directory'
|
2
|
+
|
3
|
+
module Cardigan
|
4
|
+
class Repository
|
5
|
+
attr_reader :cards
|
6
|
+
|
7
|
+
def initialize path
|
8
|
+
@directory = Directory.new(path)
|
9
|
+
@directory.create
|
10
|
+
end
|
11
|
+
|
12
|
+
def refresh
|
13
|
+
@cards = @directory.find('*.card')
|
14
|
+
end
|
15
|
+
|
16
|
+
def find_card name
|
17
|
+
@cards.find {|card| card['name'] == name}
|
18
|
+
end
|
19
|
+
|
20
|
+
def save card
|
21
|
+
@directory.store "#{card['id']}.card", card
|
22
|
+
end
|
23
|
+
|
24
|
+
def destroy card
|
25
|
+
@directory.delete "#{card['id']}.card"
|
26
|
+
end
|
27
|
+
|
28
|
+
def find_or_create name
|
29
|
+
card = find_card(name)
|
30
|
+
card or { 'id' => UUIDTools::UUID.random_create.to_s,
|
31
|
+
'name' => name
|
32
|
+
}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -2,38 +2,105 @@ require 'rubygems'
|
|
2
2
|
require 'uuidtools'
|
3
3
|
require 'cardigan/context'
|
4
4
|
require 'cardigan/entry_context'
|
5
|
+
require 'cardigan/text_report_formatter'
|
5
6
|
|
6
7
|
module Cardigan
|
7
8
|
class RootContext
|
8
9
|
include Context
|
9
10
|
|
10
|
-
def initialize io,
|
11
|
-
@io, @
|
12
|
-
@
|
13
|
-
@
|
11
|
+
def initialize io, repository, name
|
12
|
+
@io, @repository, @name = io, repository, name
|
13
|
+
@prompt_text = "#{File.expand_path('.').split('/').last} > "
|
14
|
+
@columns = ['name']
|
14
15
|
end
|
15
|
-
|
16
|
+
|
16
17
|
def refresh_commands
|
17
|
-
@
|
18
|
-
@commands = ['
|
19
|
-
@cards.each do |card|
|
20
|
-
@commands << "
|
18
|
+
@repository.refresh
|
19
|
+
@commands = ['create', 'list', 'filter', 'unfilter', 'columns']
|
20
|
+
@repository.cards.each do |card|
|
21
|
+
@commands << "open #{card['name']}"
|
22
|
+
@commands << "destroy #{card['name']}"
|
23
|
+
if card['owner'] == @name
|
24
|
+
@commands << "unclaim #{card['name']}"
|
25
|
+
else
|
26
|
+
@commands << "claim #{card['name']}"
|
27
|
+
end
|
21
28
|
end
|
22
29
|
end
|
23
30
|
|
24
|
-
def
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
31
|
+
def create_command name
|
32
|
+
@repository.save @repository.find_or_create(name)
|
33
|
+
end
|
34
|
+
|
35
|
+
def open_command text
|
36
|
+
card = @repository.find_or_create(name)
|
29
37
|
EntryContext.new(@io, card).push
|
30
|
-
@
|
38
|
+
@repository.save card
|
39
|
+
end
|
40
|
+
|
41
|
+
def destroy_command text
|
42
|
+
cards = sorted_selection
|
43
|
+
text.scan(/\d+/).each do |n|
|
44
|
+
card = cards[n.to_i - 1]
|
45
|
+
@io.say "destroying \"#{card['name']}\""
|
46
|
+
@repository.destroy card
|
47
|
+
end
|
31
48
|
end
|
32
49
|
|
33
|
-
def list_command
|
34
|
-
cards =
|
35
|
-
|
36
|
-
|
50
|
+
def list_command ignored
|
51
|
+
cards = sorted_selection
|
52
|
+
formatter = TextReportFormatter.new @io
|
53
|
+
a = 0
|
54
|
+
@columns.each do |column|
|
55
|
+
formatter.add_column(column, max_field_length(cards, column))
|
56
|
+
end
|
57
|
+
formatter.output cards
|
58
|
+
end
|
59
|
+
|
60
|
+
def unfilter_command ignored
|
61
|
+
@filter = nil
|
62
|
+
end
|
63
|
+
|
64
|
+
def columns_command text
|
65
|
+
@columns = text.split(',') if text
|
66
|
+
end
|
67
|
+
|
68
|
+
def filter_command code
|
69
|
+
@filter = code
|
70
|
+
begin
|
71
|
+
cards = @repository.cards.select {|card| eval @filter }
|
72
|
+
@io.say "#{cards.count} cards match filter"
|
73
|
+
rescue Exception => e
|
74
|
+
@io.say "Invalid expression:\n#{e.message}"
|
75
|
+
@filter = nil
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def claim_command name
|
80
|
+
set_key name, 'owner', @name
|
81
|
+
end
|
82
|
+
|
83
|
+
def unclaim_command name
|
84
|
+
set_key name, 'owner', nil
|
85
|
+
end
|
86
|
+
private
|
87
|
+
def max_field_length cards, name
|
88
|
+
cards.map {|v| v[name] ? v[name].length : 0 }.max
|
89
|
+
end
|
90
|
+
|
91
|
+
def sorted_selection
|
92
|
+
cards = @filter ? @repository.cards.select {|card| eval @filter } : @repository.cards
|
93
|
+
cards.sort {|a,b| a['name'] <=> b['name'] }
|
94
|
+
end
|
95
|
+
|
96
|
+
def set_key name, key, value
|
97
|
+
card = @repository.find_card(name)
|
98
|
+
if card
|
99
|
+
card[key] = value
|
100
|
+
@repository.save card
|
101
|
+
else
|
102
|
+
@io.say "unknown card #{text}"
|
103
|
+
end
|
37
104
|
end
|
38
105
|
end
|
39
106
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Cardigan
|
2
|
+
class TextReportFormatter
|
3
|
+
def initialize io
|
4
|
+
@io = io
|
5
|
+
@columns = []
|
6
|
+
@heading = 'index'
|
7
|
+
@width = 2 + @heading.length + 1
|
8
|
+
end
|
9
|
+
|
10
|
+
def add_column name, length
|
11
|
+
longer = [name.length, length].max
|
12
|
+
@columns << [name, longer]
|
13
|
+
@width += longer + 3
|
14
|
+
end
|
15
|
+
|
16
|
+
def output hashes
|
17
|
+
hline
|
18
|
+
row 'index', @columns.map {|tuple| tuple.first }
|
19
|
+
hline
|
20
|
+
hashes.each_with_index do |h,i|
|
21
|
+
row i.to_s, @columns.map {|tuple| h[tuple.first]}
|
22
|
+
end
|
23
|
+
hline
|
24
|
+
end
|
25
|
+
private
|
26
|
+
def hline
|
27
|
+
@io.say ' ' + '-' * @width
|
28
|
+
end
|
29
|
+
|
30
|
+
def row first, values
|
31
|
+
a = "| #{first.ljust(@heading.length)} | "
|
32
|
+
@columns.each_with_index do |tuple, index|
|
33
|
+
a << " #{values[index].to_s.ljust(tuple[1])} |"
|
34
|
+
end
|
35
|
+
@io.say a
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cardigan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mark Ryall
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-03-
|
12
|
+
date: 2010-03-12 00:00:00 +11:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -68,7 +68,9 @@ files:
|
|
68
68
|
- lib/cardigan/directory.rb
|
69
69
|
- lib/cardigan/entry_context.rb
|
70
70
|
- lib/cardigan/io.rb
|
71
|
+
- lib/cardigan/repository.rb
|
71
72
|
- lib/cardigan/root_context.rb
|
73
|
+
- lib/cardigan/text_report_formatter.rb
|
72
74
|
- bin/cardigan
|
73
75
|
- README.rdoc
|
74
76
|
- MIT-LICENSE
|