bugzyrb 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.rdoc CHANGED
@@ -1,3 +1,7 @@
1
- = bugzyrb 0.2.0, 2010-07-08 1
1
+ = bugzyrb 0.2.1, 2010-07-09
2
+ * added status which was missing
3
+ * delete can take multiple issues
4
+
5
+ = bugzyrb 0.2.0, 2010-07-08
2
6
  * added readline support and history for fields being entered
3
7
  * optional project, component, version
data/README.rdoc CHANGED
@@ -1,6 +1,6 @@
1
1
  = bugzyrb
2
2
 
3
- A command-line bug tracking system using sqlite3 as a store.
3
+ A command-line bug/issue/feature tracking system using sqlite3 as a store.
4
4
  This is a port of bugzy.sh (bash-shell based tracker that uses tab delimited files).
5
5
 
6
6
  This is not an extensive, full-fledged bug or issue tracker such a bugzilla. Its a simple tracker that maintains one sqlite file per directory. Thus, you could create one for each project.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.2.1
data/bugzyrb.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{bugzyrb}
8
- s.version = "0.2.0"
8
+ s.version = "0.2.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Rahul Kumar"]
12
- s.date = %q{2010-07-08}
12
+ s.date = %q{2010-07-09}
13
13
  s.default_executable = %q{bugzyrb}
14
14
  s.description = %q{basic, easy-to-use command-line issue-tracker using sqlite for ruby 1.9}
15
15
  s.email = %q{sentinel1879@gmail.com}
@@ -30,10 +30,10 @@ Gem::Specification.new do |s|
30
30
  "bugzy.cfg",
31
31
  "bugzyrb.gemspec",
32
32
  "lib/bugzyrb.rb",
33
- "lib/common/cmdapp.rb",
34
- "lib/common/colorconstants.rb",
35
- "lib/common/db.rb",
36
- "lib/common/sed.rb"
33
+ "lib/bugzyrb/common/cmdapp.rb",
34
+ "lib/bugzyrb/common/colorconstants.rb",
35
+ "lib/bugzyrb/common/db.rb",
36
+ "lib/bugzyrb/common/sed.rb"
37
37
  ]
38
38
  s.homepage = %q{http://github.com/rkumar/bugzyrb}
39
39
  s.rdoc_options = ["--charset=UTF-8"]
@@ -8,7 +8,8 @@
8
8
  * License: Ruby License
9
9
 
10
10
  =end
11
- require 'common/sed'
11
+ # sed required by serial number setter only change_file
12
+ require 'bugzyrb/common/sed'
12
13
 
13
14
  ERRCODE = 1
14
15
 
@@ -133,6 +134,7 @@ module Cmdapp
133
134
  _get_serial_number
134
135
  end
135
136
  _backup filename
137
+ # from Sed
136
138
  change_row filename, pattern, "#{appname}:#{number}"
137
139
  end
138
140
 
@@ -173,8 +175,7 @@ module Cmdapp
173
175
  $valid_array = false
174
176
  @data = []
175
177
  File.open(@app_file_path).each do |line|
176
- # FIXME: use @app_delim
177
- row = line.chomp.split "\t"
178
+ row = line.chomp.split( @app_delim )
178
179
  @data << row
179
180
  end
180
181
  $valid_array = true
@@ -186,8 +187,8 @@ module Cmdapp
186
187
  raise "Cannot save array! Please use load_array to load" if $valid_array == false
187
188
 
188
189
  File.open(@app_file_path, "w") do |file|
189
- # FIXME: use join with @app_delim
190
- @data.each { |row| file.puts "#{row[0]}\t#{row[1]}" }
190
+ #@data.each { |row| file.puts "#{row[0]}\t#{row[1]}" }
191
+ @data.each { |row| file.puts row.join(@app_delim) }
191
192
  end
192
193
  end
193
194
  ##
@@ -342,6 +343,40 @@ def history_save column, str
342
343
  f << $history_hash.to_yaml
343
344
  end
344
345
  end
346
+ # separates args to list-like operations
347
+ # +xxx means xxx should match in output
348
+ # -xxx means xxx should not exist in output
349
+ # @param [Array] list of search terms to match or not-match
350
+ # @return [Array, Array] array of terms that should match, and array of terms
351
+ # that should not match.
352
+ def _list_args args
353
+ incl = []
354
+ excl = []
355
+ args.each do |e|
356
+ if e[0] == '+'
357
+ incl << e[1..-1]
358
+ elsif e[0] == '-'
359
+ excl << e[1..-1]
360
+ else
361
+ incl << e
362
+ end
363
+ end
364
+ incl = nil if incl.empty?
365
+ excl = nil if excl.empty?
366
+ return incl, excl
367
+ end
368
+ ##
369
+ # creates a regexp and for each row returns the row and the regexp
370
+ # you can use the regexp on whatever part of the row you want to match or reject
371
+ def filter_rows rows, incl
372
+ if incl
373
+ incl_str = incl.join "|"
374
+ r = Regexp.new incl_str
375
+ #rows = rows.select { |row| row['title'] =~ r }
376
+ rows = rows.select { |row| yield(row, r) }
377
+ end
378
+ rows
379
+ end
345
380
 
346
381
 
347
382
 
File without changes
@@ -73,30 +73,6 @@ module Database
73
73
  return nil if rows.empty?
74
74
  return rows
75
75
  end
76
- ##
77
- # insert a issue or bug report into the database
78
- # @params
79
- # @return [Fixnum] last row id
80
- def bugs_insert(status, severity, type, assigned_to, start_date, due_date, comment_count, priority, title, description, fix, created_by = $default_user)
81
- # id = $num
82
- # status = "CODE"
83
- # severity = "CODE"
84
- # type = "CODE"
85
- # assigned_to = "CODE"
86
- # start_date = $now
87
- # due_date = $now
88
- # comment_count = $num
89
- # priority = "CODE"
90
- # title = "CODE"
91
- # description = "Some long text"
92
- # fix = "Some long text"
93
- # date_created = $now
94
- # date_modified = $now
95
- @db.execute(" insert into bugs ( status, severity, type, assigned_to, start_date, due_date, comment_count, priority, title, description, fix, created_by ) values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
96
- status, severity, type, assigned_to, start_date, due_date, comment_count, priority, title, description, fix, created_by )
97
- rowid = @db.get_first_value( "select last_insert_rowid();")
98
- return rowid
99
- end
100
76
  ## takes a hash and creates an insert statement for table and inserts data.
101
77
  # Advantage is that as we add columns, this will add the column to the insert, so we
102
78
  # don't need to keep modifying in many places.
@@ -123,8 +99,8 @@ module Database
123
99
  rowid = @db.get_first_value( "select last_insert_rowid();")
124
100
  return rowid
125
101
  end
126
- def max_bug_id
127
- id = @db.get_first_value( "select max(id) from bugs;")
102
+ def max_bug_id table="bugs"
103
+ id = @db.get_first_value( "select max(id) from #{table};")
128
104
  return id
129
105
  end
130
106
  def sql_comments_insert id, comment, created_by = $default_user
@@ -201,14 +177,14 @@ module Database
201
177
  end
202
178
  def dummy
203
179
  id = $num
204
- status = "OPEN"
205
- severity = "CRI"
206
- type = "BUG"
180
+ status = "open"
181
+ severity = "critical"
182
+ type = "bug"
207
183
  assigned_to = "rahul"
208
184
  start_date = $now
209
185
  due_date = $now
210
186
  comment_count = 0
211
- priority = "A"
187
+ priority = "P1"
212
188
  title = "some title"
213
189
  description = "Some long text fro this bug too"
214
190
  fix = nil #"Some long text"
File without changes
data/lib/bugzyrb.rb CHANGED
@@ -10,25 +10,25 @@
10
10
  =end
11
11
  require 'rubygems'
12
12
  $:.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
13
- require 'common/colorconstants'
14
- require 'common/sed'
15
- require 'common/cmdapp'
13
+ require 'bugzyrb/common/colorconstants'
14
+ require 'bugzyrb/common/sed'
15
+ require 'bugzyrb/common/cmdapp'
16
16
  require 'subcommand'
17
17
  require 'sqlite3'
18
18
  require 'highline/import'
19
- require 'common/db'
19
+ require 'bugzyrb/common/db'
20
20
  include ColorConstants
21
21
  include Sed
22
22
  include Cmdapp
23
23
  include Subcommands
24
24
  include Database
25
25
 
26
- PRI_A = YELLOW + BOLD
27
- PRI_B = WHITE + BOLD
28
- PRI_C = GREEN + BOLD
29
- PRI_D = CYAN + BOLD
30
- VERSION = "0.0.0"
31
- DATE = "2010-06-24"
26
+ #PRI_A = YELLOW + BOLD
27
+ #PRI_B = WHITE + BOLD
28
+ #PRI_C = GREEN + BOLD
29
+ #PRI_D = CYAN + BOLD
30
+ VERSION = "0.2.0"
31
+ DATE = "2010-07-24"
32
32
  APPNAME = File.basename($0)
33
33
  AUTHOR = "rkumar"
34
34
 
@@ -63,6 +63,7 @@ class Bugzy
63
63
  # For more:
64
64
  # $ bugzyrb --help
65
65
  # $ bugzyrb --show-actions
66
+ # $ alias bu='bugzyrb'
66
67
  #
67
68
  # == TODO:
68
69
  #
@@ -213,7 +214,6 @@ SQL
213
214
  #fix = nil
214
215
  body['start_date'] = @now
215
216
  body['due_date'] = default_due_date
216
- #rowid = db.bugs_insert(status, severity, type, assigned_to, start_date, due_date, comment_count, priority, title, description, fix)
217
217
  rowid = db.table_insert_hash("bugs", body)
218
218
  puts "Issue #{rowid} created"
219
219
  type = body['type']
@@ -311,7 +311,6 @@ SQL
311
311
  body["component"]=component if $use_component
312
312
  body["version"]=version if $use_version
313
313
 
314
- #rowid = db.bugs_insert(status, severity, type, assigned_to, start_date, due_date, comment_count, priority, title, description, fix)
315
314
  rowid = db.table_insert_hash("bugs", body)
316
315
  puts "Issue #{rowid} created"
317
316
  logid = db.sql_logs_insert rowid, "create", "#{rowid} #{type}: #{title}"
@@ -441,19 +440,29 @@ TEXT
441
440
  end
442
441
  # deletes given issue
443
442
  # @param [Array] id of issue
443
+ # @example
444
+ # bu delete 1
445
+ # bu $0 delete 2 3 4
446
+ # bu $0 delete $(jot - 6 10)
444
447
  def delete args
445
- id = args.shift
446
- if @options[:force]
447
- db, row = validate_id id, false
448
- db.sql_delete_bug id
449
- exit 0
450
- end
451
- db, row = validate_id id, true
452
- if agree("Delete this issue? ")
453
- db.sql_delete_bug id
454
- else
455
- message "Operation cancelled"
448
+ #id = args.shift
449
+ ctr = 0
450
+ args.each do |id|
451
+ if @options[:force]
452
+ db, row = validate_id id, false
453
+ db.sql_delete_bug id
454
+ ctr += 1
455
+ else
456
+ db, row = validate_id id, true
457
+ if agree("Delete issue #{id}? ")
458
+ db.sql_delete_bug id
459
+ ctr += 1
460
+ else
461
+ message "Operation cancelled"
462
+ end
463
+ end
456
464
  end
465
+ message "#{ctr} issue/s deleted"
457
466
  0
458
467
  end
459
468
  def copy args
@@ -504,19 +513,7 @@ TEXT
504
513
  # list -- -linux
505
514
  def list args
506
515
  # lets look at args as search words
507
- incl = []
508
- excl = []
509
- args.each do |e|
510
- if e[0] == '+'
511
- incl << e[1..-1]
512
- elsif e[0] == '-'
513
- excl << e[1..-1]
514
- else
515
- incl << e
516
- end
517
- end
518
- incl = nil if incl.empty?
519
- excl = nil if excl.empty?
516
+ incl, excl = Cmdapp._list_args args
520
517
  db = get_db
521
518
  #db.run "select * from bugs " do |row|
522
519
  #end
@@ -547,15 +544,11 @@ TEXT
547
544
  rows = db.run "select #{fields} from bugs #{wherestring} "
548
545
  die "No rows" unless rows
549
546
 
550
- if incl
551
- incl_str = incl.join "|"
552
- r = Regexp.new incl_str
553
- rows = rows.select { |row| row['title'] =~ r }
547
+ rows = Cmdapp.filter_rows( rows, incl) do |row, regexp|
548
+ row['title'] =~ regexp
554
549
  end
555
- if excl
556
- excl_str = excl.join "|"
557
- r = Regexp.new excl_str
558
- rows = rows.select { |row| row['title'] !~ r }
550
+ rows = Cmdapp.filter_rows( rows, excl) do |row, regexp|
551
+ row['title'] !~ regexp
559
552
  end
560
553
  headings = fields.split ","
561
554
  # if you want to filter output send a delimiter
@@ -717,7 +710,11 @@ TEXT
717
710
  if respond_to? meth
718
711
  #bool = send("validate_#{field}".to_sym, value)
719
712
  bool = send(meth, value)
720
- die "#{value} is not valid for #{field}" unless bool
713
+ # try to find out values
714
+ #vfield = "@valid_#{field}"
715
+ #valid = eval(vfield).join(",")
716
+ #die "#{value} is not valid for #{field} (#{valid})" unless bool
717
+ return 1 unless bool
721
718
  end
722
719
  args.each do |id|
723
720
  db, row = validate_id id
@@ -735,6 +732,14 @@ TEXT
735
732
  end
736
733
  0
737
734
  end
735
+ def status args
736
+ value = args.shift
737
+ ret = change_value "status", value, args
738
+ if ret != 0
739
+ die "#{value} is not valid for status. Valid are (#{@valid_status.join(',')})"
740
+ end
741
+ 0
742
+ end
738
743
  # close an issue (changes status of issue/s)
739
744
  # @param [Array] array of id's to close (argv)
740
745
  # @return [0] for success
@@ -861,6 +866,10 @@ TEXT
861
866
  return tag, items
862
867
  end
863
868
 
869
+ # get choice from user from a list of options
870
+ # @param [String] prompt text
871
+ # @param [Array] values to chose from
872
+ # FIXME: move to Cmdapp
864
873
  def _choice prompt, choices
865
874
  choose do |menu|
866
875
  menu.prompt = prompt
@@ -877,6 +886,7 @@ TEXT
877
886
  # @return [String, nil] users choice
878
887
  #
879
888
  # TODO: should we not check for the ask_x methods and call them if present.
889
+ # FIXME: move to Cmdapp
880
890
  def user_input column, prompt_flag, prompt_text=nil, choices=nil, default=nil
881
891
  if prompt_flag == true
882
892
  prompt_flag = :freeform
@@ -895,11 +905,11 @@ TEXT
895
905
  when :multiline, :ml
896
906
  return Cmdapp::edit_text default
897
907
  when false
898
- #return nil
899
908
  return default
900
909
  end
901
910
  end
902
911
  def test args=nil
912
+ puts "This is only for testing things out"
903
913
  if $use_project
904
914
  project = user_input('project', $prompt_project, nil, $valid_project, $default_project)
905
915
  puts project
@@ -910,9 +920,10 @@ TEXT
910
920
  end
911
921
  end
912
922
  ## prompts user for multiline input
923
+ # NOTE: we do not take Ctrl-d as EOF then causes an error in next input in 1.9 (not 1.8)
913
924
  # @param [String] text to use as prompt
914
925
  # @return [String, nil] string with newlines or nil (if nothing entered).
915
- #
926
+ # FIXME: move to Cmdapp
916
927
  def get_lines prompt=nil
917
928
  #prompt ||= "Enter multiple lines, to quit enter . on empty line"
918
929
  #message prompt
@@ -927,6 +938,9 @@ TEXT
927
938
  return nil if str == ""
928
939
  return str.chomp
929
940
  end
941
+ # get a string from user, using readline or gets
942
+ # if readline, then manage column specific history
943
+ # FIXME: move to Cmdapp.
930
944
  def _gets column, prompt, default=nil
931
945
  text = "#{prompt}? "
932
946
  text << "|#{default}|" if default
@@ -1169,16 +1183,17 @@ TEXT
1169
1183
  #}
1170
1184
  end
1171
1185
  Subcommands::command :status do |opts|
1172
- opts.banner = "Usage: status [options] <STATUS> <TASKS>"
1173
- opts.description = "Change the status of a task. \t<STATUS> are open closed started pending hold next"
1174
- opts.on("--recursive", "operate on subtasks also") { |v|
1175
- options[:recursive] = v
1176
- }
1177
- end
1178
- Subcommands::command :tag do |opts|
1179
- opts.banner = "Usage: tag <TAG> <TASKS>"
1180
- opts.description = "Add a tag to an item/s. "
1186
+ opts.banner = "Usage: status [options] <STATUS> <ISSUE>"
1187
+ opts.description = "Change the status of an issue. \t<STATUS> are open closed started canceled stopped "
1188
+ #opts.on("--recursive", "operate on subtasks also") { |v|
1189
+ #options[:recursive] = v
1190
+ #}
1181
1191
  end
1192
+ # TODO:
1193
+ #Subcommands::command :tag do |opts|
1194
+ #opts.banner = "Usage: tag <TAG> <TASKS>"
1195
+ #opts.description = "Add a tag to an item/s. "
1196
+ #end
1182
1197
  #Subcommands::alias_command :open , "status","open"
1183
1198
  #Subcommands::alias_command :close , "status","closed"
1184
1199
  cmd = Subcommands::opt_parse()
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 2
8
- - 0
9
- version: 0.2.0
8
+ - 1
9
+ version: 0.2.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - Rahul Kumar
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-07-08 00:00:00 +05:30
17
+ date: 2010-07-09 00:00:00 +05:30
18
18
  default_executable: bugzyrb
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -121,10 +121,10 @@ files:
121
121
  - bugzy.cfg
122
122
  - bugzyrb.gemspec
123
123
  - lib/bugzyrb.rb
124
- - lib/common/cmdapp.rb
125
- - lib/common/colorconstants.rb
126
- - lib/common/db.rb
127
- - lib/common/sed.rb
124
+ - lib/bugzyrb/common/cmdapp.rb
125
+ - lib/bugzyrb/common/colorconstants.rb
126
+ - lib/bugzyrb/common/db.rb
127
+ - lib/bugzyrb/common/sed.rb
128
128
  has_rdoc: true
129
129
  homepage: http://github.com/rkumar/bugzyrb
130
130
  licenses: []