ineedto 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []