tasks_cli 0.1.1 → 0.1.2
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/Gemfile +5 -3
- data/Gemfile.lock +61 -0
- data/bin/tasks +4 -3
- data/lib/tasks_cli/cli.rb +23 -15
- data/lib/tasks_cli/task.rb +17 -13
- data/lib/tasks_cli/task_manager.rb +15 -10
- data/lib/tasks_cli/version.rb +4 -2
- data/lib/tasks_cli.rb +8 -7
- data/tasks +17 -6
- data/tasks_cli.gemspec +27 -21
- metadata +64 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 65c56bae0c638f891b0b2d8893cbedefbeb8a3f9a2ca695eb16d9331f2c4f5af
|
4
|
+
data.tar.gz: d22a346ea8346f234e6849ef23073ad41ab671dc6652fb7b5fbba8c462e0e75e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ea2f7bb708341e7aa16a16be841036a937a0f3a7b3bc189379b1f3157d7a6c2da921bea6861b79a9063669702b1cd44f5300045cc86ec22bdca2a6baeb6aa478
|
7
|
+
data.tar.gz: e89f423a18348ecf83cefbd0e46c66eda9c64004b23f198aced45e3e7eb5ccb561c662901641edbb4b61eef66ef65f73c6f6ddeffcf567b2f3a1b75e84e2a772
|
data/Gemfile
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
source 'https://rubygems.org'
|
2
4
|
|
3
5
|
# Specify your gem's dependencies in tasks_cli.gemspec
|
4
6
|
gemspec
|
5
7
|
|
6
|
-
gem
|
7
|
-
gem
|
8
|
+
gem 'rake', '~> 12.0'
|
9
|
+
gem 'rspec', '~> 3.0'
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
tasks_cli (0.1.1)
|
5
|
+
csv (~> 3.0)
|
6
|
+
logger (~> 1.5)
|
7
|
+
ostruct (~> 0.3.0)
|
8
|
+
rainbow (~> 3.0)
|
9
|
+
thor (~> 1.0)
|
10
|
+
tty-table (~> 0.12.0)
|
11
|
+
|
12
|
+
GEM
|
13
|
+
remote: https://rubygems.org/
|
14
|
+
specs:
|
15
|
+
csv (3.2.8)
|
16
|
+
diff-lcs (1.5.1)
|
17
|
+
logger (1.6.1)
|
18
|
+
ostruct (0.3.3)
|
19
|
+
pastel (0.8.0)
|
20
|
+
tty-color (~> 0.5)
|
21
|
+
rainbow (3.1.1)
|
22
|
+
rake (12.3.3)
|
23
|
+
rspec (3.13.0)
|
24
|
+
rspec-core (~> 3.13.0)
|
25
|
+
rspec-expectations (~> 3.13.0)
|
26
|
+
rspec-mocks (~> 3.13.0)
|
27
|
+
rspec-core (3.13.1)
|
28
|
+
rspec-support (~> 3.13.0)
|
29
|
+
rspec-expectations (3.13.3)
|
30
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
31
|
+
rspec-support (~> 3.13.0)
|
32
|
+
rspec-mocks (3.13.1)
|
33
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
34
|
+
rspec-support (~> 3.13.0)
|
35
|
+
rspec-support (3.13.1)
|
36
|
+
strings (0.2.1)
|
37
|
+
strings-ansi (~> 0.2)
|
38
|
+
unicode-display_width (>= 1.5, < 3.0)
|
39
|
+
unicode_utils (~> 1.4)
|
40
|
+
strings-ansi (0.2.0)
|
41
|
+
thor (1.3.2)
|
42
|
+
tty-color (0.6.0)
|
43
|
+
tty-screen (0.8.2)
|
44
|
+
tty-table (0.12.0)
|
45
|
+
pastel (~> 0.8)
|
46
|
+
strings (~> 0.2.0)
|
47
|
+
tty-screen (~> 0.8)
|
48
|
+
unicode-display_width (2.6.0)
|
49
|
+
unicode_utils (1.4.0)
|
50
|
+
|
51
|
+
PLATFORMS
|
52
|
+
arm64-darwin-23
|
53
|
+
ruby
|
54
|
+
|
55
|
+
DEPENDENCIES
|
56
|
+
rake (~> 12.0)
|
57
|
+
rspec (~> 3.0)
|
58
|
+
tasks_cli!
|
59
|
+
|
60
|
+
BUNDLED WITH
|
61
|
+
2.5.16
|
data/bin/tasks
CHANGED
data/lib/tasks_cli/cli.rb
CHANGED
@@ -1,15 +1,18 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'thor'
|
4
|
+
require 'rainbow'
|
5
|
+
require 'tty-table'
|
3
6
|
|
4
7
|
module TasksCLI
|
5
8
|
class CLI < Thor
|
6
|
-
desc
|
9
|
+
desc 'list', 'List all tasks'
|
7
10
|
def list
|
8
11
|
manager = TaskManager.new
|
9
12
|
print_tasks(manager.all_tasks)
|
10
13
|
end
|
11
14
|
|
12
|
-
desc
|
15
|
+
desc 'filter FIELD:VALUE', 'Filter tasks by field and value'
|
13
16
|
def filter(filter_string)
|
14
17
|
manager = TaskManager.new
|
15
18
|
key, value = filter_string.split(':')
|
@@ -17,18 +20,18 @@ module TasksCLI
|
|
17
20
|
print_tasks(filtered_tasks)
|
18
21
|
end
|
19
22
|
|
20
|
-
desc
|
23
|
+
desc 'view NUMBER', 'View details of a specific task'
|
21
24
|
def view(number)
|
22
25
|
manager = TaskManager.new
|
23
26
|
task = manager.find_task(number)
|
24
27
|
if task
|
25
28
|
puts task.detailed_view
|
26
29
|
else
|
27
|
-
puts Rainbow(
|
30
|
+
puts Rainbow('Task not found').red
|
28
31
|
end
|
29
32
|
end
|
30
33
|
|
31
|
-
desc
|
34
|
+
desc 'update NUMBER STATUS', 'Update the status of a task'
|
32
35
|
def update(number, status)
|
33
36
|
manager = TaskManager.new
|
34
37
|
manager.update_status(number, status)
|
@@ -38,21 +41,26 @@ module TasksCLI
|
|
38
41
|
|
39
42
|
def print_tasks(tasks)
|
40
43
|
if tasks.empty?
|
41
|
-
puts Rainbow(
|
44
|
+
puts Rainbow('No tasks found.').yellow
|
42
45
|
return
|
43
46
|
end
|
44
47
|
|
45
|
-
|
46
|
-
tasks.
|
47
|
-
|
48
|
+
header = ['Number', 'Epic', 'Name', 'Status', 'Priority', 'Last Updated']
|
49
|
+
rows = tasks.map do |task|
|
50
|
+
[
|
48
51
|
Rainbow(task.number).cyan,
|
49
|
-
Rainbow(task.
|
50
|
-
task.
|
52
|
+
Rainbow(task.epic).yellow,
|
53
|
+
Rainbow(task.name).magenta,
|
54
|
+
task.status_color,
|
51
55
|
task.priority_colored,
|
52
|
-
Rainbow(task.updated_at).blue
|
56
|
+
Rainbow(task.updated_at.to_s).blue
|
53
57
|
]
|
54
58
|
end
|
59
|
+
|
60
|
+
table = TTY::Table.new(header: header, rows: rows)
|
61
|
+
puts table.render(:unicode, padding: [0, 1], alignment: [:left])
|
62
|
+
|
55
63
|
puts "\nTotal tasks: #{Rainbow(tasks.count).green}"
|
56
64
|
end
|
57
65
|
end
|
58
|
-
end
|
66
|
+
end
|
data/lib/tasks_cli/task.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rainbow'
|
2
4
|
|
3
5
|
module TasksCLI
|
4
6
|
class Task
|
5
7
|
attr_reader :epic, :number, :name, :description, :priority, :status, :relates_to, :blocked_by, :updated_at
|
6
|
-
|
8
|
+
|
7
9
|
def initialize(row)
|
8
10
|
@epic = extract_value(row[0])
|
9
11
|
@number = extract_value(row[1])
|
@@ -17,25 +19,27 @@ module TasksCLI
|
|
17
19
|
end
|
18
20
|
|
19
21
|
def extract_value(field)
|
22
|
+
return '' if field.nil?
|
20
23
|
return field if field.is_a?(String)
|
24
|
+
|
21
25
|
field.is_a?(Array) ? field[1].to_s.strip : field.to_s.strip
|
22
26
|
end
|
23
27
|
|
24
28
|
def to_s
|
25
|
-
"#{Rainbow(@number).cyan}: #{Rainbow(@name).bright} (#{
|
29
|
+
"#{Rainbow(@number).cyan}: #{Rainbow(@name).bright} (#{status_color}) - Priority: #{priority_colored} - Updated: #{@updated_at}"
|
26
30
|
end
|
27
31
|
|
28
32
|
def detailed_view
|
29
33
|
<<~TASK
|
30
|
-
#{Rainbow(
|
31
|
-
#{Rainbow(
|
32
|
-
#{Rainbow(
|
33
|
-
#{Rainbow(
|
34
|
-
#{Rainbow(
|
35
|
-
#{Rainbow(
|
36
|
-
#{Rainbow(
|
37
|
-
#{Rainbow(
|
38
|
-
#{Rainbow(
|
34
|
+
#{Rainbow('Epic:').bright} #{@epic}
|
35
|
+
#{Rainbow('Number:').bright} #{Rainbow(@number).cyan}
|
36
|
+
#{Rainbow('Name:').bright} #{Rainbow(@name).bright}
|
37
|
+
#{Rainbow('Description:').bright} #{@description}
|
38
|
+
#{Rainbow('Priority:').bright} #{priority_colored}
|
39
|
+
#{Rainbow('Status:').bright} #{status_color}
|
40
|
+
#{Rainbow('Relates To:').bright} #{@relates_to}
|
41
|
+
#{Rainbow('Blocked By:').bright} #{@blocked_by}
|
42
|
+
#{Rainbow('Last Updated:').bright} #{@updated_at}
|
39
43
|
TASK
|
40
44
|
end
|
41
45
|
|
@@ -53,7 +57,7 @@ module TasksCLI
|
|
53
57
|
@updated_at = Time.now.iso8601
|
54
58
|
end
|
55
59
|
|
56
|
-
def
|
60
|
+
def status_color
|
57
61
|
case @status.downcase
|
58
62
|
when 'to do' then Rainbow(@status).red
|
59
63
|
when 'in progress' then Rainbow(@status).yellow
|
@@ -71,4 +75,4 @@ module TasksCLI
|
|
71
75
|
end
|
72
76
|
end
|
73
77
|
end
|
74
|
-
end
|
78
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'csv'
|
2
4
|
require 'json'
|
3
5
|
require 'rainbow'
|
@@ -12,11 +14,13 @@ module TasksCLI
|
|
12
14
|
def load_tasks
|
13
15
|
@tasks = []
|
14
16
|
CSV.foreach(@file_path, headers: false) do |row|
|
15
|
-
next if row == [
|
17
|
+
next if row == ['Epic Name', 'Ticket Number', 'Ticket Name', 'Ticket Description', 'Priority', 'Status',
|
18
|
+
'Relates To', 'Blocked By']
|
19
|
+
|
16
20
|
begin
|
17
21
|
parsed_row = row.map { |field| parse_field(field) }
|
18
22
|
@tasks << Task.new(parsed_row)
|
19
|
-
rescue => e
|
23
|
+
rescue StandardError => e
|
20
24
|
puts "Error processing row: #{row.inspect}"
|
21
25
|
puts "Error message: #{e.message}"
|
22
26
|
end
|
@@ -24,13 +28,14 @@ module TasksCLI
|
|
24
28
|
rescue CSV::MalformedCSVError => e
|
25
29
|
puts Rainbow("Error reading CSV: #{e.message}. Trying to parse with alternative method...").red
|
26
30
|
parse_csv_manually
|
27
|
-
rescue => e
|
31
|
+
rescue StandardError => e
|
28
32
|
puts Rainbow("Unexpected error while loading tasks: #{e.message}").red
|
29
33
|
puts e.backtrace
|
30
34
|
end
|
31
35
|
|
32
36
|
def parse_field(field)
|
33
|
-
return field
|
37
|
+
return field if field.nil? || !(field.start_with?('[') && field.end_with?(']'))
|
38
|
+
|
34
39
|
parsed = JSON.parse(field.gsub('=>', ':'))
|
35
40
|
[parsed[0], parsed[1]]
|
36
41
|
rescue JSON::ParserError
|
@@ -40,11 +45,11 @@ module TasksCLI
|
|
40
45
|
def parse_csv_manually
|
41
46
|
@tasks = []
|
42
47
|
lines = File.readlines(@file_path)
|
43
|
-
lines[1
|
48
|
+
lines[1..].each do |line|
|
44
49
|
fields = line.strip.split(',')
|
45
50
|
parsed_fields = fields.map { |field| parse_field(field) }
|
46
51
|
@tasks << Task.new(parsed_fields)
|
47
|
-
rescue => e
|
52
|
+
rescue StandardError => e
|
48
53
|
puts "Error processing line: #{line}"
|
49
54
|
puts "Error message: #{e.message}"
|
50
55
|
end
|
@@ -54,7 +59,7 @@ module TasksCLI
|
|
54
59
|
lines = File.readlines(@file_path)
|
55
60
|
File.open(@file_path, 'w') do |file|
|
56
61
|
file.puts lines[0].chomp # Write header as is
|
57
|
-
lines[1
|
62
|
+
lines[1..].each do |line|
|
58
63
|
fields = line.strip.split(',').map { |f| parse_field(f) }
|
59
64
|
if fields[1][1] == task_number
|
60
65
|
task = find_task(task_number)
|
@@ -68,7 +73,7 @@ module TasksCLI
|
|
68
73
|
end
|
69
74
|
|
70
75
|
def all_tasks
|
71
|
-
@tasks
|
76
|
+
@tasks[1..]
|
72
77
|
end
|
73
78
|
|
74
79
|
def filter_tasks(criteria)
|
@@ -93,8 +98,8 @@ module TasksCLI
|
|
93
98
|
puts Rainbow("Last updated: #{TasksCLI.format_date(task.updated_at)}").cyan
|
94
99
|
else
|
95
100
|
TasksCLI.logger.warn("Task not found: #{number}")
|
96
|
-
puts Rainbow(
|
101
|
+
puts Rainbow('Task not found').red
|
97
102
|
end
|
98
103
|
end
|
99
104
|
end
|
100
|
-
end
|
105
|
+
end
|
data/lib/tasks_cli/version.rb
CHANGED
data/lib/tasks_cli.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'tasks_cli/version'
|
4
|
+
require 'tasks_cli/cli'
|
5
|
+
require 'tasks_cli/task'
|
6
|
+
require 'tasks_cli/task_manager'
|
7
|
+
require 'logger'
|
6
8
|
|
7
9
|
module TasksCLI
|
8
10
|
class Error < StandardError; end
|
@@ -37,9 +39,8 @@ module TasksCLI
|
|
37
39
|
|
38
40
|
# Logging
|
39
41
|
def self.logger
|
40
|
-
@logger ||= Logger.new(
|
42
|
+
@logger ||= Logger.new($stdout).tap do |log|
|
41
43
|
log.progname = 'TasksCLI'
|
42
44
|
end
|
43
45
|
end
|
44
46
|
end
|
45
|
-
```
|
data/tasks
CHANGED
@@ -23,13 +23,24 @@ class Task
|
|
23
23
|
@updated_at = extract_value(row[8]) || Time.now.iso8601
|
24
24
|
end
|
25
25
|
|
26
|
+
def status_color
|
27
|
+
case @status.downcase
|
28
|
+
when 'to do' then :red
|
29
|
+
when 'in progress' then :yellow
|
30
|
+
when 'done' then :green
|
31
|
+
else :white
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
|
26
37
|
def extract_value(field)
|
27
38
|
return field if field.is_a?(String)
|
28
39
|
field.is_a?(Array) ? field[1].to_s.strip : field.to_s.strip
|
29
40
|
end
|
30
41
|
|
31
42
|
def to_s
|
32
|
-
"#{Rainbow(@number).cyan}: #{Rainbow(@name).bright} (#{
|
43
|
+
"#{Rainbow(@number).cyan}: #{Rainbow(@name).bright} (#{status_color}) - Priority: #{priority_colored} - Updated: #{@updated_at}"
|
33
44
|
end
|
34
45
|
|
35
46
|
def detailed_view
|
@@ -39,7 +50,7 @@ class Task
|
|
39
50
|
#{Rainbow("Name:").bright} #{Rainbow(@name).bright}
|
40
51
|
#{Rainbow("Description:").bright} #{@description}
|
41
52
|
#{Rainbow("Priority:").bright} #{priority_colored}
|
42
|
-
#{Rainbow("Status:").bright} #{
|
53
|
+
#{Rainbow("Status:").bright} #{status_color}
|
43
54
|
#{Rainbow("Relates To:").bright} #{@relates_to}
|
44
55
|
#{Rainbow("Blocked By:").bright} #{@blocked_by}
|
45
56
|
#{Rainbow("Last Updated:").bright} #{@updated_at}
|
@@ -60,7 +71,7 @@ class Task
|
|
60
71
|
@updated_at = Time.now.iso8601
|
61
72
|
end
|
62
73
|
|
63
|
-
def
|
74
|
+
def status_color
|
64
75
|
case @status.downcase
|
65
76
|
when 'to do' then Rainbow(@status).red
|
66
77
|
when 'in progress' then Rainbow(@status).yellow
|
@@ -88,7 +99,7 @@ class TaskManager
|
|
88
99
|
def load_tasks
|
89
100
|
@tasks = []
|
90
101
|
CSV.foreach(@file_path, headers: false) do |row|
|
91
|
-
next if row == ["Epic Name", "Ticket Number", "Ticket Name", "Ticket Description", "Priority", "Status", "Relates To", "Blocked By"]
|
102
|
+
next if row == ["Epic Name", "Ticket Number", "Ticket Name", "Ticket Description", "Priority", "Status", "Relates To", "Blocked By", "Updated At"]
|
92
103
|
begin
|
93
104
|
parsed_row = row.map do |field|
|
94
105
|
parse_field(field)
|
@@ -108,7 +119,7 @@ class TaskManager
|
|
108
119
|
end
|
109
120
|
|
110
121
|
def parse_field(field)
|
111
|
-
return field
|
122
|
+
return field if field.nil? || !(field.start_with?('[') && field.end_with?(']'))
|
112
123
|
parsed = JSON.parse(field.gsub('=>', ':'))
|
113
124
|
[parsed[0], parsed[1]]
|
114
125
|
rescue JSON::ParserError
|
@@ -185,7 +196,7 @@ def print_tasks(tasks)
|
|
185
196
|
puts "%-10s %-30s %-15s %-10s %-25s" % [
|
186
197
|
Rainbow(task.number).cyan,
|
187
198
|
Rainbow(task.name.to_s.truncate(30)).magenta,
|
188
|
-
task.
|
199
|
+
task.status_color,
|
189
200
|
task.priority_colored,
|
190
201
|
Rainbow(task.updated_at).blue
|
191
202
|
]
|
data/tasks_cli.gemspec
CHANGED
@@ -1,35 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'lib/tasks_cli/version'
|
2
4
|
|
3
5
|
Gem::Specification.new do |spec|
|
4
|
-
spec.name =
|
6
|
+
spec.name = 'tasks_cli'
|
5
7
|
spec.version = TasksCLI::VERSION
|
6
|
-
spec.authors = [
|
7
|
-
spec.email = [
|
8
|
+
spec.authors = ['adilw3nomad']
|
9
|
+
spec.email = ['adil@w3nomad.com']
|
8
10
|
|
9
|
-
spec.summary =
|
10
|
-
spec.description =
|
11
|
-
spec.homepage =
|
12
|
-
spec.license =
|
13
|
-
spec.required_ruby_version = Gem::Requirement.new(
|
11
|
+
spec.summary = 'A simple CLI for managing tasks'
|
12
|
+
spec.description = 'A command-line interface for managing tasks stored in a CSV file'
|
13
|
+
spec.homepage = 'https://github.com/adilw3nomad/tasks_cli'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
spec.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
|
14
16
|
|
15
|
-
spec.metadata[
|
16
|
-
spec.metadata[
|
17
|
-
spec.metadata[
|
17
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
18
|
+
spec.metadata['source_code_uri'] = 'https://github.com/adilw3nomad/tasks_cli'
|
19
|
+
spec.metadata['changelog_uri'] = 'https://github.com/adilw3nomad/tasks_cli/blob/master/CHANGELOG.md'
|
18
20
|
|
19
21
|
# Specify which files should be added to the gem when it is released.
|
20
22
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
21
|
-
spec.files
|
23
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
22
24
|
`git ls-files -z`.split("\x0").reject do |f|
|
23
25
|
f.match(%r{^(test|spec|features)/}) ||
|
24
|
-
|
25
|
-
|
26
|
-
|
26
|
+
f.match(/^tasks_cli-.*\.gem$/) ||
|
27
|
+
f.match(/^\.git/) ||
|
28
|
+
f.match(/^\.github/)
|
27
29
|
end
|
28
30
|
end
|
29
|
-
spec.bindir =
|
30
|
-
spec.executables =
|
31
|
-
spec.require_paths = [
|
31
|
+
spec.bindir = 'bin'
|
32
|
+
spec.executables = ['tasks']
|
33
|
+
spec.require_paths = ['lib']
|
32
34
|
|
33
|
-
spec.add_dependency
|
34
|
-
spec.add_dependency
|
35
|
-
|
35
|
+
spec.add_dependency 'csv', '~> 3.0'
|
36
|
+
spec.add_dependency 'logger', '~> 1.5'
|
37
|
+
spec.add_dependency 'ostruct', '~> 0.3.0'
|
38
|
+
spec.add_dependency 'rainbow', '~> 3.0'
|
39
|
+
spec.add_dependency 'thor', '~> 1.0'
|
40
|
+
spec.add_dependency 'tty-table', '~> 0.12.0'
|
41
|
+
end
|
metadata
CHANGED
@@ -1,29 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tasks_cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- adilw3nomad
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
date: 2024-09-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: csv
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '3.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '3.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: logger
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.5'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.5'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: ostruct
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.3.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.3.0
|
27
55
|
- !ruby/object:Gem::Dependency
|
28
56
|
name: rainbow
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,14 +66,44 @@ dependencies:
|
|
38
66
|
- - "~>"
|
39
67
|
- !ruby/object:Gem::Version
|
40
68
|
version: '3.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: thor
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: tty-table
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.12.0
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.12.0
|
41
97
|
description: A command-line interface for managing tasks stored in a CSV file
|
42
98
|
email:
|
43
99
|
- adil@w3nomad.com
|
44
|
-
executables:
|
100
|
+
executables:
|
101
|
+
- tasks
|
45
102
|
extensions: []
|
46
103
|
extra_rdoc_files: []
|
47
104
|
files:
|
48
105
|
- Gemfile
|
106
|
+
- Gemfile.lock
|
49
107
|
- bin/tasks
|
50
108
|
- lib/tasks_cli.rb
|
51
109
|
- lib/tasks_cli/cli.rb
|