cardigan 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,12 @@
1
+ # 0.1.1 (unreleased)
2
+
3
+ * fixed bug - cardigan would crash when entering workflow shell if no workflow existed yet
4
+ * fixed bug - csv import didn't use correct 1.9 csv api
5
+ * fixed bug - import was ignoring id when a card with that id did not already exist
6
+ * fixed bug - cards were not saved after cd unless an attribute other than name was set
7
+ * added .cardigan file to store display and sort columns and filter
8
+ * added direct execution of commands (to bypass entering the shell)
9
+ * added zsh completion
10
+ * removed support for 1.9
11
+ * added heaps of testing
12
+ * documentation now published to relishapp/cardigan
@@ -0,0 +1,126 @@
1
+ # Cardigan
2
+
3
+ A simple command line project task tracking tool.
4
+
5
+ ## Rationale
6
+
7
+ * command line tools are faster and cooler than any gui or web interface
8
+ * it makes sense to store work items in your source repository
9
+ * tab completion is awesome
10
+
11
+ ## Installation
12
+
13
+ gem install cardigan
14
+
15
+ ## Usage
16
+
17
+ cardigan
18
+
19
+ This will prompt for your name and email address (and store them in ~/.cardigan), create a folder called .cards in the current directory and enter a shell. The idea is that you will run this at the root of a git/hg/svn/whatever repository and manage the cards in the same way you manage your source code.
20
+
21
+ cardigan >
22
+
23
+ So what now?
24
+
25
+ ## Listing mode
26
+
27
+ You start in listing mode.
28
+
29
+ To get the list of available commands:
30
+
31
+ ?
32
+
33
+ To get help for a specific command:
34
+
35
+ ? filter
36
+
37
+ Here are a few of the commands:
38
+
39
+ touch write some documentation
40
+
41
+ ... will create a new card called 'write some documentation'
42
+
43
+ cd write some documentation
44
+
45
+ ... enters edit mode for the 'write some documentation' card (note that tab completion is provided for the card name)
46
+
47
+ ls
48
+
49
+ ... will present a list of the current set of cards
50
+
51
+ columns name estimate
52
+
53
+ ... will change the display columns to 'name' and 'estimate'
54
+
55
+ filter card['owner'] == me
56
+
57
+ ... will filter the list of cards to show only the ones owned by you
58
+
59
+ claim 2 4 5
60
+
61
+ ... assigns cards 2, 4 and 5 to you (by setting the 'owner'). Note that these numbers are the indexes presented by the 'ls' command
62
+
63
+ unclaim 4 5
64
+
65
+ ... unsets the owner of cards 4 and 5
66
+
67
+ destroy 4
68
+
69
+ ... destroys card 4
70
+
71
+ set priority 4 6 7
72
+
73
+ ... prompts for a new value for the priority field on cards 4, 6 and 7
74
+
75
+ workflow
76
+
77
+ ... enters the workflow editing mode
78
+
79
+ count priority complexity
80
+
81
+ ... counts the number of cards with each value of the available combinations of priority and complexity
82
+
83
+ count estimate priority
84
+
85
+ ... presents the total of estimate for cards group in each value of priority
86
+
87
+ export foo
88
+
89
+ ... exports all cards (according to the current filter) to a csv file called foo.csv
90
+
91
+ import foo
92
+
93
+ ... imports the contents of foo.csv - cards will be updated with a matching id, otherwise new cards will be created.
94
+
95
+ ## Editing mode
96
+
97
+ * quit or exit or ctrl-d - exit
98
+ * list - dumps the values of all card field values
99
+ * set <key> - creates a new field and prompts for the new value
100
+ * now <status> - changes the status of the card to the given status (the tab completion will be populated with the valid subsequent statuses from the current status)
101
+
102
+ ## Workflow mode
103
+
104
+ Workflow is pretty simple - it is just for convenience in specifiying the set of valid transitions for cards with a specific status.
105
+
106
+ The only purpose is to populate tab completion for the 'now' command in edit mode for a card.
107
+
108
+ * quit or exit or ctrl-d - exit
109
+ * list - dumps the current workflow (statuses with their valid subsequent statuses)
110
+ * create <status> - creates a new status
111
+ * add <status> <statuses> - add the specified statuses as valid transitions from status
112
+ * remove <status> <statuses> - remove the specified statuses as valid transitions from status
113
+
114
+ ## Other tools
115
+
116
+ All cardigan commands can be executed directly without entering a shell:
117
+
118
+ cardigan touch create the first card
119
+ cardigan touch create the second card
120
+ cardigan ls
121
+
122
+ zsh command line completion for this can be configured by creating a symlink to the gem tools/zsh/_cardigan from one of the directories in $fpath.
123
+
124
+ ## Future plans
125
+
126
+ Refer to the .cards for detailed story breakdown but automatic vcs interaction and generating pretty html reports/charts seem to be the most important missing features.
data/Rakefile CHANGED
@@ -1,6 +1,19 @@
1
1
  require 'bundler/gem_tasks'
2
2
 
3
+ task :default => :test
4
+
3
5
  desc 'execute specifications'
4
6
  task :test do
5
- sh 'bundle exec rspec spec'
7
+ sh 'rspec spec'
8
+ sh 'cucumber'
9
+ end
10
+
11
+ SHARED_DOCS=%w{README HISTORY}
12
+
13
+ desc "Push feature documentation to relishapp using the relish-client-gem"
14
+ task :relish, :version do |t, args|
15
+ raise "rake relish[VERSION]" unless args[:version]
16
+ SHARED_DOCS.each {|doc| sh "cp #{doc}.md features/" }
17
+ sh "relish push cardigan/cardigan:#{args[:version]}"
18
+ SHARED_DOCS.each {|doc| sh "rm features/#{doc}.md" }
6
19
  end
@@ -0,0 +1,24 @@
1
+ Feature: cd
2
+
3
+ In order to manage my ideas
4
+ As a command line junkie
5
+ I want to be able to edit individual attributes of a card
6
+
7
+ The cd command is so named because within the shell, you are 'changing directory' to
8
+ edit a card.
9
+
10
+ Within the cardigan shell, note that 'cd' enters a nested shell (so you need to exit or
11
+ ctrl-d twice).
12
+
13
+ Scenario: open a card for editing
14
+ When I run `cardigan cd a very interesting card` interactively
15
+ And I type "set estimate"
16
+ And I type "10"
17
+ And I type "ls"
18
+ And I type "exit"
19
+ Then the exit status should be 0
20
+ And the stdout should contain:
21
+ """
22
+ estimate: "10"
23
+ name: "a very interesting card"
24
+ """
@@ -0,0 +1,20 @@
1
+ Feature: claim
2
+
3
+ In order to indicate to others I am allocated to a card
4
+ As a command line junkie
5
+ I want to claim cards
6
+
7
+ Scenario: claim cards
8
+ When I run `cardigan touch a very interesting card`
9
+ And I run `cardigan claim 1`
10
+ And I run `cardigan columns name owner`
11
+ And I run `cardigan ls`
12
+ Then the exit status should be 0
13
+ And the stdout should contain:
14
+ """
15
+ ---------------------------------------------------------------------
16
+ | index | name | owner |
17
+ ---------------------------------------------------------------------
18
+ | 1 | a very interesting card | "Ms Crazy Person" <you@there.com> |
19
+ ---------------------------------------------------------------------
20
+ """
@@ -0,0 +1,24 @@
1
+ Feature: columns
2
+
3
+ In order to see relevant information
4
+ As a command line junkie
5
+ I want to control the attributes that are displayed
6
+
7
+ Scenario: claim cards
8
+ When I run `cardigan` interactively
9
+ And I type "touch another interesting card"
10
+ And I type "set release 1"
11
+ And I type "ocelot"
12
+ And I type "set iteration 1"
13
+ And I type "3"
14
+ And I type "columns name release"
15
+ And I type "exit"
16
+ Then the exit status should be 0
17
+ And the stdout should contain:
18
+ """
19
+ --------------------------------------------
20
+ | index | name | release |
21
+ --------------------------------------------
22
+ | 1 | another interesting card | ocelot |
23
+ --------------------------------------------
24
+ """
@@ -0,0 +1,66 @@
1
+ Feature: count
2
+
3
+ In order to see relevant information
4
+ As a command line junkie
5
+ I want to count the cards that are displayed
6
+
7
+ Scenario: count total cards
8
+ When I run `cardigan` interactively
9
+ And I create the following cards:
10
+ | name |
11
+ | card 1 |
12
+ | card 2 |
13
+ And I type "count"
14
+ And I type "exit"
15
+ Then the exit status should be 0
16
+ And the stdout should contain:
17
+ """
18
+ -------
19
+ | count |
20
+ -------
21
+ | 2 |
22
+ -------
23
+ """
24
+
25
+ Scenario: count total cards grouped by an attribute
26
+ When I run `cardigan` interactively
27
+ And I create the following cards:
28
+ | name | release |
29
+ | card 1 | ocelot |
30
+ | card 2 | ocelot |
31
+ | card 3 | margay |
32
+ And I type "count release"
33
+ And I type "exit"
34
+ Then the exit status should be 0
35
+ And the stdout should contain:
36
+ """
37
+ -----------------
38
+ | release | count |
39
+ -----------------
40
+ | margay | 1 |
41
+ | ocelot | 2 |
42
+ | | 3 |
43
+ -----------------
44
+ """
45
+
46
+ Scenario: count total cards grouped by an attribute
47
+ When I run `cardigan` interactively
48
+ And I create the following cards:
49
+ | name | release |
50
+ | card 1 | ocelot |
51
+ | card 2 | margay |
52
+ | card 3 | |
53
+ And I type "count release"
54
+ And I type "exit"
55
+ Then the exit status should be 0
56
+ And the stdout should contain:
57
+ """
58
+ -----------------
59
+ | release | count |
60
+ -----------------
61
+ | | 1 |
62
+ | margay | 1 |
63
+ | ocelot | 1 |
64
+ | | 3 |
65
+ -----------------
66
+ """
@@ -0,0 +1,20 @@
1
+ Feature: export
2
+
3
+ In order to interoperate with other tracking systems
4
+ As a command line junkie
5
+ I want to export my cards to csv
6
+
7
+ Scenario: export cards to csv
8
+ When I run `cardigan` interactively
9
+ And I create the following cards:
10
+ | name |
11
+ | qwer |
12
+ | asdf |
13
+ | zxcv |
14
+ And I type "export cards"
15
+ And I type "exit"
16
+ Then the exit status should be 0
17
+ And the file "cards.csv" should match /^id,name$/
18
+ And the file "cards.csv" should match /^\w{8}-\w{4}-\w{4}-\w{4}-\w{12},qwer$/
19
+ And the file "cards.csv" should match /^\w{8}-\w{4}-\w{4}-\w{4}-\w{12},asdf$/
20
+ And the file "cards.csv" should match /^\w{8}-\w{4}-\w{4}-\w{4}-\w{12},zxcv$/
@@ -0,0 +1,42 @@
1
+ Feature: filter
2
+
3
+ In order to see relevant information
4
+ As a command line junkie
5
+ I want to filter the cards that are displayed
6
+
7
+ Scenario: filter cards
8
+ When I run `cardigan` interactively
9
+ And I create the following cards:
10
+ | name | release |
11
+ | another interesting card | margay |
12
+ | a seriously interesting card | ocelot |
13
+ And I type "filter card['release'] == 'ocelot'"
14
+ And I type "ls"
15
+ And I type "exit"
16
+ Then the exit status should be 0
17
+ And the stdout should contain:
18
+ """
19
+ --------------------------------------
20
+ | index | name |
21
+ --------------------------------------
22
+ | 1 | a seriously interesting card |
23
+ --------------------------------------
24
+ """
25
+
26
+ Scenario: filter cards by owner
27
+ When I run `cardigan` interactively
28
+ And I type "touch another interesting card"
29
+ And I type "touch a seriously interesting card"
30
+ And I type "claim 2"
31
+ And I type "filter card['owner'] == me"
32
+ And I type "ls"
33
+ And I type "exit"
34
+ Then the exit status should be 0
35
+ And the stdout should contain:
36
+ """
37
+ ----------------------------------
38
+ | index | name |
39
+ ----------------------------------
40
+ | 1 | another interesting card |
41
+ ----------------------------------
42
+ """
@@ -0,0 +1,32 @@
1
+ Feature: import
2
+
3
+ In order to interoperate with other tracking systems
4
+ As a command line junkie
5
+ I want to import cards from csv
6
+
7
+ Scenario: import cards containing ids from csv
8
+ Given a file named "cards1.csv" with:
9
+ """
10
+ id,name,estimate
11
+ 10,qwer,1
12
+ 11,adsf,2
13
+ 12,zxcv,3
14
+ """
15
+ When I run `cardigan import cards1`
16
+ And I run `cardigan ls`
17
+ And I run `cardigan export cards2`
18
+ Then the exit status should be 0
19
+ And the stdout should contain:
20
+ """
21
+ --------------
22
+ | index | name |
23
+ --------------
24
+ | 1 | adsf |
25
+ | 2 | qwer |
26
+ | 3 | zxcv |
27
+ --------------
28
+ """
29
+ And the file "cards2.csv" should contain "id,estimate,name"
30
+ And the file "cards2.csv" should contain "10,1,qwer"
31
+ And the file "cards2.csv" should contain "11,2,adsf"
32
+ And the file "cards2.csv" should contain "12,3,zxcv"
@@ -0,0 +1,29 @@
1
+ Feature: ls
2
+
3
+ In order to manage my ideas
4
+ As a command line junkie
5
+ I want to list my cards
6
+
7
+ Scenario: empty card repository
8
+ When I run `cardigan ls`
9
+ Then the exit status should be 0
10
+ And the stdout should contain "There are no cards to display"
11
+
12
+ Scenario: a single card is added in shell
13
+ When I run `cardigan` interactively
14
+ And I create the following cards:
15
+ | name |
16
+ | card 1 |
17
+ | card 2 |
18
+ And I type "ls"
19
+ And I type "exit"
20
+ Then the exit status should be 0
21
+ And the stdout should contain:
22
+ """
23
+ ----------------
24
+ | index | name |
25
+ ----------------
26
+ | 1 | card 1 |
27
+ | 2 | card 2 |
28
+ ----------------
29
+ """
@@ -0,0 +1,27 @@
1
+ Feature: rm
2
+
3
+ In order to manage my ideas
4
+ As a command line junkie
5
+ I want to be able to remove cards that are no longer required
6
+
7
+ Scenario: remove a card
8
+ When I run `cardigan` interactively
9
+ And I create the following cards:
10
+ | name |
11
+ | card 1 |
12
+ | card 2 |
13
+ | card 3 |
14
+ | card 4 |
15
+ And I type "rm 2 3"
16
+ And I type "ls"
17
+ And I type "exit"
18
+ Then the exit status should be 0
19
+ And the stdout should contain:
20
+ """
21
+ ----------------
22
+ | index | name |
23
+ ----------------
24
+ | 1 | card 1 |
25
+ | 2 | card 4 |
26
+ ----------------
27
+ """