ineedto 0.0.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 8eb0030ac1307cc4a2bab127d24df4c1c597807e66c46aba53aa1954a038d58b
4
+ data.tar.gz: 6fbe9187814d46efd74fee99cee557062161bfb6aecd759459a202ba9d76c5da
5
+ SHA512:
6
+ metadata.gz: b2052b6f4a010b475cc52f7e026f3352c6e9fd16d731d3e8573f9783b7731051d79279495131c0ff3af150f7773e8278eab9291faa91b4d43612f197805be793
7
+ data.tar.gz: d9a2a9bb02121fd4200a3d4cf36bd4ff79629f998ea3c601f0d0d598be4573705aee5f14bab8c673e6293c1628e1f28eb723e29704afa20f79e4ab3738764294
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env ruby
2
+ require 'logger'
3
+ require 'sequel'
4
+
5
+ require File.expand_path('../../lib/cmd', __FILE__)
6
+
7
+ logger = Logger.new(STDOUT)
8
+ logger.level = Logger::DEBUG
9
+
10
+ at_exit do
11
+ logger.close
12
+ end
13
+
14
+ DB = Sequel.sqlite "#{ENV['HOME']}/.ineedtodb"
15
+
16
+ DB.create_table(:todos) do
17
+ primary_key :id
18
+ Integer :priority
19
+ String :name
20
+ TrueClass :done
21
+ DateTime :due_date
22
+ DateTime :completed_on
23
+ end unless DB.table_exists?(:todos)
24
+
25
+
26
+ cmd = case ARGV.first
27
+ when "new"
28
+ ARGV.shift
29
+ Cmd::NewTask.new(DB, logger, STDOUT, STDERR)
30
+ when "complete"
31
+ ARGV.shift
32
+ Cmd::CompleteTask.new(DB, logger, STDOUT, STDERR)
33
+ when "list"
34
+ ARGV.shift
35
+ Cmd::ListTasks.new(DB, logger, STDOUT, STDERR)
36
+ when "pending"
37
+ ARGV.shift
38
+ Cmd::PendingTasks.new(DB, logger, STDOUT, STDERR)
39
+ when "completed"
40
+ ARGV.shift
41
+ Cmd::CompletedTasks.new(DB, logger, STDOUT, STDERR)
42
+ when "search"
43
+ ARGV.shift
44
+ Cmd::SearchTasks.new(DB, logger, STDOUT, STDERR)
45
+ when "today"
46
+ ARGV.shift
47
+ Cmd::TodayTasks.new(DB, logger, STDOUT, STDERR)
48
+ when "clean"
49
+ ARGV.shift
50
+ Cmd::CleanTasks.new(DB, logger, STDOUT, STDERR)
51
+ else
52
+ Cmd::Root.new(logger, STDOUT, STDERR)
53
+ end
54
+
55
+ cmd.(ARGV)
@@ -0,0 +1,14 @@
1
+ require_relative 'cmd/root'
2
+ require_relative 'cmd/new'
3
+ require_relative 'cmd/list'
4
+ require_relative 'cmd/complete'
5
+ require_relative 'cmd/pending'
6
+ require_relative 'cmd/completed'
7
+ require_relative 'cmd/search'
8
+ require_relative 'cmd/today'
9
+ require_relative 'cmd/clean'
10
+
11
+ module Cmd
12
+ VERSION = "0.0.1"
13
+ DATE_FORMAT = "%Y-%m-%d"
14
+ end
@@ -0,0 +1,39 @@
1
+ require 'optparse'
2
+ require 'terminal-table'
3
+
4
+ module Cmd
5
+ class CleanTasks
6
+ def initialize(db, logger, stdout, stderr)
7
+ @db = db
8
+ @logger = logger
9
+ @stdout = stdout
10
+ @stderr = stderr
11
+ end
12
+
13
+ def call(argv)
14
+ _ = parse(argv)
15
+ todos = @db[:todos].delete
16
+ @stdout.puts("Tasks cleaned up succesffully")
17
+ end
18
+
19
+ private
20
+
21
+ def parse(args)
22
+ options = {}
23
+ parser = OptionParser.new do |opts|
24
+ opts.banner = "Usage: ineedto clean"
25
+
26
+ opts.on("-h", "--help", "Show help and exit") do
27
+ @stdout.puts opts
28
+ exit(0)
29
+ end
30
+ end
31
+ parser.parse!(args)
32
+ options
33
+ rescue => e
34
+ @stderr.puts e.message
35
+ @stderr.puts parser
36
+ exit(1)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,48 @@
1
+ require 'optparse'
2
+
3
+
4
+ module Cmd
5
+ class CompleteTask
6
+ def initialize(db, logger, stdout, stderr)
7
+ @db = db
8
+ @logger = logger
9
+ @stdout = stdout
10
+ @stderr = stderr
11
+ end
12
+
13
+ def call(args)
14
+ options = parse(args)
15
+ todo = @db[:todos].where(id: options[:id]).first
16
+ if todo.nil?
17
+ @stderr.puts "Not found"
18
+ exit(1)
19
+ end
20
+ @db[:todos].where(id: options[:id]).update(done: true, completed_on: Date.today)
21
+ @stdout.puts "Task completed"
22
+ end
23
+
24
+ private
25
+
26
+ def parse(args)
27
+ options = {}
28
+ parser = OptionParser.new do |opts|
29
+ opts.banner = "Usage: ineedto complete"
30
+
31
+ opts.on("--h", "--help", "Show this help and exit") do
32
+ @stdout.puts opts
33
+ exit(0)
34
+ end
35
+
36
+ opts.on("-t ID", "--task ID", Integer, "Task to complete") do |id|
37
+ options[:id] = id
38
+ end
39
+ end
40
+ parser.parse!(args)
41
+ options
42
+ rescue => e
43
+ @stderr.puts e.message
44
+ @stderr.puts parser
45
+ exit(1)
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,46 @@
1
+ require 'optparse'
2
+ require 'terminal-table'
3
+
4
+ module Cmd
5
+ class CompletedTasks
6
+ def initialize(db, logger, stdout, stderr)
7
+ @db = db
8
+ @logger = logger
9
+ @stdout = stdout
10
+ @stderr = stderr
11
+ end
12
+
13
+ def call(argv)
14
+ _ = parse(argv)
15
+ todos = @db[:todos].where(done: true).all
16
+ table = Terminal::Table.new do |t|
17
+ t.headings = ["ID", "Priority", "Name", "Done", "Due Date", "Completed On"]
18
+ todos.each do |todo|
19
+ t.add_row [todo[:id], todo[:priority], todo[:name], todo[:done], todo[:due_date].strftime(DATE_FORMAT), todo[:completed_on].strftime(DATE_FORMAT)]
20
+ end
21
+ end
22
+
23
+ @stdout.puts(table)
24
+ end
25
+
26
+ private
27
+
28
+ def parse(args)
29
+ options = {}
30
+ parser = OptionParser.new do |opts|
31
+ opts.banner = "Usage: todo completed"
32
+
33
+ opts.on("-h", "--help", "Show help and exit") do
34
+ @stdout.puts opts
35
+ exit(0)
36
+ end
37
+ end
38
+ parser.parse!(args)
39
+ options
40
+ rescue => e
41
+ @stderr.puts e.message
42
+ @stderr.puts parser
43
+ exit(1)
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,46 @@
1
+ require 'optparse'
2
+ require 'terminal-table'
3
+
4
+ module Cmd
5
+ class ListTasks
6
+ def initialize(db, logger, stdout, stderr)
7
+ @db = db
8
+ @logger = logger
9
+ @stdout = stdout
10
+ @stderr = stderr
11
+ end
12
+
13
+ def call(argv)
14
+ _ = parse(argv)
15
+ todos = @db[:todos].all
16
+ table = Terminal::Table.new do |t|
17
+ t.headings = ["ID", "Priority", "Name", "Done", "Due Date", "Completed On"]
18
+ todos.each do |todo|
19
+ t.add_row [todo[:id], todo[:priority], todo[:name], todo[:done], todo[:due_date].strftime(DATE_FORMAT), todo[:completed_on] && todo[:completed_on].strftime(DATE_FORMAT)]
20
+ end
21
+ end
22
+
23
+ @stdout.puts(table)
24
+ end
25
+
26
+ private
27
+
28
+ def parse(args)
29
+ options = {}
30
+ parser = OptionParser.new do |opts|
31
+ opts.banner = "Usage: ineedto list"
32
+
33
+ opts.on("-h", "--help", "Show help and exit") do
34
+ @stdout.puts opts
35
+ exit(0)
36
+ end
37
+ end
38
+ parser.parse!(args)
39
+ options
40
+ rescue => e
41
+ @stderr.puts e.message
42
+ @stderr.puts parser
43
+ exit(1)
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,88 @@
1
+ require 'optparse'
2
+ require 'json'
3
+ require 'date'
4
+
5
+ require 'dry-validation'
6
+
7
+ module Cmd
8
+ class NewTaskContract < Dry::Validation::Contract
9
+ schema do
10
+ required(:name).filled(:string, size?: 1..255)
11
+ required(:priority).filled(:integer, gt?: 0)
12
+ required(:due_date).filled(:date)
13
+ end
14
+
15
+ rule(:due_date) do
16
+ key.failure("Cannot be in the past :)") if value < Date.today
17
+ end
18
+ end
19
+
20
+ class NewTask
21
+ def initialize(db, logger, stdout, stderr)
22
+ @db = db
23
+ @logger = logger
24
+ @stdout = stdout
25
+ @stderr = stderr
26
+ @contract = NewTaskContract.new
27
+ end
28
+
29
+ def call(args)
30
+ options = parse(args)
31
+ errors = @contract.(options).errors(full: true).to_h
32
+ unless errors.empty?
33
+ table = Terminal::Table.new do |t|
34
+ errors.each do |field, errors|
35
+ row = []
36
+ row.push(field)
37
+ errors.each do |err|
38
+ row.push(err)
39
+ end
40
+ t.add_row(row)
41
+ end
42
+ end
43
+ @stderr.puts "Failed to create task"
44
+ @stderr.puts table
45
+ return
46
+ end
47
+ options[:done] = false
48
+ @db[:todos].insert(options)
49
+ @stdout.puts "Task added successfully"
50
+ rescue => e
51
+ @stderr.puts e.message
52
+ @stderr.puts parser
53
+ exit(1)
54
+ end
55
+
56
+ private
57
+
58
+ def parse(args)
59
+ options = {}
60
+ parser = OptionParser.new do |opts|
61
+ opts.banner = "Usage: ineedto new"
62
+
63
+ opts.on("-h", "--help", "Prints this help") do
64
+ puts opts
65
+ exit
66
+ end
67
+
68
+ opts.on("-n", "--name NAME", "Task Name") do |name|
69
+ options[:name] = name
70
+ end
71
+
72
+ opts.on("-p", "--priority [N]", Integer, "Priority") do |priority|
73
+ options[:priority] = priority || 1
74
+ end
75
+
76
+ opts.on("-d", "--due-date DUE_DATE", "Due date with format YYYY-MM-DD") do |due_date|
77
+ options[:due_date] = Date.strptime(due_date, DATE_FORMAT)
78
+ end
79
+ end
80
+ parser.parse(args)
81
+ options
82
+ rescue => e
83
+ @stderr.puts("Failed to parse arguments")
84
+ @logger.debug(e.message)
85
+ exit(1)
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,47 @@
1
+
2
+ require 'optparse'
3
+ require 'terminal-table'
4
+
5
+ module Cmd
6
+ class PendingTasks
7
+ def initialize(db, logger, stdout, stderr)
8
+ @db = db
9
+ @logger = logger
10
+ @stdout = stdout
11
+ @stderr = stderr
12
+ end
13
+
14
+ def call(argv)
15
+ _ = parse(argv)
16
+ todos = @db[:todos].where(done: false).all
17
+ table = Terminal::Table.new do |t|
18
+ t.headings = ["ID", "Priority", "Name", "Done", "Due Date"]
19
+ todos.each do |todo|
20
+ t.add_row [todo[:id], todo[:priority], todo[:name], todo[:done], todo[:due_date].strftime(DATE_FORMAT)]
21
+ end
22
+ end
23
+
24
+ @stdout.puts(table)
25
+ end
26
+
27
+ private
28
+
29
+ def parse(args)
30
+ options = {}
31
+ parser = OptionParser.new do |opts|
32
+ opts.banner = "Usage: ineedto pending"
33
+
34
+ opts.on("-h", "--help", "Show help and exit") do
35
+ puts opts
36
+ exit(0)
37
+ end
38
+ end
39
+ parser.parse!(args)
40
+ options
41
+ rescue => e
42
+ @stderr.puts e.message
43
+ @stderr.puts parser
44
+ exit(1)
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,33 @@
1
+ require 'optparse'
2
+
3
+ module Cmd
4
+ class Root
5
+ def initialize(logger, stdout, stderr)
6
+ @logger = logger
7
+ @stdout = stdout
8
+ @stderr = stderr
9
+ end
10
+
11
+ def call(args)
12
+ parser = OptionParser.new do |opts|
13
+ opts.banner = "Usage: ineedto [new|complete|list|pending|completed|today|search]"
14
+
15
+ opts.on("-h", "--help", "Prints this help") do
16
+ @stdout.opts
17
+ exit
18
+ end
19
+
20
+ opts.on("-v", "--version", "Prints version") do
21
+ @stdout.puts VERSION
22
+ exit
23
+ end
24
+ end
25
+ parser.parse!(args)
26
+ @stdout.puts parser
27
+ rescue => e
28
+ @stderr.puts e.message
29
+ @stderr.puts parser
30
+ exit(1)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,53 @@
1
+ require 'optparse'
2
+ require 'terminal-table'
3
+
4
+ require 'sequel'
5
+
6
+ module Cmd
7
+ class SearchTasks
8
+ def initialize(db, logger, stdout, stderr)
9
+ @db = db
10
+ @logger = logger
11
+ @stdout = stdout
12
+ @stderr = stderr
13
+ end
14
+
15
+ def call(argv)
16
+ options = parse(argv)
17
+ todos = @db[:todos].where(Sequel.ilike(:name, "%#{options[:q]}%")).all
18
+ table = Terminal::Table.new do |t|
19
+ t.headings = ["ID", "Priority", "Name", "Done", "Due Date", "Completed On"]
20
+ todos.each do |todo|
21
+ t.add_row [todo[:id], todo[:priority], todo[:name], todo[:done], todo[:due_date].strftime(DATE_FORMAT), todo[:completed_on] && todo[:completed_on].strftime(DATE_FORMAT)]
22
+ end
23
+ end
24
+
25
+ @stdout.puts(table)
26
+ end
27
+
28
+ private
29
+
30
+ def parse(args)
31
+ options = {}
32
+ parser = OptionParser.new do |opts|
33
+ opts.banner = "Usage: ineedto search"
34
+
35
+ opts.on("-h", "--help", "Show help and exit") do
36
+ @stdout.puts opts
37
+ exit(0)
38
+ end
39
+
40
+ opts.on("-q", "--query [QUERY]", "Search tasks using q") do |q|
41
+ options[:q] = q || ""
42
+ end
43
+ end
44
+ parser.parse!(args)
45
+ options
46
+ rescue => e
47
+ @stderr.puts e.message
48
+ @stderr.puts parser
49
+ exit(1)
50
+ end
51
+ end
52
+ end
53
+
@@ -0,0 +1,46 @@
1
+ require 'optparse'
2
+ require 'terminal-table'
3
+
4
+ module Cmd
5
+ class TodayTasks
6
+ def initialize(db, logger, stdout, stderr)
7
+ @db = db
8
+ @logger = logger
9
+ @stdout = stdout
10
+ @stderr = stderr
11
+ end
12
+
13
+ def call(argv)
14
+ _ = parse(argv)
15
+ todos = @db[:todos].where(due_date: Date.today).all
16
+ table = Terminal::Table.new do |t|
17
+ t.headings = ["ID", "Priority", "Name", "Done", "Due Date", "Completed On"]
18
+ todos.each do |todo|
19
+ t.add_row [todo[:id], todo[:priority], todo[:name], todo[:done], todo[:due_date].strftime(DATE_FORMAT), todo[:completed_on] && todo[:completed_on].strftime(DATE_FORMAT)]
20
+ end
21
+ end
22
+
23
+ @stdout.puts(table)
24
+ end
25
+
26
+ private
27
+
28
+ def parse(args)
29
+ options = {}
30
+ parser = OptionParser.new do |opts|
31
+ opts.banner = "Usage: ineedto today"
32
+
33
+ opts.on("-h", "--help", "Show help and exit") do
34
+ @stdout.puts opts
35
+ exit(0)
36
+ end
37
+ end
38
+ parser.parse!(args)
39
+ options
40
+ rescue => e
41
+ @stderr.puts e.message
42
+ @stderr.puts parser
43
+ exit(1)
44
+ end
45
+ end
46
+ end
metadata ADDED
@@ -0,0 +1,110 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ineedto
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Filip Kostovski
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-06-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: dry-validation
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 1.5.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 1.5.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: sequel
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 5.33.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 5.33.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: sqlite3
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 1.4.2
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 1.4.2
55
+ - !ruby/object:Gem::Dependency
56
+ name: terminal-table
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 1.8.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 1.8.0
69
+ description: Manages tasks by providing interface to crud and search for tasks
70
+ email: github.sirfilip@gmail.com
71
+ executables:
72
+ - ineedto
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - bin/ineedto
77
+ - lib/cmd.rb
78
+ - lib/cmd/clean.rb
79
+ - lib/cmd/complete.rb
80
+ - lib/cmd/completed.rb
81
+ - lib/cmd/list.rb
82
+ - lib/cmd/new.rb
83
+ - lib/cmd/pending.rb
84
+ - lib/cmd/root.rb
85
+ - lib/cmd/search.rb
86
+ - lib/cmd/today.rb
87
+ homepage: https://rubygems.org/gems/ineedto
88
+ licenses:
89
+ - MIT
90
+ metadata: {}
91
+ post_install_message:
92
+ rdoc_options: []
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ requirements: []
106
+ rubygems_version: 3.1.2
107
+ signing_key:
108
+ specification_version: 4
109
+ summary: Simple cmd task organizer
110
+ test_files: []