totrello 0.3.04 → 1.0.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 CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- OTI2OGIzZWUzZWY3OGFkZDFhNzVjNGIzNWI2OTBiYTM1YjNjMmZmYQ==
4
+ YjdkYzk3ZjhjZTQyZmEzZWRhMTYxMmZjMzMzYWEwMjJjN2NhZGRjYQ==
5
5
  data.tar.gz: !binary |-
6
- ODNjYjZmY2Y2MGE4NThlYzZmODg2Yzg2ZjJjNDhhNmE2ZmUwYjdiYg==
6
+ NjlhMjQ3M2ZiNWVlNjE1YjE1MDhlYjllYWRkMmI4OGZlYWU2Y2QyNg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NzkyNTk0N2RmZGJiNmQ4YzcwOGJmMTZkNWJlOTkxY2U1ODkzMDBjZWFkZWM0
10
- NmQ5ZGY0MGY2N2E3NDQ2MzU5NGU4Zjg0NjFjZjZiM2RjZTE1NDZhMzE3NDRh
11
- ODllYjgxODVmMzA5Yzk1ZDQ0ZWIxZmM1ODViOTY3ZTExNTNkMTY=
9
+ YWI2NmYxNDYzNzdjNjNlOWU3NmUwNjY1YmJiNmViMmEwMzdmZThhZmUxYTdm
10
+ ODM2MzUwYjJiMGU1ZDFlMWI0MmExOTI2Yjk2N2E4NjJkNzhkZTM4MzgwM2Ni
11
+ ZmQ0NTQyYzE0MjU2MDFmYzQ0NmUzMzAyOTgxMjI5YjFlZDkxMzA=
12
12
  data.tar.gz: !binary |-
13
- YjQ3ODMxMzZiNzc0Y2FhYTdkOTQwNzBkOGU4MDQ0ODYzMGExZDkxNTMyNjZj
14
- N2NlMjg4MjQ1OWU3NjVmNDAzZTAyZWRjZWQ0MzU0MmIyMzg3MWVjMTIwNWQ4
15
- ZjUwMjM5MWZjOGYwOTYxZTNlNGQxZmViY2I0ODc4M2YxMTIyMzE=
13
+ MzA1YjVkYWZjZGEzODE1NzA1ZmQ3YzRhYjJmYzQ4NGQ2OWFlMmQ5YWRlYWUx
14
+ MDZhMWEyNmVhYmQ4ZTc5ZjE2NjA4ZDMxNWQ3NjAwZWRkZDc2ZjU3ODgyMjNm
15
+ N2NjMTE3Mjg4MjAxMDk1MGRjOGU1ZTg2Y2U3N2M3ZjhhYzUyNGI=
data/.gitignore CHANGED
@@ -5,87 +5,7 @@
5
5
  /coverage/
6
6
  /doc/
7
7
  /pkg/
8
- /spec/reports/
8
+ /spec/cassettes/
9
9
  /tmp/
10
- *.bundle
11
- *.so
12
- *.o
13
- *.a
14
- mkmf.log
15
-
16
- # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm
17
-
18
- /*.iml
19
-
20
- ## Directory-based project format:
21
- .idea/
22
- # if you remove the above rule, at least ignore the follwing:
23
-
24
- # User-specific stuff:
25
- # .idea/workspace.xml
26
- # .idea/tasks.xml
27
- # .idea/dictionaries
28
-
29
- # Sensitive or high-churn files:
30
- # .idea/dataSources.ids
31
- # .idea/dataSources.xml
32
- # .idea/sqlDataSources.xml
33
- # .idea/dynamic.xml
34
- # .idea/uiDesigner.xml
35
-
36
- # Gradle:
37
- # .idea/gradle.xml
38
- # .idea/libraries
39
-
40
- # Mongo Explorer plugin:
41
- # .idea/mongoSettings.xml
42
-
43
- ## File-based project format:
44
- *.ipr
45
- *.iws
46
-
47
- ## Plugin-specific files:
48
-
49
- # IntelliJ
50
- out/
51
-
52
- # mpeltonen/sbt-idea plugin
53
- .idea_modules/
54
-
55
- # JIRA plugin
56
- atlassian-ide-plugin.xml
57
-
58
- # Crashlytics plugin (for Android Studio and IntelliJ)
59
- com_crashlytics_export_strings.xml
60
-
61
- *.rbc
62
- capybara-*.html
63
- .rspec
64
- /log
65
- /tmp
66
- /db/*.sqlite3
67
- /public/system
68
- /coverage/
69
- /spec/tmp
70
- **.orig
71
- rerun.txt
72
- pickle-email-*.html
73
-
74
- # TODO Comment out these rules if you are OK with secrets being uploaded to the repo
75
- config/initializers/secret_token.rb
76
- config/secrets.yml
77
-
78
- ## Environment normalisation:
79
- /.bundle
80
- /vendor/bundle
81
-
82
- # these should all be checked in to normalise the environment:
83
- # Gemfile.lock, .ruby-version, .ruby-gemset
84
-
85
- # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
86
- .rvmrc
87
-
88
- # if using bower-rails ignore default bower_components path bower.json files
89
- /vendor/assets/bower_components
90
- *.bowerrc
91
- bower.json
10
+ *.gem
11
+ .env
@@ -0,0 +1 @@
1
+ fail_on_violations: true
@@ -8,4 +8,7 @@ totrello:
8
8
  excludes: [
9
9
  'pkg/',
10
10
  'bin/',
11
+ 'lib/',
12
+ 'tmp',
13
+ 'spec'
11
14
  ]
@@ -1,12 +1,8 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2.0
4
- - 2.1.5
5
- - 2.1.2
6
- - 2.1.1
7
- - 2.0.0-p247
8
- - 1.9.3-p194
9
- script: gem install bundler && bundle exec rspec test/*
3
+ - 2.3.0
4
+ - 2.2.4
5
+ script: gem install bundler && bundle exec rspec
10
6
  deploy:
11
7
  provider: rubygems
12
8
  api_key:
data/Gemfile CHANGED
@@ -1,5 +1,4 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
-
4
3
  # Specify your gem's dependencies in totrello.gemspec
5
4
  gemspec
@@ -0,0 +1,37 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ ## Uncomment and set this to only include directories you want to watch
5
+ # directories %w(app lib config test spec feature)
6
+
7
+ ## Uncomment to clear the screen before every task
8
+ # clearing :on
9
+
10
+ ## Guard internally checks for changes in the Guardfile and exits.
11
+ ## If you want Guard to automatically start up again, run guard in a
12
+ ## shell loop, e.g.:
13
+ ##
14
+ ## $ while bundle exec guard; do echo "Restarting Guard..."; done
15
+ ##
16
+ ## Note: if you are using the `directories` clause above and you are not
17
+ ## watching the project directory ('.'), the you will want to move the Guardfile
18
+ ## to a watched dir and symlink it back, e.g.
19
+ #
20
+ # $ mkdir config
21
+ # $ mv Guardfile config/
22
+ # $ ln -s config/Guardfile .
23
+ #
24
+ # and, you'll have to watch "config/Guardfile" instead of "Guardfile"
25
+
26
+ # Note: The cmd option is now required due to the increasing number of ways
27
+ # rspec may be run, below are examples of the most common uses.
28
+ # * bundler: 'bundle exec rspec'
29
+ # * bundler binstubs: 'bin/rspec'
30
+ # * spring: 'bin/rspec' (This will use spring if running and you have
31
+ # installed the spring binstubs per the docs)
32
+ # * zeus: 'zeus rspec' (requires the server to be started separately)
33
+ # * 'just' rspec: 'rspec'
34
+ guard :rspec, cmd: 'rspec' do
35
+ watch(%r{^spec/.+_spec\.rb$})
36
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
37
+ end
data/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
  [![Test Coverage](https://codeclimate.com/github/whatisinternet/ToTrello/badges/coverage.svg)](https://codeclimate.com/github/whatisinternet/ToTrello)
5
5
  # Totrello
6
6
 
7
- TODO: Turns Todo items into Trello cards
7
+ Turns Todo items into Trello cards
8
8
 
9
9
  ## Notes
10
10
 
@@ -65,6 +65,8 @@ The ToTrello yml file allows you to customize the way ToTrello functions:
65
65
 
66
66
  ## Contributing
67
67
 
68
+ This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
69
+
68
70
  1. Fork it ( https://github.com/whatisinternet/totrello/fork )
69
71
  2. Create your feature branch (`git checkout -b my-new-feature`)
70
72
  3. Commit your changes (`git commit -am 'Add some feature'`)
@@ -1,52 +1,44 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'totrello'
3
+ require 'totrello/trelloize'
4
+
4
5
  TRELLO_DEVELOPER_PUBLIC_KEY = ENV['TRELLO_DEVELOPER_PUBLIC_KEY']
5
6
  TRELLO_MEMBER_TOKEN = ENV['TRELLO_MEMBER_TOKEN']
6
7
 
7
8
  def main
9
+ return trello unless TRELLO_DEVELOPER_PUBLIC_KEY.nil? || TRELLO_MEMBER_TOKEN.nil?
10
+ error_message
11
+ exit(-1)
12
+ end
8
13
 
9
- if TRELLO_DEVELOPER_PUBLIC_KEY.nil? || TRELLO_MEMBER_TOKEN.nil?
10
- puts "ERROR:\n"
11
- puts "Your Trello developer PK is: #{TRELLO_DEVELOPER_PUBLIC_KEY}\n"
12
- puts "Your Trello member token is: #{TRELLO_MEMBER_TOKEN}\n\n"
13
- puts "It looks like you haven't set either a TRELLO_DEVELOPER_PUBLIC_KEY or TRELLO_MEMBER_TOKEN.\n\n"
14
- puts "You can generate a TRELLO_DEVELOPER_PUBLIC_KEY at:\n"
15
- puts "https://trello.com/1/appKey/generate\n"
16
- puts "You can generate a TRELLO_MEMBER_TOKEN at:\n"
17
- puts " https://trello.com/1/authorize?key=[TRELLO_DEVELOPER_PUBLIC_KEY]&name=ToTrelloGem&expiration=never&response_type=token&scope=read,write\n\n"
18
- puts "Then run:\n"
19
- puts " $ export TRELLO_DEVELOPER_PUBLIC_KEY='[Your key here]'\n"
20
- puts " $ export TRELLO_MEMBER_TOKEN='[Your key here]'\n"
21
-
22
- puts "\nAnd try ToTrello again.\n"
23
-
24
-
25
- exit(-1)
26
- else
27
-
28
- dir = ARGV[0].to_s
29
- if dir == ''
30
- dir = Dir.pwd
31
- end
32
-
33
-
34
- puts "You've specified to work in: #{dir}"
35
- trel = Totrello::Trelloize.new(dir)
36
- puts 'Generating your board'
37
- board = trel.create_or_gen_board
38
- return -1 if board.nil?
39
- puts "Created or found a board with the ID: #{board.name}"
40
- puts 'Finding your todo items... '
41
- todos = trel.get_todos
42
- puts "Woot! We've got'em"
43
- trel.create_cards(board, todos)
44
- puts "And you're ready to go!"
45
-
14
+ def error_message
15
+ puts "ERROR:\n"
16
+ puts "Your Trello developer PK is: #{TRELLO_DEVELOPER_PUBLIC_KEY}\n"
17
+ puts "Your Trello member token is: #{TRELLO_MEMBER_TOKEN}\n\n"
18
+ puts "It looks like you haven't set either a TRELLO_DEVELOPER_PUBLIC_KEY or TRELLO_MEMBER_TOKEN.\n\n"
19
+ puts "You can generate a TRELLO_DEVELOPER_PUBLIC_KEY at:\n"
20
+ puts "https://trello.com/1/appKey/generate\n"
21
+ puts "You can generate a TRELLO_MEMBER_TOKEN at:\n"
22
+ puts " https://trello.com/1/authorize?key=[TRELLO_DEVELOPER_PUBLIC_KEY]&name=ToTrelloGem&expiration=never&response_type=token&scope=read,write\n\n"
23
+ puts "Then run:\n"
24
+ puts " $ export TRELLO_DEVELOPER_PUBLIC_KEY='[Your key here]'\n"
25
+ puts " $ export TRELLO_MEMBER_TOKEN='[Your key here]'\n"
26
+ puts "\nAnd try ToTrello again.\n"
27
+ end
46
28
 
29
+ def trello
30
+ dir = ARGV[0].to_s
31
+ if dir == ''
32
+ dir = Dir.pwd
47
33
  end
48
34
 
35
+ trel = Trelloize.new(dir)
36
+ todo_finder = Todos.new
37
+
38
+ board = trel.trello.find_or_create_board(trel.config)
39
+ todos = todo_finder.all_todos(trel.directory, trel.config)
40
+ trel.find_and_create_cards_from_todos(todos, board)
49
41
  end
50
42
 
51
43
 
52
- main
44
+ main
@@ -1,61 +1,5 @@
1
- require "totrello/version"
2
- require 'trello_creator'
3
- require 'to_do_find'
4
- require 'totrello_config'
1
+ require 'totrello/version'
5
2
 
6
-
7
- module Totrello
8
-
9
- class Trelloize
10
- @trello
11
- @directory
12
- @config
13
-
14
- def initialize(directory)
15
- @trello = TrelloCreator.new
16
- @directory = directory
17
- totrello_config = TotrelloConfig.new(directory)
18
- @config = totrello_config.build_hash
19
- end
20
-
21
- def create_or_gen_board
22
- board = @trello.find_board(@config[:board_name].to_s)
23
- board ||= @trello.create_board(@config[:board_name].to_s, 'Auto Generated by ToTrello Gem')
24
- end
25
-
26
- def create_trello_card(board, list, todo, filename)
27
- description = gen_description(filename,todo, @config[:project_name].to_s)
28
- card = @trello.create_card(board, todo[:todo], description ,list)
29
- end
30
-
31
- def gen_description(file, todo, project_name)
32
- out = "TODO item found by the [ToTrello](https://rubygems.org/gems/totrello) gem\n"
33
- out += "**Project name:** #{project_name}\n"
34
- out += "**Filename**: #{file}\n"
35
- out += "**Action item**: #{todo[:todo]}\n"
36
- out += "**Location (at or near) line**: #{todo[:location]}\n"
37
- end
38
-
39
- def create_cards(board, todos)
40
- todos[:todo_list].each do |tdl|
41
- tdl[:todos].each do |td|
42
- unless td == ''
43
- create_trello_card(board, @config[:default_list], td, tdl[:file])
44
- end
45
- end
46
- end
47
- end
48
-
49
- def get_todos
50
- todo = ToDoFind.new
51
- todos = todo.search(@directory,
52
- Array( @config[:excludes]),
53
- Array( @config[:todo_types]),
54
- Array( @config[:file_types]),
55
- Array( @config[:comment_style]))
56
- todos
57
- end
58
-
59
- end
60
-
3
+ # ToTrello
4
+ module ToTrello
61
5
  end
@@ -0,0 +1,65 @@
1
+ # Todos
2
+ class Todos
3
+ def all_todos(root_directory = "#{Dir.pwd}", config)
4
+ files = load_files(root_directory, config)
5
+ files.map {|f| todos_for_file(f, config) }.flatten
6
+ end
7
+
8
+ def load_files(root_directory = "#{Dir.pwd}", config)
9
+ Dir.glob("#{root_directory}/**/*").select do |f|
10
+ next if File.directory?(f) || config.excludes.include?(f)
11
+ split_file_name = f.split('.')
12
+ File.file?(f) &&
13
+ config.file_types.include?(".#{split_file_name.last}")
14
+ end
15
+ end
16
+
17
+ def todos_for_file(file, config)
18
+ lines_with_indexes = lines_with_index_for_file(file)
19
+ lines_with_indexes.reduce([]) do |todos, line|
20
+ if todo?(line[:line], config)
21
+ cleaned_todo = clean_todo(line[:line], config)
22
+ unless cleaned_todo.nil?
23
+ todos.push({
24
+ todo: cleaned_todo,
25
+ line_number: line[:index],
26
+ file: file.to_s
27
+ })
28
+ end
29
+ end
30
+ todos
31
+ end
32
+ end
33
+
34
+ def lines_with_index_for_file(file)
35
+ lines = File.readlines file.to_s
36
+ lines.map.with_index do |line, idx|
37
+ { line: line, index: idx }
38
+ end
39
+ end
40
+
41
+ def todo?(line, config)
42
+ return false if line.empty?
43
+ todo_types = config.todo_types
44
+ todo_types.any? do |todo_type|
45
+ return false if line.index(todo_type).nil?
46
+ return false unless config.comment_style.any? do |cs|
47
+ line.strip.start_with?(cs)
48
+ end
49
+ true
50
+ end
51
+ end
52
+
53
+ def clean_todo(todo, config)
54
+ config.todo_types.each do |style|
55
+ todo.delete!(style)
56
+ end
57
+ config.comment_style.each do |style|
58
+ todo.delete!(style)
59
+ end
60
+ todo.delete!('#')
61
+ todo.delete!(':')
62
+ todo.chomp!
63
+ todo.lstrip!
64
+ end
65
+ end
@@ -0,0 +1,59 @@
1
+ require 'trello'
2
+
3
+ # TrelloBuilder
4
+ class TrelloBuilder
5
+ def initialize
6
+ Trello.configure do |config|
7
+ config.developer_public_key = TRELLO_DEVELOPER_PUBLIC_KEY
8
+ config.member_token = TRELLO_MEMBER_TOKEN
9
+ end
10
+ end
11
+
12
+ def cards(board, list)
13
+ Trello::List.new('idBoard' => board, 'id' => list).cards
14
+ end
15
+
16
+ def create_board(config)
17
+ Trello::Board.create(name: config.board_name, description: 'A Trello board')
18
+ end
19
+
20
+ def create_card(board, card_name, description, list_name)
21
+ list_names = ['To Do', 'Doing', 'Done']
22
+ return if card_exists?(board, list_names, card_name)
23
+ list = find_list(board, list_name)
24
+ card = Trello::Card.create(name: card_name,
25
+ list_id: list,
26
+ desc: description)
27
+ card.save
28
+ end
29
+
30
+ def card_exists?(board, list_names, card_name)
31
+ list_names.any? do |list_name|
32
+ list = find_list(board, list_name)
33
+ all_cards = cards(board, list)
34
+ all_cards.any? do |card|
35
+ card.name.include? card_name
36
+ end
37
+ end
38
+ end
39
+
40
+ def find_board(config)
41
+ board_name = config.board_name
42
+ trello_board = Trello::Board.all.find do |board|
43
+ board.name.casecmp(board_name.upcase) && !board.closed
44
+ end
45
+ return nil if trello_board.nil?
46
+ Trello::Board.find(trello_board.id)
47
+ end
48
+
49
+ def find_list(board, list_name)
50
+ return unless board
51
+ board.lists.find { |list| list.name == list_name }.id
52
+ end
53
+
54
+ def find_or_create_board(config)
55
+ board = find_board(config)
56
+ board = create_board(config) if board.nil?
57
+ board
58
+ end
59
+ end