tasks_cli 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1b2feeb892f58ae854a0761cd6e5c0faff6b794815628921c151b90fbc343f1a
4
- data.tar.gz: 0da27041da8f50808ac78f46f2bf5ddfe9557bda9defd57802120ad5da268c5a
3
+ metadata.gz: 65c56bae0c638f891b0b2d8893cbedefbeb8a3f9a2ca695eb16d9331f2c4f5af
4
+ data.tar.gz: d22a346ea8346f234e6849ef23073ad41ab671dc6652fb7b5fbba8c462e0e75e
5
5
  SHA512:
6
- metadata.gz: f8f1127576598a441dc39de0775f84f9d716bf48d5278af9d7759c9881511495b40d737d562d6c196aa047a8b6ba6217a5a9e064f558df9bae3dc23612eeacc2
7
- data.tar.gz: 12493dcc828745b56a824a536c6bf9094ba6b3ed0e0636bbe3740c6d6e1393389a1893a8981c4ecfcaca675f4413d4cd9f117c820d6b4be3810377f347ba23d1
6
+ metadata.gz: ea2f7bb708341e7aa16a16be841036a937a0f3a7b3bc189379b1f3157d7a6c2da921bea6861b79a9063669702b1cd44f5300045cc86ec22bdca2a6baeb6aa478
7
+ data.tar.gz: e89f423a18348ecf83cefbd0e46c66eda9c64004b23f198aced45e3e7eb5ccb561c662901641edbb4b61eef66ef65f73c6f6ddeffcf567b2f3a1b75e84e2a772
data/Gemfile CHANGED
@@ -1,7 +1,9 @@
1
- source "https://rubygems.org"
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 "rake", "~> 12.0"
7
- gem "rspec", "~> 3.0"
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
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
- require "bundler/setup"
4
- require "tasks_cli"
4
+ require 'bundler/setup'
5
+ require 'tasks_cli'
5
6
 
6
- TasksCLI::CLI.start(ARGV)
7
+ TasksCLI::CLI.start(ARGV)
data/lib/tasks_cli/cli.rb CHANGED
@@ -1,15 +1,18 @@
1
- require "thor"
2
- require "rainbow"
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 "list", "List all tasks"
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 "filter FIELD:VALUE", "Filter tasks by field and value"
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 "view NUMBER", "View details of a specific task"
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("Task not found").red
30
+ puts Rainbow('Task not found').red
28
31
  end
29
32
  end
30
33
 
31
- desc "update NUMBER STATUS", "Update the status of a task"
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("No tasks found.").yellow
44
+ puts Rainbow('No tasks found.').yellow
42
45
  return
43
46
  end
44
47
 
45
- puts Rainbow("\n%-10s %-30s %-15s %-10s %-25s" % ["Number", "Name", "Status", "Priority", "Last Updated"]).underline
46
- tasks.each do |task|
47
- puts "%-10s %-30s %-15s %-10s %-25s" % [
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.name.to_s.truncate(30)).magenta,
50
- task.status_colored,
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
@@ -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} (#{status_colored}) - Priority: #{priority_colored} - Updated: #{@updated_at}"
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("Epic:").bright} #{@epic}
31
- #{Rainbow("Number:").bright} #{Rainbow(@number).cyan}
32
- #{Rainbow("Name:").bright} #{Rainbow(@name).bright}
33
- #{Rainbow("Description:").bright} #{@description}
34
- #{Rainbow("Priority:").bright} #{priority_colored}
35
- #{Rainbow("Status:").bright} #{status_colored}
36
- #{Rainbow("Relates To:").bright} #{@relates_to}
37
- #{Rainbow("Blocked By:").bright} #{@blocked_by}
38
- #{Rainbow("Last Updated:").bright} #{@updated_at}
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 status_colored
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 == ["Epic Name", "Ticket Number", "Ticket Name", "Ticket Description", "Priority", "Status", "Relates To", "Blocked By"]
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 unless field.start_with?('[') && field.end_with?(']')
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..-1].each do |line|
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..-1].each do |line|
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("Task not found").red
101
+ puts Rainbow('Task not found').red
97
102
  end
98
103
  end
99
104
  end
100
- end
105
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TasksCLI
2
- VERSION = "0.1.1"
3
- end
4
+ VERSION = '0.1.2'
5
+ end
data/lib/tasks_cli.rb CHANGED
@@ -1,8 +1,10 @@
1
- require "tasks_cli/version"
2
- require "tasks_cli/cli"
3
- require "tasks_cli/task"
4
- require "tasks_cli/task_manager"
5
- require "logger"
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(STDOUT).tap do |log|
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} (#{status_colored}) - Priority: #{priority_colored} - Updated: #{@updated_at}"
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} #{status_colored}
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 status_colored
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 unless field.start_with?('[') && field.end_with?(']')
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.status_colored,
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 = "tasks_cli"
6
+ spec.name = 'tasks_cli'
5
7
  spec.version = TasksCLI::VERSION
6
- spec.authors = ["adilw3nomad"]
7
- spec.email = ["adil@w3nomad.com"]
8
+ spec.authors = ['adilw3nomad']
9
+ spec.email = ['adil@w3nomad.com']
8
10
 
9
- spec.summary = %q{A simple CLI for managing tasks}
10
- spec.description = %q{A command-line interface for managing tasks stored in a CSV file}
11
- spec.homepage = "https://github.com/adilw3nomad/tasks_cli"
12
- spec.license = "MIT"
13
- spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
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["homepage_uri"] = spec.homepage
16
- spec.metadata["source_code_uri"] = "https://github.com/adilw3nomad/tasks_cli"
17
- spec.metadata["changelog_uri"] = "https://github.com/adilw3nomad/tasks_cli/blob/master/CHANGELOG.md"
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 = Dir.chdir(File.expand_path('..', __FILE__)) do
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
- f.match(/^tasks_cli-.*\.gem$/) ||
25
- f.match(/^\.git/) ||
26
- f.match(/^\.github/)
26
+ f.match(/^tasks_cli-.*\.gem$/) ||
27
+ f.match(/^\.git/) ||
28
+ f.match(/^\.github/)
27
29
  end
28
30
  end
29
- spec.bindir = "exe"
30
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
31
- spec.require_paths = ["lib"]
31
+ spec.bindir = 'bin'
32
+ spec.executables = ['tasks']
33
+ spec.require_paths = ['lib']
32
34
 
33
- spec.add_dependency "thor", "~> 1.0"
34
- spec.add_dependency "rainbow", "~> 3.0"
35
- end
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.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - adilw3nomad
8
8
  autorequire:
9
- bindir: exe
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: thor
14
+ name: csv
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.0'
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: '1.0'
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