From 4035f366f3bfd6c57468d5cfdd89aceae2992b83 Mon Sep 17 00:00:00 2001 From: Jonathan Bernard Date: Thu, 18 Feb 2010 11:02:20 -0600 Subject: [PATCH] Finished libpit 1.1.0. Added change operations (priority, category, etc) Began unit testing of libpit. Made most of the changes to pit-cli needed to incorporate the new libpit features. --- issues/libpit/0002c6.rst | 4 +- issues/libpit/0003c6.rst | 6 +- issues/libpit/{0004f7.rst => 0004c7.rst} | 2 + issues/libpit/{0005t1.rst => 0005t5.rst} | 0 issues/libpit/{0006t1.rst => 0006t5.rst} | 0 issues/libpit/{0007t1.rst => 0007t5.rst} | 0 issues/libpit/{0008t1.rst => 0008t5.rst} | 0 issues/libpit/{0009t1.rst => 0009t5.rst} | 0 issues/libpit/{0010t1.rst => 0010t5.rst} | 0 issues/libpit/{0011t2.rst => 0011t6.rst} | 0 issues/libpit/{0012t1.rst => 0012c1.rst} | 2 + issues/libpit/{0013t1.rst => 0013c1.rst} | 3 + issues/libpit/{0014t1.rst => 0014c1.rst} | 1 + issues/libpit/{0015t1.rst => 0015t5.rst} | 0 issues/pit-cli/0003c5.rst | 2 + issues/pit-cli/0004c5.rst | 2 + issues/pit-cli/0005f4.rst | 2 + libpit/build.xml | 28 +++- libpit/project.properties | 12 +- libpit/release/pit-1.1.0.jar | Bin 0 -> 26456 bytes libpit/src/com/jdbernard/pit/Category.groovy | 2 + libpit/src/com/jdbernard/pit/Filter.groovy | 7 +- libpit/src/com/jdbernard/pit/Issue.groovy | 12 +- libpit/src/com/jdbernard/pit/Project.groovy | 52 ++++--- .../test/com/jdbernard/pit/FilterTest.groovy | 12 ++ .../test/com/jdbernard/pit/IssueTest.groovy | 57 +++++--- .../test/com/jdbernard/pit/ProjectTest.groovy | 115 +++++++++++++++ pit-cli/build.xml | 22 ++- pit-cli/lib/commons-cli-1.2.jar | Bin 0 -> 41123 bytes pit-cli/lib/pit-1.0.0.jar | Bin 24889 -> 0 bytes pit-cli/project.properties | 6 +- .../pit/PersonalIssueTrackerCLI.groovy | 137 ++++++++++++++++++ .../pit/PersonalIssurTrackerCLI.groovy | 51 ------- 33 files changed, 425 insertions(+), 112 deletions(-) rename issues/libpit/{0004f7.rst => 0004c7.rst} (72%) rename issues/libpit/{0005t1.rst => 0005t5.rst} (100%) rename issues/libpit/{0006t1.rst => 0006t5.rst} (100%) rename issues/libpit/{0007t1.rst => 0007t5.rst} (100%) rename issues/libpit/{0008t1.rst => 0008t5.rst} (100%) rename issues/libpit/{0009t1.rst => 0009t5.rst} (100%) rename issues/libpit/{0010t1.rst => 0010t5.rst} (100%) rename issues/libpit/{0011t2.rst => 0011t6.rst} (100%) rename issues/libpit/{0012t1.rst => 0012c1.rst} (63%) rename issues/libpit/{0013t1.rst => 0013c1.rst} (62%) rename issues/libpit/{0014t1.rst => 0014c1.rst} (61%) rename issues/libpit/{0015t1.rst => 0015t5.rst} (100%) create mode 100644 issues/pit-cli/0003c5.rst create mode 100644 issues/pit-cli/0004c5.rst create mode 100644 issues/pit-cli/0005f4.rst create mode 100644 libpit/release/pit-1.1.0.jar create mode 100644 libpit/test/com/jdbernard/pit/FilterTest.groovy create mode 100644 libpit/test/com/jdbernard/pit/ProjectTest.groovy create mode 100644 pit-cli/lib/commons-cli-1.2.jar delete mode 100644 pit-cli/lib/pit-1.0.0.jar create mode 100644 pit-cli/src/com/jdbernard/pit/PersonalIssueTrackerCLI.groovy delete mode 100644 pit-cli/src/com/jdbernard/pit/PersonalIssurTrackerCLI.groovy diff --git a/issues/libpit/0002c6.rst b/issues/libpit/0002c6.rst index be412bc..1c87fc8 100644 --- a/issues/libpit/0002c6.rst +++ b/issues/libpit/0002c6.rst @@ -1,5 +1,5 @@ -Add the ability to change an issue's status -=========================================== +Add the ability to change an issue's category +============================================= The -l/--list options lists issues, add a set of options to reclassify an issue from one category to another. The most common is CLOSED, but diff --git a/issues/libpit/0003c6.rst b/issues/libpit/0003c6.rst index c740c7a..155a3a1 100644 --- a/issues/libpit/0003c6.rst +++ b/issues/libpit/0003c6.rst @@ -1,4 +1,2 @@ -Add the ability to re-prioritize a set of issues -================================================ - -Add a mode that changes the priority of a selection of issues. +Add the ability to re-prioritize an issue. +========================================== diff --git a/issues/libpit/0004f7.rst b/issues/libpit/0004c7.rst similarity index 72% rename from issues/libpit/0004f7.rst rename to issues/libpit/0004c7.rst index 21e9f8f..f736655 100644 --- a/issues/libpit/0004f7.rst +++ b/issues/libpit/0004c7.rst @@ -1,2 +1,4 @@ Add the ability to enter new issues =================================== + +Implemented on 2010/02/17 diff --git a/issues/libpit/0005t1.rst b/issues/libpit/0005t5.rst similarity index 100% rename from issues/libpit/0005t1.rst rename to issues/libpit/0005t5.rst diff --git a/issues/libpit/0006t1.rst b/issues/libpit/0006t5.rst similarity index 100% rename from issues/libpit/0006t1.rst rename to issues/libpit/0006t5.rst diff --git a/issues/libpit/0007t1.rst b/issues/libpit/0007t5.rst similarity index 100% rename from issues/libpit/0007t1.rst rename to issues/libpit/0007t5.rst diff --git a/issues/libpit/0008t1.rst b/issues/libpit/0008t5.rst similarity index 100% rename from issues/libpit/0008t1.rst rename to issues/libpit/0008t5.rst diff --git a/issues/libpit/0009t1.rst b/issues/libpit/0009t5.rst similarity index 100% rename from issues/libpit/0009t1.rst rename to issues/libpit/0009t5.rst diff --git a/issues/libpit/0010t1.rst b/issues/libpit/0010t5.rst similarity index 100% rename from issues/libpit/0010t1.rst rename to issues/libpit/0010t5.rst diff --git a/issues/libpit/0011t2.rst b/issues/libpit/0011t6.rst similarity index 100% rename from issues/libpit/0011t2.rst rename to issues/libpit/0011t6.rst diff --git a/issues/libpit/0012t1.rst b/issues/libpit/0012c1.rst similarity index 63% rename from issues/libpit/0012t1.rst rename to issues/libpit/0012c1.rst index 58cf3b7..bc9da41 100644 --- a/issues/libpit/0012t1.rst +++ b/issues/libpit/0012c1.rst @@ -1,2 +1,4 @@ Add unit tests for changing an issue's category. ================================================ + +Test defined in test/com/jdbernard/pit/IssueTest.groovy diff --git a/issues/libpit/0013t1.rst b/issues/libpit/0013c1.rst similarity index 62% rename from issues/libpit/0013t1.rst rename to issues/libpit/0013c1.rst index bdf375c..85cf118 100644 --- a/issues/libpit/0013t1.rst +++ b/issues/libpit/0013c1.rst @@ -1,2 +1,5 @@ Add unit tests for changing an issue's priority. ================================================ + + +Test defined in test/com/jdbernard/pit/IssueTest.groovy diff --git a/issues/libpit/0014t1.rst b/issues/libpit/0014c1.rst similarity index 61% rename from issues/libpit/0014t1.rst rename to issues/libpit/0014c1.rst index d904a7e..1891b0e 100644 --- a/issues/libpit/0014t1.rst +++ b/issues/libpit/0014c1.rst @@ -1,3 +1,4 @@ Add unit tests covering Issue construction. =========================================== +Test defined in test/com/jdbernard/pit/IssueTest.groovy diff --git a/issues/libpit/0015t1.rst b/issues/libpit/0015t5.rst similarity index 100% rename from issues/libpit/0015t1.rst rename to issues/libpit/0015t5.rst diff --git a/issues/pit-cli/0003c5.rst b/issues/pit-cli/0003c5.rst new file mode 100644 index 0000000..5bdd8d9 --- /dev/null +++ b/issues/pit-cli/0003c5.rst @@ -0,0 +1,2 @@ +Add the ability to change an Issue's priority. +============================================== diff --git a/issues/pit-cli/0004c5.rst b/issues/pit-cli/0004c5.rst new file mode 100644 index 0000000..91c265e --- /dev/null +++ b/issues/pit-cli/0004c5.rst @@ -0,0 +1,2 @@ +Add the ability to change an Issue's category. +============================================== diff --git a/issues/pit-cli/0005f4.rst b/issues/pit-cli/0005f4.rst new file mode 100644 index 0000000..564c4e7 --- /dev/null +++ b/issues/pit-cli/0005f4.rst @@ -0,0 +1,2 @@ +Add the ability to create a new issue. +====================================== diff --git a/libpit/build.xml b/libpit/build.xml index d6077a0..c40f8a2 100644 --- a/libpit/build.xml +++ b/libpit/build.xml @@ -14,6 +14,12 @@ + + + + + + - + + + + + + + + + + + + + + + + + + 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 literal 0 HcmV?d00001 diff --git a/libpit/src/com/jdbernard/pit/Category.groovy b/libpit/src/com/jdbernard/pit/Category.groovy index f6edd51..7a4eaf1 100644 --- a/libpit/src/com/jdbernard/pit/Category.groovy +++ b/libpit/src/com/jdbernard/pit/Category.groovy @@ -11,4 +11,6 @@ public enum Category { if (c.toString().startsWith(s.toUpperCase())) return c throw new IllegalArgumentException("No category matches ${s}.") } + + public String getSymbol() { toString()[0].toLowerCase() } } diff --git a/libpit/src/com/jdbernard/pit/Filter.groovy b/libpit/src/com/jdbernard/pit/Filter.groovy index 70eadd9..59f33f7 100644 --- a/libpit/src/com/jdbernard/pit/Filter.groovy +++ b/libpit/src/com/jdbernard/pit/Filter.groovy @@ -7,8 +7,11 @@ class Filter { List ids = null int priority = 9 boolean acceptProjects = true - Closure projectSorter - Closure issueSorter + Closure projectSorter = defaultIssueSorter + Closure issueSorter = defaultProjectSorter + + public static Closure defaultIssueSorter = { it.id.toInteger() } + public static Closure defaultProjectSorter = { it.name } public boolean accept(Issue i) { return (i.priority <= priority && diff --git a/libpit/src/com/jdbernard/pit/Issue.groovy b/libpit/src/com/jdbernard/pit/Issue.groovy index 5c0ef4e..8d21d9f 100644 --- a/libpit/src/com/jdbernard/pit/Issue.groovy +++ b/libpit/src/com/jdbernard/pit/Issue.groovy @@ -26,16 +26,22 @@ public class Issue { void setCategory(Category c) { this.category = c - source.renameTo(getFilename()) + source.renameTo(new File(source.canonicalFile.parentFile, getFilename())) } void setPriority(int p) { if (p < 0) priority = 0 else if (p > 9) priority = 9 else priority = p - source.renameTo(getFilename()) + source.renameTo(new File(source.canonicalFile.parentFile, getFilename())) } - String getFilename() { return id + category.symbol + priority + ".rst"; } + String getFilename() { return makeFilename(id, category, priority) } + static String makeFilename(String id, Category category, int priority) { + return id + category.symbol + priority + ".rst"; + } + + @Override + String toString() { return "${id}(${priority}): ${category} ${title}" } } diff --git a/libpit/src/com/jdbernard/pit/Project.groovy b/libpit/src/com/jdbernard/pit/Project.groovy index 37fb7c1..9565790 100644 --- a/libpit/src/com/jdbernard/pit/Project.groovy +++ b/libpit/src/com/jdbernard/pit/Project.groovy @@ -38,16 +38,26 @@ class Project { } } - public void rename(String newName) { source.renameTo(newName) } + public void rename(String newName) { + this.name = newName + source.renameTo(new File(source.canonicalFile.parentFile, newName)) + } + + public void setName(String name) { rename(name) } - public void eachIssue(Closure c) { - for (i in issues.values()) c.call(i) - for (p in projects.values()) p.eachIssue(c) + public void eachIssue(Filter filter = null, Closure c) { + def sorter = filter?.issueSorter ?: Filter.defaultIssueSorter + for (i in issues.values().sort(sorter)) c.call(i) + } + + public void eachProject(Filter filter = null, Closure c) { + def sorter = filter?.projectSorter ?: Filter.defaultProjectSorter + for (p in projects.values().sort(sorter)) c.call(p) } public void each(Filter filter = null, Closure c) { - def is = filter?.issueSorter ?: { it.id.toInteger() } - def ps = filter?.projectSorter ?: { it.name } + def is = filter?.issueSorter ?: Filter.defaultIssueSorter + def ps = filter?.projectSorter ?: Filter.defaultProjectSorter for (issue in issues.values().sort(is)) { if (filter && !filter.accept(issue)) @@ -61,23 +71,25 @@ class Project { return c.call(project) - project.each(c) } } - public void list(Map options = [:]) { - if (!options.offset) options.offset = "" - if (!options.verbose) options.verbose = false + public Issue createNewIssue(Map options) { + if (!options.category) options.category = Category.TASK + if (!options.priority) options.priority = 5 + if (!options.text) options.text = "Default issue title.\n" + + "====================\n" + String id = (issues.values().max { it.id.toInteger() }).id - each(options.filter) { - if (it instanceof Project) { - println "\n${options.offset}${it.name}" - println "${options.offset}${'-'.multiply(it.name.length())}" - } else { - println "${options.offset}${it.id}(${it.priority}): " + - "${it.category} ${it.title}" - if (options.verbose) println "\n${it.text}" - } - } + def issueFile = new File(source, Issue.makeFilename(id, options.category, options.priority)) + assert !issueFile.exists() + issueFile.createNewFile() + issueFile.write(options.text) + + return new Issue(issueFile) } + + @Override + String toString() { return name } + } diff --git a/libpit/test/com/jdbernard/pit/FilterTest.groovy b/libpit/test/com/jdbernard/pit/FilterTest.groovy new file mode 100644 index 0000000..cf9c89e --- /dev/null +++ b/libpit/test/com/jdbernard/pit/FilterTest.groovy @@ -0,0 +1,12 @@ +package com.jdbernard.pit + +import org.junit.Test +import static org.junit.Assert.assertTrue + +class FilterTest { + + @Test void emptyTest() { + + } + +} diff --git a/libpit/test/com/jdbernard/pit/IssueTest.groovy b/libpit/test/com/jdbernard/pit/IssueTest.groovy index 4a45720..2221e11 100644 --- a/libpit/test/com/jdbernard/pit/IssueTest.groovy +++ b/libpit/test/com/jdbernard/pit/IssueTest.groovy @@ -1,6 +1,10 @@ package com.jdbernard.pit -class IssueTest +import org.junit.* +import static org.junit.Assert.assertTrue +import static org.junit.Assert.assertFalse + +class IssueTest { def issues File testDir @@ -23,43 +27,60 @@ class IssueTest issueFile.write( "Obtain donuts.\n" + "==============\n\n" + - "The office is seriously lacking in sugary donuts.\n\n + "The office is seriously lacking in sugary donuts.\n\n" + "We must rectify this at once!") issues << new Issue(issueFile) } - @AfterClass void deleteIssueFiles() { + @After void deleteIssueFiles() { testDir.deleteDir() } @Test void testSetCategory() { - assert issues[0].category == Category.FEATURE - assert issues[1].category == Category.TASK + assertTrue issues[0].category == Category.FEATURE + assertTrue issues[1].category == Category.TASK - issues[0].category == Category.CLOSED - issues[1].category == Category.TASK + issues[0].category = Category.CLOSED + issues[1].category = Category.BUG - assert issues[0].category == Category.CLOSED - assert issues[1].category == Category.BUG + assertTrue issues[0].category == Category.CLOSED + assertTrue issues[1].category == Category.BUG - assert new File(testDir, '0001c1.rst').exists() - assert new File(testDir, '0002b5.rst').exists() + assertTrue new File(testDir, '0001c1.rst').exists() + assertTrue new File(testDir, '0002b5.rst').exists() assertFalse new File(testDir, '0001f1.rst').exists() assertFalse new File(testDir, '0002t5.rst').exists() } - @Test void testIssueConstructor() { + @Test void testSetPriority() { + + assertTrue issues[0].priority == 1 + assertTrue issues[1].priority == 5 + + issues[0].priority = 2 + issues[1].priority = 9 + + assertTrue issues[0].priority == 2 + assertTrue issues[1].priority == 9 + + assertTrue new File(testDir, '0001f2.rst').exists() + assertTrue new File(testDir, '0002t9.rst').exists() + assertFalse new File(testDir, '0001f1.rst').exists() + assertFalse new File(testDir, '0002t5.rst').exists() + } + + @Test void testConstruction() { File issueFile = new File(testDir, '0001f1.rst') Issue issue = new Issue(issueFile) - assert issue.id == "0001" - assert issue.category == Category.FEATURE - assert issue.priority == 1 - assert issue.title == "Add the killer feature to the killer app." - assert issue.text == "Add the killer feature to the killer app.\n" + + assertTrue issue.id == "0001" + assertTrue issue.category == Category.FEATURE + assertTrue issue.priority == 1 + assertTrue issue.title == "Add the killer feature to the killer app." + assertTrue issue.text == "Add the killer feature to the killer app.\n" + "=========================================\n\n" + "Make our killer app shine!." - assert issue.source == issueFile + assertTrue issue.source == issueFile } } diff --git a/libpit/test/com/jdbernard/pit/ProjectTest.groovy b/libpit/test/com/jdbernard/pit/ProjectTest.groovy new file mode 100644 index 0000000..044c474 --- /dev/null +++ b/libpit/test/com/jdbernard/pit/ProjectTest.groovy @@ -0,0 +1,115 @@ +package com.jdbernard.pit + +import org.junit.After +import org.junit.Before +import org.junit.Test +import static org.junit.Assert.assertTrue +import static org.junit.Assert.assertFalse + +class ProjectTest { + + File testDir + Project rootProj + + @Before void createTestProjects() { + testDir = new File('testdir') + testDir.mkdirs() + + def issueFile = new File(testDir, '0001t5.rst') + issueFile.createNewFile() + issueFile.write('Test Issue 1\n' + + '============\n\n' + + 'This is the first test issue.') + + issueFile = new File(testDir, '0002b5.rst') + issueFile.createNewFile() + issueFile.write('Test Bug\n' + + '========\n\n' + + 'Yeah, it is a test bug.') + + issueFile = new File(testDir, '0003f2.rst') + issueFile.createNewFile() + issueFile.write('Important Feature Request\n' + + '=========================\n\n' + + 'Here is our sweet feature. Please implement it!') + + def subDir = new File(testDir, 'subproj1') + subDir.mkdirs() + + issueFile = new File(subDir, '0001f3.rst') + issueFile.createNewFile() + issueFile.write('First feature in subproject\n' + + '===========================\n\n' + + 'Please make the grubblers grobble.') + + issueFile = new File(subDir, '0002b4.rst') + issueFile.createNewFile() + issueFile.write('Zippners are not zippning.\n' + + '==========================\n\n' + + 'For some reason, the Zippners are bilperring, not zippning.') + + rootProj = new Project(testDir) + } + + @After void deleteTestProjects() { + testDir.delete() + } + + @Test void testConstruction() { + Project proj = new Project(testDir, null) + + assertTrue proj.name == 'testdir' + assertTrue proj.issues.size() == 3 + assertTrue proj.projects.size() == 1 + + // Issue construction in general is under test in IssueTest + // just check that the issues actually exists + assertTrue proj.issues['0001'].id == '0001' + assertTrue proj.issues['0001'].title == 'Test Issue 1' + + assertTrue proj.issues['0002'].id == '0002' + assertTrue proj.issues['0002'].title == 'Test Bug' + + assertTrue proj.issues['0003'].id == '0003' + assertTrue proj.issues['0003'].title == 'Important Feature Request' + + // check sub-project behaviour + assertTrue proj.projects.subproj1 != null + assertTrue proj.projects.subproj1.name == 'subproj1' + assertTrue proj.projects.subproj1.issues.size() == 2 + assertTrue proj.projects.subproj1.projects.size() == 0 + assertTrue proj.projects.subproj1.issues['0001'].id == '0001' + assertTrue proj.projects.subproj1.issues['0001'].title == 'First feature in subproject' + assertTrue proj.projects.subproj1.issues['0002'].id == '0002' + assertTrue proj.projects.subproj1.issues['0002'].title == 'Zippners are not zippning.' + } + + @Test void testRename() { + assert rootProj.name == 'testdir' + + rootProj.rename('renamedTestDir') + + assertTrue rootProj.name == 'renamedTestDir' + assertTrue new File('renamedTestDir').exists() + } + + /*@Test void testEachIssue() { + def expectedList = [rootProj.issues['0001'], + rootProj.issues['0002'], rootProj.issues['0003']] + + // sort using default ordering (ids ascending) + def actualList = [] + rootProj.eachIssue { actualList << it } + + assertArrayEquals expectedList, actualList + + // sort using reverse ordering (ids descending) + expectedList = expectedList.reverse() + actualList = [] + + rootProj.eachIssue( + new Filter(issueSorter: { -(it.id.toInteger()) })) + { actualList << it } + }*/ + +} diff --git a/pit-cli/build.xml b/pit-cli/build.xml index 9f669c6..02aa1de 100644 --- a/pit-cli/build.xml +++ b/pit-cli/build.xml @@ -9,13 +9,29 @@ - - + + + + + + + + + + + + + + + + + + @@ -80,7 +96,7 @@ - + +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%0D2u^7bcx|ezvBT@`6 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 CNzF?D literal 0 HcmV?d00001 diff --git a/pit-cli/lib/pit-1.0.0.jar b/pit-cli/lib/pit-1.0.0.jar deleted file mode 100644 index 3d4fbb385a4f1fb9430c7391c9764b5ae16c9721..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24889 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 diff --git a/pit-cli/project.properties b/pit-cli/project.properties index ae78222..9b03586 100644 --- a/pit-cli/project.properties +++ b/pit-cli/project.properties @@ -1,9 +1,9 @@ -#Sun Feb 14 02:05:14 CST 2010 +#Wed Feb 17 17:38:59 CST 2010 build.dir=build src.dir=src build.jar=pit-cli-${application.version}.${build.number}.jar -build.number=1 -expected.application.version=1.0.0 +build.number=28 +expected.application.version=1.1.0 lib.dir=lib release.dir=release release.jar=pit-cli-${application.version}.jar diff --git a/pit-cli/src/com/jdbernard/pit/PersonalIssueTrackerCLI.groovy b/pit-cli/src/com/jdbernard/pit/PersonalIssueTrackerCLI.groovy new file mode 100644 index 0000000..a7bf960 --- /dev/null +++ b/pit-cli/src/com/jdbernard/pit/PersonalIssueTrackerCLI.groovy @@ -0,0 +1,137 @@ +package com.jdbernard.pit + +import static java.lang.Math.max +import static java.lang.Math.min + +def cli = new CliBuilder(usage: '') +cli.h(longOpt: 'help', 'Show help information.') +cli.v(longOpt: 'verbose', 'Show verbose task information') +cli.l(longOpt: 'list', 'List issues. Unless otherwise specified it lists all ' + + 'sub projects and all unclosed issue categories.') +cli.i(argName: 'id', longOpt: 'id', args: 1, + 'Filter issues by id. Accepts a comma-delimited list.') +cli.c(argName: 'category', longOpt: 'category', args: 1, + 'Filter issues by category (bug, feature, task, closed). Accepts a ' + + 'comma-delimited list.') +cli.p(argName: 'priority', longOpt: 'priority', args: 1, + 'Filter issues by priority. This acts as a threshhold, listing all issues ' + + 'greater than or equal to the given priority.') +cli.r(argName: 'project', longOpt: 'project', args: 1, + 'Filter issues by project (relative to the current directory). Accepts a ' + + 'comma-delimited list.') +cli.s(longOpt: 'show-subprojects', + 'Include sup projects in listing (default behaviour)') +cli.S(longOpt: 'no-subprojects', 'Do not list subprojects.') +cli.P(argName: 'new-priority', longOpt: 'set-priority', args: 1, + required: false, 'Modify the priority of the selected issues.') +cli.C(argName: 'new-category', longOpt: 'set-category', args: 1, + required: false, 'Modify the category of the selected issues.') +cli.n(longOpt: 'new-issue', 'Create a new issue.') + +def opts = cli.parse(args) +def issuedb = [:] + +if (!opts) System.exit(1) // better solution? + +if (opts.h) cli.usage() + +def categories = ['bug','feature','task'] +if (opts.c) categories = opts.c.split(/[,\s]/) +categories = categories.collect { Category.toCategory(it) } + +// build issue list +issuedb = new Project(new File('.'), + new Filter('categories': categories, + 'priority': (opts.p ? opts.p.toInteger() : 9), + 'projects': (opts.r ? opts.r.toLowerCase().split(/[,\s]/).asType(List.class) : []), + 'ids': (opts.i ? opts.i.split(/[,\s]/).asType(List.class) : []), + 'acceptProjects': (opts.s || !opts.S))) + +// list first +if (opts.l) { + def issuePrinter = { issue, offset -> + println "${offset}${issue}" + if (opts.v) { + println "" + issue.text.eachLine { println "${offset} ${it}" } + println "" + } + } + + def projectPrinter + projectPrinter = { project, offset -> + println "\n${offset}${project.name}" + println "${offset}${'-'.multiply(project.name.length())}" + project.eachIssue { issuePrinter.call(it, offset) } + project.eachProject { projectPrinter.call(it, offset + " ") } + } + + issuedb.eachIssue { issuePrinter.call(it, "") } + issuedb.eachProject { projectPrinter.call(it, "") } + +} + +// change priority second +else if (opts.P) { + def priority + try { priority = max(0, min(9, opts.P.toInteger())) } + catch (e) { println "Invalid priority: ${opts.P}"; return 1 } + + walkProject(issuedb) { it.priority = priority } +} +// change category third +else if (opts.C) { + def cat + try { cat = Category.toCategory(opts.C) } + catch (e) { println "Invalid category: ${opts.C}"; return 1 } + + walkProject(issuedb) { it.category = cat } +} +// new entry last +else if (opts.n) { + def cat, priority + String text = "" + Issue ussie + def sin = System.in.newReader() + + while(true) { + try { + print "Category (bug, feature, task, closed): " + cat = Category.toCategory(sin.readLine()) + break + } catch (e) { + println "Invalid category: " + e.getLocalizedMessage() + println "Valid options are: \n${Category.values().join(', ')}\n " + + "(abbreviations are accepted.)" + } + } + + while (true) { + try { + print "Priority (0-9): " + priority = max(0, min(9, sin.readLine().toInteger())) + break + } catch (e) { println "Not a valid value." } + } + + println "Enter issue (use EOF of ^D to end): " + try { + sin.eachLine { line -> + def m = line =~ /(.*)EOF.*/ + if (m) { + text << m[0][1] + sin.close() + } else text << line + } + } catch (e) {} + + issue = issuedb.createNewIssue(category: cat, priority: priority, text: text) + + println "New issue created: " + println issue +} + +def walkProject(Project p, Closure c) { + p.eachIssue(c) + p.eachProject { walkProject(it, c) } +} diff --git a/pit-cli/src/com/jdbernard/pit/PersonalIssurTrackerCLI.groovy b/pit-cli/src/com/jdbernard/pit/PersonalIssurTrackerCLI.groovy deleted file mode 100644 index 8dce79b..0000000 --- a/pit-cli/src/com/jdbernard/pit/PersonalIssurTrackerCLI.groovy +++ /dev/null @@ -1,51 +0,0 @@ -package com.jdbernard.pit - -def cli = new CliBuilder(usage: '') -cli.h(longOpt: 'help', 'Show help information.') -cli.v(longOpt: 'verbose', 'Show verbose task information') -cli.l(longOpt: 'list', 'List issues. Unless otherwise specified it lists all ' - + 'sub projects and all unclosed issue categories.') -cli.i(argName: 'id', longOpt: 'id', args: 1, - 'Filter issues by id. Accepts a comma-delimited list.') -cli.c(argName: 'category', longOpt: 'category', args: 1, - 'Filter issues by category (bug, feature, task, closed). Accepts a ' - + 'comma-delimited list.') -cli.p(argName: 'priority', longOpt: 'priority', args: 1, - 'Filter issues by priority. This acts as a threshhold, listing all issues ' - + 'greater than or equal to the given priority.') -cli.r(argName: 'project', longOpt: 'project', args: 1, - 'Filter issues by project (relative to the current directory). Accepts a ' - + 'comma-delimited list.') -cli.s(longOpt: 'show-subprojects', - 'Include sup projects in listing (default behaviour)') -cli.S(longOpt: 'no-subprojects', 'Do not list subprojects.') - -def opts = cli.parse(args) -def issuedb = [:] - -if (!opts) System.exit(1) // better solution? - -if (opts.h) cli.usage() - -def categories = ['bug','feature','task'] -if (opts.c) categories = opts.c.split(/[,\s]/) -categories = categories.collect { Category.toCategory(it) } - -// build issue list -issuedb = new Project(new File('.'), - new Filter('categories': categories, - 'priority': (opts.p ? opts.p.toInteger() : 9), - 'projects': (opts.r ? opts.r.toLowerCase().split(/[,\s]/).asType(List.class) : []), - 'ids': (opts.i ? opts.i.split(/[,\s]/).asType(List.class) : []), - 'acceptProjects': (opts.s || !opts.S))) - -// list first -if (opts.l) issuedb.list('verbose': opts.v) - -// change priority second -//else if (opts.cp) - -// change category third -//else if (opts.cc) - -// new entry last