wlog 1.1.7 → 1.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.
- checksums.yaml +4 -4
- data/README.md +100 -39
- data/lib/wlog/commands/bootstrap_templates.rb +5 -0
- data/lib/wlog/commands/delete_attachment.rb +17 -0
- data/lib/wlog/commands/fetch_git_commits.rb +45 -0
- data/lib/wlog/commands/fetch_git_commits_standard.rb +29 -0
- data/lib/wlog/commands/innit_db.rb +3 -2
- data/lib/wlog/commands/write_template.rb +22 -0
- data/lib/wlog/domain/attachment.rb +26 -54
- data/lib/wlog/domain/git_commit.rb +11 -0
- data/lib/wlog/domain/issue.rb +14 -1
- data/lib/wlog/domain/key_value.rb +1 -1
- data/lib/wlog/domain/template_helper.rb +21 -0
- data/lib/wlog/migrations/fix_attachments_polymorphic_table.rb +15 -0
- data/lib/wlog/migrations/make_standard_tables.rb +0 -13
- data/lib/wlog/tech/git_commit_parser.rb +48 -0
- data/lib/wlog/tech/git_commit_printer.rb +19 -0
- data/lib/wlog/tech/uncolored_string.rb +1 -1
- data/lib/wlog/ui/bootstrap.rb +1 -0
- data/lib/wlog/ui/cli_interface.rb +2 -58
- data/lib/wlog/ui/edit_handler.rb +7 -0
- data/lib/wlog/ui/git_ui.rb +47 -0
- data/lib/wlog/ui/invoice_ui.rb +53 -36
- data/lib/wlog/ui/issue_ui.rb +57 -5
- data/lib/wlog/ui/template_ui.rb +2 -2
- data/lib/wlog/version.rb +1 -1
- data/spec/domain/attachment_spec.rb +49 -55
- data/spec/domain/commands/concat_desc_spec.rb +1 -0
- data/spec/domain/commands/new_entry_spec.rb +1 -0
- data/spec/domain/commands/replace_pattern_spec.rb +1 -0
- data/spec/domain/git_commits_spec.rb +85 -0
- data/spec/domain/invoice_spec.rb +35 -0
- data/spec/domain/issue_spec.rb +1 -0
- data/spec/domain/key_value_spec.rb +1 -0
- data/spec/domain/log_entry_spec.rb +1 -0
- data/spec/domain/sys_config_spec.rb +1 -0
- data/spec/spec_helper.rb +31 -0
- data/wlog.gemspec +3 -1
- metadata +40 -18
- data/lib/wlog/domain/session.rb +0 -17
- data/lib/wlog/domain/sql_modules/polymorphic_attachments_sql.rb +0 -24
- data/lib/wlog/domain/template_engine.rb +0 -55
- data/lib/wlog/sql/mono/1.sql +0 -50
- data/lib/wlog/sql/seq/.gitkeep +0 -0
- data/lib/wlog/sql/seq/2.sql +0 -4
- data/lib/wlog/sql/seq/3.sql +0 -3
- data/lib/wlog/ui/commands/ui_command.rb +0 -9
data/lib/wlog/ui/issue_ui.rb
CHANGED
|
@@ -8,6 +8,7 @@ require 'wlog/commands/innit_db'
|
|
|
8
8
|
require 'wlog/commands/concat_description'
|
|
9
9
|
require 'wlog/domain/sys_config'
|
|
10
10
|
require 'wlog/domain/timelog_helper'
|
|
11
|
+
require 'wlog/domain/attachment'
|
|
11
12
|
require 'wlog/ui/edit_handler'
|
|
12
13
|
|
|
13
14
|
module Wlog
|
|
@@ -30,7 +31,7 @@ class IssueUi
|
|
|
30
31
|
when /^new/ then new_entry
|
|
31
32
|
when /^(ls|show)/ then show_entries
|
|
32
33
|
when /^desc/ then describe_issue
|
|
33
|
-
when /^delete/ then delete_entry
|
|
34
|
+
when /^delete/ then delete_entry(cmd.split.drop 1)
|
|
34
35
|
when /^edit/ then EditHandler.new(@issue).edit_what(cmd.split.drop 1)
|
|
35
36
|
when /^concat/ then concat_description
|
|
36
37
|
when /^replace/ then replace_pattern
|
|
@@ -38,6 +39,9 @@ class IssueUi
|
|
|
38
39
|
when /^lt/ then time(cmd.split.drop 1) # lt for log time
|
|
39
40
|
when /^forget/ then cmd = "end"
|
|
40
41
|
when /^finish/ then finish ? cmd = "end" : nil
|
|
42
|
+
when /^attachout/ then output_attach
|
|
43
|
+
when /^attachls/ then show_attach
|
|
44
|
+
when /^attach/ then attach
|
|
41
45
|
when /^help/ then print_help
|
|
42
46
|
when /^end/ then next
|
|
43
47
|
else puts "Type 'help' for help"
|
|
@@ -50,6 +54,44 @@ class IssueUi
|
|
|
50
54
|
|
|
51
55
|
private
|
|
52
56
|
|
|
57
|
+
# Wriet out the data contained in the database of the attachment
|
|
58
|
+
def output_attach
|
|
59
|
+
att_id = Readline.readline('Which attachment to output? : ').to_i
|
|
60
|
+
loc = Readline.readline('Output where (abs dir) ? : ')
|
|
61
|
+
loc.chomp!
|
|
62
|
+
att = Attachment.find(att_id)
|
|
63
|
+
|
|
64
|
+
fh = File.open("#{loc}/#{att.filename}", 'w')
|
|
65
|
+
fh.write(att.data)
|
|
66
|
+
fh.close
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def show_attach
|
|
70
|
+
atts = @issue.attachments
|
|
71
|
+
atts.each do |att|
|
|
72
|
+
printf "[%d] - %s (alias: %s)\n", att.id, att.filename, att.given_name
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def attach
|
|
77
|
+
loc = Readline.readline('Absolute file location: ')
|
|
78
|
+
loc.strip!
|
|
79
|
+
name_alias = Readline.readline('Alias name for file (optional): ')
|
|
80
|
+
name_alias.strip!
|
|
81
|
+
|
|
82
|
+
fh = File.open(loc, "r")
|
|
83
|
+
data = fh.read
|
|
84
|
+
fh.close
|
|
85
|
+
|
|
86
|
+
att = Attachment.new(:filename => loc.split('/').last, :data => data,
|
|
87
|
+
:given_name => :name_alias)
|
|
88
|
+
@issue.attachments << att
|
|
89
|
+
|
|
90
|
+
puts 'Attached file.'
|
|
91
|
+
rescue
|
|
92
|
+
puts 'You need to provide a proper path.'
|
|
93
|
+
end
|
|
94
|
+
|
|
53
95
|
# Time logging command
|
|
54
96
|
def time(rest)
|
|
55
97
|
time = TimelogHelper.parse(rest.join)
|
|
@@ -58,12 +100,17 @@ private
|
|
|
58
100
|
end
|
|
59
101
|
|
|
60
102
|
# Print the description of the issue
|
|
61
|
-
def describe_issue;
|
|
103
|
+
def describe_issue;
|
|
104
|
+
puts @issue
|
|
105
|
+
end
|
|
62
106
|
|
|
63
107
|
# This needs updating
|
|
64
108
|
def print_help
|
|
65
109
|
["new", "Create a new log entry",
|
|
66
110
|
"outcsv", "Export everything to CSV",
|
|
111
|
+
'attach', 'Attach a file to the current issue',
|
|
112
|
+
'attachls', 'Show what files have been attached to an issue',
|
|
113
|
+
'attachout', 'Extract a file from the database',
|
|
67
114
|
"help", "print this dialog",
|
|
68
115
|
"end", "Exit the progam",
|
|
69
116
|
"search", "Search for a string in the log description text",
|
|
@@ -91,9 +138,14 @@ private
|
|
|
91
138
|
NewEntry.new(description, @issue).execute
|
|
92
139
|
end
|
|
93
140
|
|
|
94
|
-
def delete_entry
|
|
95
|
-
|
|
96
|
-
LogEntry.delete(
|
|
141
|
+
def delete_entry(cmd_a)
|
|
142
|
+
case cmd_a[0]
|
|
143
|
+
when /t/, /task/ then LogEntry.delete(cmd_a[1])
|
|
144
|
+
when /a/, /attachment/ then Attachment.delete(cmd_a[1])
|
|
145
|
+
end
|
|
146
|
+
# If something gets deleted, we need to reload the issue so that the
|
|
147
|
+
# relations are ok.
|
|
148
|
+
@issue.reload
|
|
97
149
|
end
|
|
98
150
|
|
|
99
151
|
# Concatenate an aggregate description to a previous item
|
data/lib/wlog/ui/template_ui.rb
CHANGED
|
@@ -42,7 +42,7 @@ private
|
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
def ls
|
|
45
|
-
num =
|
|
45
|
+
num = KeyValue.get('template') || 1
|
|
46
46
|
num = num.to_i
|
|
47
47
|
Dir[TemplateDir + "*"].each_with_index do |file,ix|
|
|
48
48
|
print " #{ix + 1 == num ? @strmaker.blue('*') : ' '} "
|
|
@@ -58,7 +58,7 @@ private
|
|
|
58
58
|
return
|
|
59
59
|
end
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
KeyValue.put!('template', num)
|
|
62
62
|
end
|
|
63
63
|
|
|
64
64
|
end
|
data/lib/wlog/version.rb
CHANGED
|
@@ -1,58 +1,52 @@
|
|
|
1
1
|
# We'll be ignoring this for now...
|
|
2
2
|
#
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
#
|
|
31
|
-
#
|
|
32
|
-
#
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
# end
|
|
53
|
-
#
|
|
54
|
-
# it "should return nil if something is not found" do
|
|
55
|
-
# expect(Attachment.find(@db, Issue.name, 123123123)).to eq(nil)
|
|
56
|
-
# end
|
|
57
|
-
# end
|
|
3
|
+
require_relative '../spec_helper.rb'
|
|
4
|
+
require_relative '../make_db'
|
|
5
|
+
require 'wlog/domain/attachment'
|
|
6
|
+
require 'wlog/domain/log_entry'
|
|
7
|
+
require 'wlog/domain/issue'
|
|
8
|
+
require 'zlib'
|
|
9
|
+
|
|
10
|
+
include Wlog
|
|
11
|
+
|
|
12
|
+
describe Attachment do
|
|
13
|
+
|
|
14
|
+
db_name = 'default'
|
|
15
|
+
db_path = standard_db_path(db_name)
|
|
16
|
+
|
|
17
|
+
before(:all) do
|
|
18
|
+
make_testing_db(db_name)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
after(:all) do
|
|
22
|
+
close_testing_db
|
|
23
|
+
FileUtils.rm db_path
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it 'should attach a mock file to an issue' do
|
|
27
|
+
@issue = Issue.create(:description => 'mydesc',
|
|
28
|
+
:long_description => 'potato')
|
|
29
|
+
|
|
30
|
+
# You're kind of forced to do this because I've hacked a shitty
|
|
31
|
+
# implementation of compressing - uncompressing strings automatically when
|
|
32
|
+
# attaching files.
|
|
33
|
+
@attachment = Attachment.new
|
|
34
|
+
@attachment.filename = 'filename'
|
|
35
|
+
@attachment.given_name = 'given name'
|
|
36
|
+
@attachment.data = 'data stuff'
|
|
37
|
+
|
|
38
|
+
@issue.attachments << @attachment
|
|
39
|
+
@issue.save
|
|
40
|
+
|
|
41
|
+
issue = Issue.find(@issue.id)
|
|
42
|
+
expect(issue.attachments.count).to eq(1)
|
|
43
|
+
expect(issue.attachments.first.filename).to eq('filename')
|
|
44
|
+
expect(issue.attachments.first.given_name).to eq('given name')
|
|
45
|
+
expect(issue.attachments.first.data).to eq('data stuff')
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it "should return nil if something is not found" do
|
|
49
|
+
expect(Attachment.find_by_id(123123123)).to eq(nil)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
58
52
|
#
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
require_relative '../spec_helper'
|
|
2
|
+
|
|
3
|
+
include Wlog
|
|
4
|
+
|
|
5
|
+
describe GitCommitParser do
|
|
6
|
+
|
|
7
|
+
GitLogSample = <<GITDATA
|
|
8
|
+
commit 19b5dd496ba2e4125c681b3c505f7631053a2fab
|
|
9
|
+
Author: psyomn <lethaljellybean@gmail.com>
|
|
10
|
+
Date: Wed Oct 23 23:00:56 2013 -0400
|
|
11
|
+
|
|
12
|
+
Tiny setup wizard for checking if ansi or not
|
|
13
|
+
|
|
14
|
+
Need to provide a system configuration service that takes into account things
|
|
15
|
+
that are the same for any running instance of the application (because others
|
|
16
|
+
might just be specific to project databases).
|
|
17
|
+
|
|
18
|
+
commit 533f1245a8e6d4382e250518d0a9ee4b19b7657d
|
|
19
|
+
Author: psyomn <lethaljellybean@gmail.com>
|
|
20
|
+
Date: Wed Oct 23 22:57:57 2013 -0400
|
|
21
|
+
|
|
22
|
+
Add taint setup command.
|
|
23
|
+
|
|
24
|
+
commit 4630d627b5b5f4f114e35991daea8684fca6ddd9
|
|
25
|
+
Author: psyomn <lethaljellybean@gmail.com>
|
|
26
|
+
Date: Wed Oct 23 22:46:27 2013 -0400
|
|
27
|
+
|
|
28
|
+
Add setup wizard.
|
|
29
|
+
|
|
30
|
+
GITDATA
|
|
31
|
+
|
|
32
|
+
Malformed = <<BADGIT
|
|
33
|
+
potato potato potato potato potato potato potato potato potato potato potato
|
|
34
|
+
potato potato potato potato potato potato potato potato potato potato potato potato
|
|
35
|
+
potato potato potato potato potato potato potato potato potato potato potato potato
|
|
36
|
+
potato potato potato potato potato potato potato potato potato potato potato potato
|
|
37
|
+
potato potato potato potato potato potato potato potato potato potato potato potato
|
|
38
|
+
BADGIT
|
|
39
|
+
|
|
40
|
+
it 'should return [] on null string' do
|
|
41
|
+
expect(GitCommitParser.parse('')).to eq([])
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it 'should return [] on malformed format' do
|
|
45
|
+
expect(GitCommitParser.parse(Malformed)).to eq([])
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it 'should return 3 commit logs' do
|
|
49
|
+
expect(GitCommitParser.parse(GitLogSample).count).to eq(3)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it 'should retrieve hashes' do
|
|
53
|
+
commits = GitCommitParser.parse(GitLogSample)
|
|
54
|
+
hashes = commits.collect &:commit
|
|
55
|
+
expected_hashes = [
|
|
56
|
+
'4630d627b5b5f4f114e35991daea8684fca6ddd9',
|
|
57
|
+
'533f1245a8e6d4382e250518d0a9ee4b19b7657d',
|
|
58
|
+
'19b5dd496ba2e4125c681b3c505f7631053a2fab']
|
|
59
|
+
expect(hashes.count).to eq(3)
|
|
60
|
+
expect((hashes & expected_hashes).count).to eq(3)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it 'should retrieve authors' do
|
|
64
|
+
commits = GitCommitParser.parse(GitLogSample)
|
|
65
|
+
authors = commits.collect &:author
|
|
66
|
+
expect(authors.count).to eq(3)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it 'should retrieve shortlogs' do
|
|
70
|
+
commits = GitCommitParser.parse(GitLogSample)
|
|
71
|
+
shortlogs = commits.collect &:shortlog
|
|
72
|
+
expect(shortlogs.count).to eq(3)
|
|
73
|
+
# all shortlogs contain text
|
|
74
|
+
expect(shortlogs.inject(true){ |sum,e| e != "" }).to be true
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it 'should retrieve messages' do
|
|
78
|
+
commits = GitCommitParser.parse(GitLogSample)
|
|
79
|
+
messages = commits.collect &:message
|
|
80
|
+
messages.reject! { |e| e == "" }
|
|
81
|
+
expect(messages.count).to eq(1)
|
|
82
|
+
expect(messages.inject(true){ |e| e != "" }).to be true
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require_relative '../spec_helper'
|
|
2
|
+
require_relative '../make_db'
|
|
3
|
+
|
|
4
|
+
include Wlog
|
|
5
|
+
|
|
6
|
+
describe Invoice do
|
|
7
|
+
include DomainHelpers
|
|
8
|
+
|
|
9
|
+
db_name = 'default'
|
|
10
|
+
db_path = standard_db_path(db_name)
|
|
11
|
+
|
|
12
|
+
before :all do
|
|
13
|
+
make_testing_db(db_name)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
after :all do
|
|
17
|
+
FileUtils.rm db_path
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it 'should fetch all relevant log entries between two dates' do
|
|
21
|
+
invoice = Invoice.create(:from => (DateTime.now - 5), :to => (DateTime.now + 5))
|
|
22
|
+
issue = make_issue
|
|
23
|
+
|
|
24
|
+
10.times do
|
|
25
|
+
le = make_log_entry
|
|
26
|
+
le.created_at = DateTime.now - 2
|
|
27
|
+
issue.log_entries << le
|
|
28
|
+
end
|
|
29
|
+
issue.save
|
|
30
|
+
|
|
31
|
+
expect(invoice.log_entries_within_dates.count).to eq(10)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
35
|
+
|
data/spec/domain/issue_spec.rb
CHANGED
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'coveralls'
|
|
2
|
+
require 'date'
|
|
3
|
+
require 'wlog/domain/invoice'
|
|
4
|
+
require 'wlog/domain/issue'
|
|
5
|
+
require 'wlog/domain/log_entry'
|
|
6
|
+
require 'wlog/tech/git_commit_parser'
|
|
7
|
+
|
|
8
|
+
Coveralls.wear!
|
|
9
|
+
|
|
10
|
+
$sn = 0
|
|
11
|
+
|
|
12
|
+
module DomainHelpers
|
|
13
|
+
def sn
|
|
14
|
+
old = $sn
|
|
15
|
+
$sn += 1
|
|
16
|
+
old end
|
|
17
|
+
|
|
18
|
+
# Make a log entry but don't store it
|
|
19
|
+
def make_log_entry
|
|
20
|
+
le = LogEntry.new(:description => "Desc ##{sn}")
|
|
21
|
+
le end
|
|
22
|
+
|
|
23
|
+
def make_issue
|
|
24
|
+
is = Issue.new(:description => "Desc #{sn}",
|
|
25
|
+
:due_date => DateTime.now,
|
|
26
|
+
:status => 0,
|
|
27
|
+
:timelog => 10,
|
|
28
|
+
:long_description => "big desc #{sn}")
|
|
29
|
+
is end
|
|
30
|
+
end
|
|
31
|
+
|
data/wlog.gemspec
CHANGED
|
@@ -26,7 +26,9 @@ Gem::Specification.new do |spec|
|
|
|
26
26
|
spec.add_development_dependency "rake"
|
|
27
27
|
spec.add_development_dependency "rspec"
|
|
28
28
|
spec.add_development_dependency "yard"
|
|
29
|
+
spec.add_development_dependency "coveralls"
|
|
30
|
+
spec.add_development_dependency 'redcarpet'
|
|
31
|
+
|
|
29
32
|
spec.add_runtime_dependency "sqlite3", ">= 1.3.7"
|
|
30
|
-
spec.add_runtime_dependency "rake", ">= 10.3.2"
|
|
31
33
|
spec.add_runtime_dependency 'activerecord', "4.1.6"
|
|
32
34
|
end
|