totrello 0.2.03 → 0.3.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 +8 -8
- data/.totrello.yml +4 -1
- data/README.md +9 -3
- data/lib/to_do_find.rb +38 -33
- data/lib/totrello/version.rb +1 -1
- data/lib/totrello.rb +26 -28
- data/lib/totrello_config.rb +25 -16
- data/lib/trello_creator.rb +0 -1
- data/test/to_do_find_spec.rb +20 -5
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MjNlMjZiY2FhN2JhNjliYzJkMjM2MDc3YTA4ZDM4ZDNlMWNmOTIwOQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MjZmNmM5YmUzZTc2OTI2MWRkZmI0YzBmYjdmNjUwYjc2YTU1YTY2OQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
Y2M5MGU3OThmOWI0ZGUxNjFlNjJjZDA4ZTczZmU5YmZhYWYyODc4YzkzZjNh
|
10
|
+
NjJhYzg3ZGJjZTU1ZGU0YTcwNTYyOTJiYmZlODI0ODViY2M1MGExN2FlOGZj
|
11
|
+
NDNmNDU0ZmE1MmUwNmFjZWFjZjIwODhlN2Q5NTA4MzVhMDJkZjY=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
OWJiYTk4YjE1ZDMyYTFhYzZkM2FhYWZjMWM2ZGE0OTkxMDI4MmYzZTlmMDdk
|
14
|
+
MTM2MDRmMGU2NmQzODhlODcyYThlM2Q0MTAyN2NhYmFhNzc4ZmMwMWZjNjRi
|
15
|
+
NzQ0OTZmNDllMmQ0OTc3OTFhNGUzODU1NDNkZTI1MWFjYjVjY2Y=
|
data/.totrello.yml
CHANGED
@@ -2,7 +2,10 @@ totrello:
|
|
2
2
|
project_name: 'ToTrello'
|
3
3
|
board_name: 'ToTrello'
|
4
4
|
default_list: 'To Do'
|
5
|
+
todo_types: ['TODO', '#TODO', '#TODO:', 'TODO:', 'FIXME', '#FIXME', '#FIXME:', 'FIXME:']
|
6
|
+
comment_style: ['#','//']
|
7
|
+
file_types: ['.rb','.yml']
|
5
8
|
excludes: [
|
6
9
|
'pkg/',
|
7
10
|
'bin/',
|
8
|
-
]
|
11
|
+
]
|
data/README.md
CHANGED
@@ -30,13 +30,16 @@ Generate your TRELLO_MEMBER_TOKEN at: https://trello.com/1/authorize?key=[TRELLO
|
|
30
30
|
$ export TRELLO_DEVELOPER_PUBLIC_KEY='[Your key here]'
|
31
31
|
$ export TRELLO_MEMBER_TOKEN='[Your key here]'
|
32
32
|
|
33
|
-
### Creating a .totrello.yml file:
|
33
|
+
### Creating a .totrello.yml file (Must be in root directory):
|
34
34
|
|
35
35
|
The ToTrello yml file allows you to customize the way ToTrello functions:
|
36
36
|
+ Project_name : The name of the project (i.e. ToTrello)
|
37
|
-
+ board_name
|
37
|
+
+ board_name : The Trello board you want to post to
|
38
38
|
+ default_list : The list you want your new todo items to post to
|
39
|
-
+
|
39
|
+
+ todo_types : The types of todo items you want to capture
|
40
|
+
+ comment_style: How comments appear in your file types
|
41
|
+
+ file_types : Types of files you want to include in the search
|
42
|
+
+ excludes : The files or directories you want to exclude
|
40
43
|
|
41
44
|
#### Sample file:
|
42
45
|
|
@@ -44,6 +47,9 @@ The ToTrello yml file allows you to customize the way ToTrello functions:
|
|
44
47
|
project_name: 'ToTrello'
|
45
48
|
board_name: 'ToTrello'
|
46
49
|
default_list: 'To Do'
|
50
|
+
todo_types: ['TODO', '#TODO', '#TODO:', 'TODO:', 'FIXME', '#FIXME', '#FIXME:', 'FIXME:']
|
51
|
+
comment_style: ['#','//']
|
52
|
+
file_types: ['.rb','.yml']
|
47
53
|
excludes: [
|
48
54
|
'pkg/',
|
49
55
|
'bin/',
|
data/lib/to_do_find.rb
CHANGED
@@ -4,19 +4,19 @@ class ToDoFind
|
|
4
4
|
|
5
5
|
# This will search a given directory
|
6
6
|
#
|
7
|
-
def search(directory, excludes_dirs)
|
7
|
+
def search(directory, excludes_dirs, todo_styles, file_types, comment_styles)
|
8
8
|
files_to_search = []
|
9
9
|
|
10
10
|
directory ||= Dir.pwd
|
11
11
|
|
12
12
|
todos= {directory: directory.split('/').last, :todo_list=>[] }
|
13
13
|
|
14
|
-
files_to_search = exclude_folders(get_folders(directory), Array(excludes_dirs))
|
14
|
+
files_to_search = exclude_folders(get_folders(directory, file_types), Array(excludes_dirs))
|
15
15
|
|
16
16
|
|
17
17
|
files_to_search.each do |my_text_file|
|
18
18
|
|
19
|
-
found_todo = find_todo(my_text_file)
|
19
|
+
found_todo = find_todo(my_text_file, todo_styles, comment_styles)
|
20
20
|
|
21
21
|
|
22
22
|
if found_todo
|
@@ -30,10 +30,16 @@ class ToDoFind
|
|
30
30
|
todos
|
31
31
|
end
|
32
32
|
|
33
|
-
def get_folders(directory)
|
33
|
+
def get_folders(directory, file_types)
|
34
|
+
|
35
|
+
files = []
|
34
36
|
directory ||= Dir.pwd
|
35
|
-
|
36
|
-
|
37
|
+
|
38
|
+
file_types.each do |ft|
|
39
|
+
file = File.join("#{directory}/**", "*#{ft.to_s}")
|
40
|
+
files.concat(Dir.glob(file))
|
41
|
+
end
|
42
|
+
files
|
37
43
|
end
|
38
44
|
|
39
45
|
def exclude_folders(file_array, excludes_array)
|
@@ -43,47 +49,46 @@ class ToDoFind
|
|
43
49
|
file_array
|
44
50
|
end
|
45
51
|
|
46
|
-
def find_todo(file)
|
47
|
-
todo_styles = ['TODO', '#TODO', '#TODO:', 'TODO:']
|
52
|
+
def find_todo(file, todo_styles, comment_styles)
|
48
53
|
@out = []
|
49
54
|
code_lines = File.readlines(file)
|
50
|
-
|
51
|
-
return @out unless code_lines.grep('/TODO/' || '/todo/')
|
52
|
-
|
53
55
|
code_lines= code_lines.map.with_index { |x,i| {:todo => x, :location => i + 1}}
|
54
56
|
|
55
57
|
todo_styles.each do |tds|
|
56
58
|
@out.concat((code_lines.find_all { |i| is_todo?(i[:todo], (tds))}))
|
57
59
|
end
|
58
60
|
|
59
|
-
clean_todos(@out).sort_by { |hsh| hsh[:todo] }
|
61
|
+
clean_todos(@out, todo_styles, comment_styles).sort_by { |hsh| hsh[:todo] }
|
60
62
|
end
|
61
63
|
|
62
64
|
private
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
65
|
+
def clean_todos(todo_array, todo_styles, comment_styles)
|
66
|
+
todo_array.each do |found_todos|
|
67
|
+
todo_styles.each do |tds|
|
68
|
+
found_todos[:todo].gsub!(tds,'')
|
69
|
+
end
|
70
|
+
comment_styles.each do |cms|
|
71
|
+
found_todos[:todo].gsub!(cms,'')
|
72
|
+
end
|
73
|
+
found_todos[:todo].gsub!(':','')
|
74
|
+
found_todos[:todo].chomp!
|
75
|
+
found_todos[:todo].lstrip!
|
76
|
+
end
|
77
|
+
|
70
78
|
end
|
71
79
|
|
72
|
-
|
80
|
+
def is_todo?( string, test_string )
|
81
|
+
begin
|
82
|
+
location = string.split(' ').index test_string
|
83
|
+
if location.nil?
|
84
|
+
return false
|
85
|
+
else
|
86
|
+
return true
|
87
|
+
end
|
88
|
+
rescue
|
89
|
+
false
|
90
|
+
end
|
73
91
|
|
74
|
-
private
|
75
|
-
def is_todo?( string, test_string )
|
76
|
-
begin
|
77
|
-
location = string.split(' ').index test_string
|
78
|
-
if location.nil?
|
79
|
-
return false
|
80
|
-
else
|
81
|
-
return true
|
82
92
|
end
|
83
|
-
rescue
|
84
|
-
false
|
85
|
-
end
|
86
|
-
|
87
|
-
end
|
88
93
|
|
89
94
|
end
|
data/lib/totrello/version.rb
CHANGED
data/lib/totrello.rb
CHANGED
@@ -56,45 +56,43 @@ module Totrello
|
|
56
56
|
end
|
57
57
|
|
58
58
|
private
|
59
|
-
|
59
|
+
def create_cards(board)
|
60
60
|
|
61
61
|
|
62
|
-
|
63
|
-
|
62
|
+
processes = []
|
63
|
+
todos = get_todos
|
64
64
|
|
65
|
-
|
65
|
+
puts 'Talking to Trello, this is the longest part...'
|
66
66
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
67
|
+
todos[:todo_list].each do |tdl|
|
68
|
+
tdl[:todos].each do |td|
|
69
|
+
unless td == ''
|
70
|
+
processes.append(fork {create_trello_card(board, @config[:default_list], td, tdl[:file])})
|
71
71
|
|
72
|
+
end
|
72
73
|
end
|
73
74
|
end
|
74
|
-
end
|
75
|
-
|
76
|
-
process_manager(processes)
|
77
|
-
end
|
78
|
-
|
79
|
-
private
|
80
|
-
def process_manager(processes)
|
81
|
-
processes.each {|pro| Process.waitpid(pro)}
|
82
|
-
end
|
83
|
-
|
84
|
-
private
|
85
|
-
def get_todos
|
86
|
-
puts 'Finding your todo items... '
|
87
|
-
todo = ToDoFind.new
|
88
|
-
todos = todo.search(@directory,Array( @config[:excludes]))
|
89
|
-
puts "Woot! We've got'em"
|
90
|
-
todos
|
91
|
-
end
|
92
|
-
|
93
75
|
|
76
|
+
process_manager(processes)
|
77
|
+
end
|
94
78
|
|
79
|
+
def process_manager(processes)
|
80
|
+
processes.each {|pro| Process.waitpid(pro)}
|
81
|
+
end
|
95
82
|
|
83
|
+
def get_todos
|
84
|
+
puts 'Finding your todo items... '
|
85
|
+
todo = ToDoFind.new
|
86
|
+
todos = todo.search(@directory,
|
87
|
+
Array( @config[:excludes]),
|
88
|
+
Array( @config[:todo_types]),
|
89
|
+
Array( @config[:file_types]),
|
90
|
+
Array( @config[:comment_styles]))
|
91
|
+
puts "Woot! We've got'em"
|
92
|
+
todos
|
93
|
+
end
|
96
94
|
|
97
|
-
end
|
98
95
|
|
96
|
+
end
|
99
97
|
|
100
98
|
end
|
data/lib/totrello_config.rb
CHANGED
@@ -5,6 +5,9 @@ class TotrelloConfig
|
|
5
5
|
@board_name
|
6
6
|
@default_list
|
7
7
|
@excludes
|
8
|
+
@todo_types
|
9
|
+
@file_types
|
10
|
+
@comment_style
|
8
11
|
|
9
12
|
def initialize(directory)
|
10
13
|
read_config(directory)
|
@@ -16,29 +19,35 @@ class TotrelloConfig
|
|
16
19
|
:project_name => @project_name,
|
17
20
|
:board_name => @board_name,
|
18
21
|
:default_list => @default_list,
|
19
|
-
:excludes => @excludes
|
22
|
+
:excludes => @excludes,
|
23
|
+
:todo_types => @todo_types,
|
24
|
+
:file_types => @file_types,
|
25
|
+
:comment_style => @comment_style
|
20
26
|
}
|
21
27
|
end
|
22
28
|
|
23
29
|
private
|
24
|
-
|
30
|
+
def read_config(directory)
|
25
31
|
|
26
|
-
|
27
|
-
|
32
|
+
totrello_config_file = File.join("#{directory}/", ".totrello.yml")
|
33
|
+
trello_yml = Dir.glob(totrello_config_file)[0]
|
28
34
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
35
|
+
unless trello_yml.nil?
|
36
|
+
puts "Found yml file file: #{trello_yml}"
|
37
|
+
config = YAML.load_file(trello_yml )
|
38
|
+
config['totrello'].each { |key, value| instance_variable_set("@#{key}", value) }
|
39
|
+
end
|
33
40
|
|
34
|
-
|
41
|
+
end
|
35
42
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
+
def defaults(directory)
|
44
|
+
@project_name ||= directory.split('/').last
|
45
|
+
@board_name ||= directory.split('/').last
|
46
|
+
@default_list ||= 'To Do'
|
47
|
+
@excludes ||= Array(nil)
|
48
|
+
@todo_types ||= Array(['TODO', '#TODO', '#TODO:', 'TODO:'])
|
49
|
+
@file_types ||= Array(['.rb','.erb'])
|
50
|
+
@comment_style ||= Array(['#'])
|
51
|
+
end
|
43
52
|
|
44
53
|
end
|
data/lib/trello_creator.rb
CHANGED
@@ -9,7 +9,6 @@ class TrelloCreator
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def create_card(board, name, description, list_name)
|
12
|
-
puts description
|
13
12
|
list_names = ['To Do', 'Doing', 'Done']
|
14
13
|
unless card_exists?(board, list_names, name)
|
15
14
|
card = Trello::Card.create(name: name, list_id: self.find_list(board, list_name), desc: description)
|
data/test/to_do_find_spec.rb
CHANGED
@@ -6,8 +6,19 @@ describe 'ToDoFind' do
|
|
6
6
|
describe 'find_todo_items' do
|
7
7
|
it 'returns a hash of todo items from a directory'do
|
8
8
|
todo = ToDoFind.new
|
9
|
-
todos = todo.search("#{Dir.pwd}/test/test_data",
|
10
|
-
|
9
|
+
todos = todo.search("#{Dir.pwd}/test/test_data",
|
10
|
+
nil,
|
11
|
+
Array(['TODO', '#TODO', '#TODO:', 'TODO:']),
|
12
|
+
Array(['.rb','.erb']),
|
13
|
+
Array(['#']))
|
14
|
+
expected = {:directory => "test_data",
|
15
|
+
:todo_list => [{:file => "/testing.rb",
|
16
|
+
:todos => [{:todo => "test1", :location => 1},
|
17
|
+
{:todo => "test2", :location => 2},
|
18
|
+
{:todo => "test3", :location => 3},
|
19
|
+
{:todo => "test4}", :location => 4},
|
20
|
+
{:todo => "test5", :location => 5},
|
21
|
+
{:todo => "test6", :location => 6}]}]}
|
11
22
|
expect(todos).to include(expected)
|
12
23
|
end
|
13
24
|
|
@@ -16,7 +27,11 @@ describe 'ToDoFind' do
|
|
16
27
|
describe 'formatted_data' do
|
17
28
|
it "Should have a string for the todo and an Int for the locaion" do
|
18
29
|
todo = ToDoFind.new
|
19
|
-
todos = todo.search("#{Dir.pwd}/test/test_data",
|
30
|
+
todos = todo.search("#{Dir.pwd}/test/test_data",
|
31
|
+
nil,
|
32
|
+
Array(['TODO', '#TODO', '#TODO:', 'TODO:']),
|
33
|
+
Array(['.rb','.erb']),
|
34
|
+
Array(['#']))
|
20
35
|
|
21
36
|
todos[:todo_list].each do |tdl|
|
22
37
|
tdl[:todos].each do |td|
|
@@ -32,7 +47,7 @@ describe 'ToDoFind' do
|
|
32
47
|
describe 'get_folders' do
|
33
48
|
it "Should return an array of files and folders" do
|
34
49
|
todo = ToDoFind.new
|
35
|
-
files = todo.get_folders("#{Dir.pwd}/test/test_data")
|
50
|
+
files = todo.get_folders("#{Dir.pwd}/test/test_data",Array(['.rb','.erb']))
|
36
51
|
expect(files).to be_a(Array)
|
37
52
|
end
|
38
53
|
|
@@ -41,7 +56,7 @@ describe 'ToDoFind' do
|
|
41
56
|
describe 'exclude_folders' do
|
42
57
|
it "Should return an array an empty array" do
|
43
58
|
todo = ToDoFind.new
|
44
|
-
files =
|
59
|
+
files =todo.get_folders("#{Dir.pwd}/test/test_data",Array(['.rb','.erb']))
|
45
60
|
files = todo.exclude_folders(files, Array(['test']))
|
46
61
|
expect(files).to be_a(Array)
|
47
62
|
expect(files).to match_array([])
|