pello 0.1.0.pre.001

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 480af8020dd13f74521428e08aeadd2012feaace1fb14596ad106aa82de63f38
4
+ data.tar.gz: c1ed35cc865da51c1a0d23117e959376d9ee29f9b23a4c403ad4b331795e1e15
5
+ SHA512:
6
+ metadata.gz: 36931f6fdeafeb4577cf03807367926948d7828819221915b0a3fd2289d6239fc1ae5802568d397d916579ba9d9cd159011038c6bb456b08b62a841cd051bc3e
7
+ data.tar.gz: b1b448e0c873a3f506928a024cce9d07207b85de44ace99b0fa9200693f11fefc9a3b6a5a19439ee4cdfae0c7545c3b900f1fa710f0ff31bddb7644ab124f1ce
data/bin/pello ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ require 'pello'
3
+
4
+ runner = Pello::Runner.new
5
+ runner.run!
@@ -0,0 +1,43 @@
1
+ require 'forwardable'
2
+ require 'tty/table'
3
+
4
+ module Pello
5
+ class Board
6
+ extend Forwardable
7
+ attr_accessor :trello_board
8
+ def_delegators :@trello_board, :cards, :lists
9
+
10
+ def initialize(trello_board)
11
+ @trello_board = trello_board
12
+ end
13
+
14
+ def as_table
15
+ headers = trello_board.lists.map(&:name)
16
+ cards = trello_board.lists.map { |list| list.cards.map { |card| truncate(card.name, 45) } }
17
+
18
+ max_cards = cards.map(&:length).max
19
+ cards = cards.map { |list_cards| list_cards + [nil] * (max_cards - list_cards.length) }
20
+
21
+ tableized_cards = cards.transpose
22
+
23
+ table = TTY::Table.new headers, tableized_cards
24
+ table.render :unicode, multiline: true, resize: true, padding: [0, 0, 1, 0]
25
+ end
26
+
27
+ private
28
+
29
+ def truncate(string, truncate_at, options = {})
30
+ return string.dup unless string.length > truncate_at
31
+
32
+ omission = options[:omission] || '...'
33
+ length_with_room_for_omission = truncate_at - omission.length
34
+ stop = if options[:separator]
35
+ rindex(options[:separator], length_with_room_for_omission) || length_with_room_for_omission
36
+ else
37
+ length_with_room_for_omission
38
+ end
39
+
40
+ "#{string[0, stop]}#{omission}"
41
+ end
42
+ end
43
+ end
data/lib/pello/card.rb ADDED
@@ -0,0 +1,55 @@
1
+ require 'forwardable'
2
+ require 'byebug'
3
+
4
+ module Pello
5
+ class Card
6
+ extend Forwardable
7
+
8
+ TITLE_REGEX = /(\(([0-9.]*)\))*\s*([0-9.]*)\s*🍅*\s*(.*)/.freeze
9
+ attr_accessor :trello_card
10
+ def_delegators :@trello_card, :name, :name=, :comments, :add_comment, :save, :id
11
+
12
+ def initialize(trello_card)
13
+ @trello_card = trello_card
14
+ end
15
+
16
+ def extract_pomodori
17
+ pomos = name.match(TITLE_REGEX)[3]
18
+ pomos ||= 0
19
+ pomos.to_i
20
+ end
21
+
22
+ def extract_title
23
+ name.match(TITLE_REGEX)[-1]
24
+ end
25
+
26
+ def extract_points
27
+ points = name.match(TITLE_REGEX)[2]
28
+ points ||= 0
29
+ points.to_f
30
+ end
31
+
32
+ def title_with_added_pomodori(how_many = 1)
33
+ current_pomodori = extract_pomodori
34
+ current_points = extract_points
35
+ current_title = extract_title
36
+ result = []
37
+ result << "(#{current_points})" unless current_points.zero?
38
+ result << "#{current_pomodori + how_many} 🍅"
39
+ result << current_title
40
+ result.join(' ')
41
+ end
42
+
43
+ def log(event)
44
+ comment = comments.select { |c| c.data['text'] =~ /PELLO LOG/ }.first
45
+ if comment
46
+ new_text = [comment.data['text'], event].join("\n")
47
+ comment.delete
48
+ add_comment new_text
49
+ else
50
+ text = ['~~~PELLO LOG', event].join("\n")
51
+ add_comment text
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,46 @@
1
+ module Pello
2
+ class Config
3
+ CONFIG_FILE_PATH = "#{ENV['HOME']}/.config/pello/pello.yaml".freeze
4
+ attr_accessor :board_url, :developer_public_key, :list_name, :log_file, :member_token, :username, :error
5
+
6
+ def initialize
7
+ if File.exist?(CONFIG_FILE_PATH)
8
+ config = YAML.safe_load File.open(CONFIG_FILE_PATH).read
9
+
10
+ auth_config = config['auth']
11
+ @developer_public_key = auth_config['developer_public_key']
12
+ @member_token = auth_config['member_token']
13
+
14
+ pello_config = config['config']
15
+ @username = pello_config['username']
16
+ @board_url = pello_config['board_url']
17
+ @list_name = pello_config['list_name']
18
+ @log_file = pello_config['log_file']
19
+ @error = false
20
+ else
21
+ @error = true
22
+ end
23
+ rescue => e
24
+ @error = true
25
+ puts "Error loading config: #{e.message}"
26
+ end
27
+
28
+ def valid?
29
+ !error
30
+ end
31
+
32
+ def self.write_empty_config
33
+ system "mkdir -p #{File.dirname(CONFIG_FILE_PATH)}"
34
+ File.open(CONFIG_FILE_PATH, 'w') do |file|
35
+ file.puts 'auth:'
36
+ file.puts ' developer_public_key: ""'
37
+ file.puts ' member_token: ""'
38
+ file.puts 'config:'
39
+ file.puts ' board_url: ""'
40
+ file.puts ' username: ""'
41
+ file.puts ' list_name: "In progress"'
42
+ file.puts ' log_file: "/Users/your_name/.pello_log"'
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,39 @@
1
+ require "tty-prompt"
2
+
3
+ module Pello
4
+ class Inputs
5
+ BACK_OPTION = '------ BACK ------'.freeze
6
+
7
+ def self.choose_board(user, board_url)
8
+ prompt = TTY::Prompt.new
9
+ board_names = user.boards.map(&:name)
10
+ default_board = user.boards.select { |b| b.url == board_url }.first.try(:name)
11
+ board_names << BACK_OPTION
12
+ input = prompt.select('Choose board', board_names, per_page: 15, default: default_board)
13
+ return nil if input == BACK_OPTION
14
+
15
+ Pello::Board.new(user.boards.detect { |b| b.name == input })
16
+ end
17
+
18
+ def self.choose_list(board, list_name)
19
+ prompt = TTY::Prompt.new
20
+ list_names = board.lists.map(&:name)
21
+ list_names << BACK_OPTION
22
+ default_list = board.lists.select { |l| l.name == list_name }.first.try(:name)
23
+ input = prompt.select('Choose list', list_names, per_page: 15, default: default_list)
24
+ return nil if input == BACK_OPTION
25
+
26
+ Pello::List.new(board.lists.detect { |l| l.name == input })
27
+ end
28
+
29
+ def self.choose_card(list)
30
+ prompt = TTY::Prompt.new
31
+ card_names = list.cards.map(&:name)
32
+ card_names << BACK_OPTION
33
+ input = prompt.select('Choose card', card_names, per_page: 15)
34
+ return nil if input == BACK_OPTION
35
+
36
+ Pello::Card.new(list.cards.detect { |c| c.name == input })
37
+ end
38
+ end
39
+ end
data/lib/pello/list.rb ADDED
@@ -0,0 +1,13 @@
1
+ require 'forwardable'
2
+
3
+ module Pello
4
+ class List
5
+ extend Forwardable
6
+ attr_accessor :trello_list
7
+ def_delegators :@trello_list, :cards
8
+
9
+ def initialize(trello_list)
10
+ @trello_list = trello_list
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,101 @@
1
+ require 'yaml'
2
+ require 'trello'
3
+ require 'tty-prompt'
4
+
5
+ Trello::Comment.send(:define_method, :action_id) do
6
+ id
7
+ end
8
+
9
+ module Pello
10
+ class Runner
11
+ attr_accessor :board_url, :list_name, :log_file_path, :prompt, :username
12
+
13
+ def initialize
14
+ @prompt = TTY::Prompt.new
15
+ configure_pello
16
+ end
17
+
18
+ def run!
19
+ continue = true
20
+
21
+ while continue
22
+ case prompt.select('Choose task') do |menu|
23
+ menu.choice name: 'Add pomodori', value: :add_pomodori
24
+ menu.choice name: 'Edit config', value: :edit_config
25
+ menu.choice name: 'quit', value: :quit
26
+ end
27
+ when :add_pomodori
28
+ add_pomodori_to_card
29
+ when :edit_config
30
+ system 'mkdir -p ~/.config/pello'
31
+ system "#{ENV['EDITOR']} ~/.config/pello/pello.yaml"
32
+ when :quit
33
+ puts 'Ok, bye!'
34
+ exit
35
+ end
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def file_log(text)
42
+ File.open(@log_file_path, 'a+') do |file|
43
+ file.puts(text)
44
+ end
45
+ end
46
+
47
+ def add_pomodori_to_card
48
+ board = Pello::Inputs.choose_board @user, @board_url
49
+ return unless board
50
+
51
+ puts board.as_table
52
+ continue = true
53
+ while continue
54
+ list = Pello::Inputs.choose_list board, @list_name
55
+ return unless list
56
+
57
+ card = Pello::Inputs.choose_card list
58
+ next unless card
59
+
60
+ pomodori_before = card.extract_pomodori
61
+ pomodori_to_add = prompt.ask('Pomodori', default: 1)
62
+
63
+ puts "Updating card #{card.name}"
64
+ puts "New title: #{card.title_with_added_pomodori(pomodori_to_add.to_i)}"
65
+
66
+ if prompt.yes?('Confirm?')
67
+ card.name = card.title_with_added_pomodori(pomodori_to_add.to_i)
68
+ card.save
69
+ file_log "[#{Time.now} - #{@user.full_name}] #{card.extract_title} (#{pomodori_before} -> #{card.extract_pomodori})"
70
+ card.log "[#{Time.now} - #{@user.full_name}] #{card.extract_title} (#{pomodori_before} -> #{card.extract_pomodori})"
71
+ puts('Done!')
72
+ else
73
+ puts 'Ok, bye!'
74
+ nil
75
+ end
76
+
77
+ continue = prompt.yes?('Another one?')
78
+ end
79
+ end
80
+
81
+ def configure_pello
82
+ config = Pello::Config.new
83
+ if config.valid?
84
+ Trello.configure do |trello_config|
85
+ trello_config.developer_public_key = config.developer_public_key
86
+ trello_config.member_token = config.member_token
87
+ end
88
+
89
+ @user = Trello::Member.find config.username
90
+ @board_url = config.board_url
91
+ @list_name = config.list_name
92
+ @log_file_path = config.log_file
93
+ else
94
+ puts 'No config found, opening config file...'
95
+ Pello::Config.write_empty_config
96
+ system "#{ENV['EDITOR']} #{Pello::Config::CONFIG_FILE_PATH}"
97
+ exit
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,3 @@
1
+ module Pello
2
+ VERSION = "0.1.0-001"
3
+ end
data/lib/pello.rb ADDED
@@ -0,0 +1,11 @@
1
+ require 'pello/version'
2
+ require 'pello/runner'
3
+ require 'pello/inputs'
4
+ require 'pello/board'
5
+ require 'pello/list'
6
+ require 'pello/card'
7
+ require 'pello/config'
8
+
9
+ module Pello
10
+ class Error < StandardError; end
11
+ end
metadata ADDED
@@ -0,0 +1,100 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pello
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0.pre.001
5
+ platform: ruby
6
+ authors:
7
+ - Andrea Schiavini
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-12-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: ruby-trello
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: tty-prompt
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: tty-table
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Perform Trello operations like adding pomodori to a card title
56
+ email:
57
+ - metalelf0@gmail.com
58
+ executables:
59
+ - pello
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - bin/pello
64
+ - lib/pello.rb
65
+ - lib/pello/board.rb
66
+ - lib/pello/card.rb
67
+ - lib/pello/config.rb
68
+ - lib/pello/inputs.rb
69
+ - lib/pello/list.rb
70
+ - lib/pello/runner.rb
71
+ - lib/pello/version.rb
72
+ homepage: https://github.com/metalelf0/pello
73
+ licenses:
74
+ - MIT
75
+ metadata:
76
+ allowed_push_host: https://rubygems.org
77
+ homepage_uri: https://github.com/metalelf0/pello
78
+ source_code_uri: https://github.com/metalelf0/pello
79
+ changelog_uri: https://github.com/metalelf0/pello
80
+ post_install_message:
81
+ rdoc_options: []
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: 2.4.0
89
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">"
92
+ - !ruby/object:Gem::Version
93
+ version: 1.3.1
94
+ requirements: []
95
+ rubyforge_project:
96
+ rubygems_version: 2.7.6.2
97
+ signing_key:
98
+ specification_version: 4
99
+ summary: A console tool to do Trello operations
100
+ test_files: []