idonethis-cli 0.12.0 → 0.13.0
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/.gitignore +11 -11
- data/.travis.yml +4 -4
- data/Gemfile +3 -3
- data/LICENSE.txt +21 -21
- data/README.md +99 -99
- data/Rakefile +7 -7
- data/bin/console +14 -14
- data/bin/idonethis +13 -13
- data/bin/setup +7 -7
- data/idonethis-cli.gemspec +36 -35
- data/lib/adapters/cli.rb +92 -87
- data/lib/adapters/git_adapter.rb +18 -0
- data/lib/adapters/internet.rb +14 -14
- data/lib/adapters/io/directory_info.rb +33 -0
- data/lib/adapters/settings.rb +19 -19
- data/lib/adapters/views/cli.rb +36 -36
- data/lib/idonethis.rb +10 -10
- data/lib/idonethis/cli/version.rb +5 -5
- data/lib/idonethis/index.rb +26 -26
- data/lib/idonethis/settings_file.rb +11 -11
- data/lib/idonethis/use_cases/config.rb +40 -40
- data/lib/idonethis/use_cases/git.rb +48 -74
- data/lib/idonethis/use_cases/list.rb +65 -65
- data/lib/idonethis/use_cases/new.rb +28 -28
- data/lib/idonethis/use_cases/teams.rb +49 -49
- metadata +32 -16
data/lib/adapters/cli.rb
CHANGED
@@ -1,87 +1,92 @@
|
|
1
|
-
require 'internet'
|
2
|
-
require 'views/cli'
|
3
|
-
require 'use_cases/new'
|
4
|
-
require 'use_cases/list'
|
5
|
-
require 'settings_file'
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
1
|
+
require 'internet'
|
2
|
+
require 'views/cli'
|
3
|
+
require 'use_cases/new'
|
4
|
+
require 'use_cases/list'
|
5
|
+
require 'settings_file'
|
6
|
+
require 'io/directory_info'
|
7
|
+
|
8
|
+
module Idonethis::Adapters
|
9
|
+
class Cli
|
10
|
+
class << self
|
11
|
+
def run(argv={})
|
12
|
+
args = parse(argv)
|
13
|
+
|
14
|
+
command,*rest = argv
|
15
|
+
|
16
|
+
command = "help" unless command
|
17
|
+
|
18
|
+
log = choose_log(args)
|
19
|
+
|
20
|
+
args.merge!({ opts: rest, log: log, internet: Idonethis::Adapters::Internet, view: Idonethis::Adapters::Views::Cli::List.method(:apply)})
|
21
|
+
credential = Settings.credential
|
22
|
+
|
23
|
+
log.call "args: #{args}, command: #{command}, rest: #{rest}"
|
24
|
+
|
25
|
+
use_case = choose command.to_sym, rest
|
26
|
+
|
27
|
+
unless use_case
|
28
|
+
log.call "No command <#{command.to_sym}> found"
|
29
|
+
return
|
30
|
+
end
|
31
|
+
|
32
|
+
use_case.call credential, args
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def choose(command, opts)
|
38
|
+
use_cases = {
|
39
|
+
list: Idonethis::UseCases::List.method(:apply),
|
40
|
+
new: Idonethis::UseCases::New.method(:apply),
|
41
|
+
config: Idonethis::UseCases::Config.method(:apply),
|
42
|
+
git: ->(_, args) { Idonethis::UseCases::Git.apply(_, args.merge(git: Idonethis::Adapters::Git, view: ->(msg) { puts msg }, fs: Idonethis::Adapters::IO::DirectoryInfo))},
|
43
|
+
help: ->(credential, args) { puts "TODO: implement help" }
|
44
|
+
}
|
45
|
+
|
46
|
+
if command == :list && opts.include?("teams")
|
47
|
+
return ->(credential, args) {
|
48
|
+
Idonethis::UseCases::Teams.apply(credential, args.merge(view: Idonethis::Adapters::Views::Cli::Teams.method(:apply)))
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
use_case = use_cases[command]
|
53
|
+
end
|
54
|
+
|
55
|
+
def choose_log(args={})
|
56
|
+
args[:verbose] == true ? ->(msg){puts "[LOG] #{msg}"} : ->(_){}
|
57
|
+
end
|
58
|
+
|
59
|
+
def parse(argv={})
|
60
|
+
args = {}
|
61
|
+
|
62
|
+
require 'optparse'
|
63
|
+
|
64
|
+
OptionParser.new do |opts|
|
65
|
+
opts.banner = "Usage: command [options]"
|
66
|
+
|
67
|
+
opts.on("-v", "--verbose", "Run verbosely") do |v|
|
68
|
+
args[:verbose] = v
|
69
|
+
end
|
70
|
+
|
71
|
+
opts.on("-m MESSAGE", "Message") do |m|
|
72
|
+
args[:message] = m
|
73
|
+
end
|
74
|
+
|
75
|
+
opts.on("-d", "Dry run") do |_|
|
76
|
+
args[:dry_run] = true
|
77
|
+
end
|
78
|
+
|
79
|
+
opts.on("-t TEAM", "--team TEAM" "Run against this team") do |team_name|
|
80
|
+
args[:team] = team_name
|
81
|
+
end
|
82
|
+
|
83
|
+
opts.on("-s WHEN", "--since WHEN" "Show git commits since when") do |value|
|
84
|
+
args[:since] = value
|
85
|
+
end
|
86
|
+
end.parse!
|
87
|
+
|
88
|
+
args
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Idonethis::Adapters
|
2
|
+
module Git
|
3
|
+
class << self
|
4
|
+
def commits(dir, since)
|
5
|
+
require 'git'
|
6
|
+
|
7
|
+
since_when = case since
|
8
|
+
when 'yesterday'
|
9
|
+
'1am yesterday'
|
10
|
+
else
|
11
|
+
'1am'
|
12
|
+
end
|
13
|
+
|
14
|
+
::Git.open(dir).log.since(since_when)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/adapters/internet.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
|
-
module Idonethis::Adapters
|
2
|
-
module Internet
|
3
|
-
class << self
|
4
|
-
require 'restclient'
|
5
|
-
|
6
|
-
def get(url, headers = {}, body = {})
|
7
|
-
RestClient.get(url, headers)
|
8
|
-
end
|
9
|
-
|
10
|
-
def post(url, headers = {}, body = {})
|
11
|
-
RestClient.post(url, body, headers)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
1
|
+
module Idonethis::Adapters
|
2
|
+
module Internet
|
3
|
+
class << self
|
4
|
+
require 'restclient'
|
5
|
+
|
6
|
+
def get(url, headers = {}, body = {})
|
7
|
+
RestClient.get(url, headers)
|
8
|
+
end
|
9
|
+
|
10
|
+
def post(url, headers = {}, body = {})
|
11
|
+
RestClient.post(url, body, headers)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
15
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Idonethis::Adapters
|
2
|
+
module IO
|
3
|
+
module DirectoryInfo
|
4
|
+
class << self
|
5
|
+
def modified_today?(dir)
|
6
|
+
time,now = File.ctime(dir),Time.now
|
7
|
+
|
8
|
+
_in(dir).select{|it| any_file_inside_changed?(it, time, now) }
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def any_file_inside_changed?(dir, time, now)
|
14
|
+
Dir["#{dir}/**/**"].each do |file|
|
15
|
+
return true if today?(File.ctime(file), now)
|
16
|
+
end
|
17
|
+
return false
|
18
|
+
end
|
19
|
+
|
20
|
+
def today?(time, now)
|
21
|
+
time.year == now.year && time.month == now.month && time.day == now.day
|
22
|
+
end
|
23
|
+
|
24
|
+
def _in(dir)
|
25
|
+
Dir.entries(dir).
|
26
|
+
reject{|it| ["..", "."].include?(it) }.
|
27
|
+
select{|it| File.directory?(File.join(dir, it))}.
|
28
|
+
map{ |it| File.expand_path(File.join(dir, it))}
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/adapters/settings.rb
CHANGED
@@ -1,20 +1,20 @@
|
|
1
|
-
module Idonethis::Adapters
|
2
|
-
module Settings
|
3
|
-
class << self
|
4
|
-
def credential
|
5
|
-
from_disk || from_env
|
6
|
-
end
|
7
|
-
|
8
|
-
private
|
9
|
-
|
10
|
-
def from_disk
|
11
|
-
require 'yaml'
|
12
|
-
YAML.load_file Idonethis::SettingsFile.path if Idonethis::SettingsFile.exists?
|
13
|
-
end
|
14
|
-
|
15
|
-
def from_env
|
16
|
-
{ token: ENV["TOKEN"], team: ENV["TEAM"] }
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
1
|
+
module Idonethis::Adapters
|
2
|
+
module Settings
|
3
|
+
class << self
|
4
|
+
def credential
|
5
|
+
from_disk || from_env
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def from_disk
|
11
|
+
require 'yaml'
|
12
|
+
YAML.load_file Idonethis::SettingsFile.path if Idonethis::SettingsFile.exists?
|
13
|
+
end
|
14
|
+
|
15
|
+
def from_env
|
16
|
+
{ token: ENV["TOKEN"], team: ENV["TEAM"] }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
20
|
end
|
data/lib/adapters/views/cli.rb
CHANGED
@@ -1,36 +1,36 @@
|
|
1
|
-
module Idonethis::Adapters
|
2
|
-
module Views
|
3
|
-
module Cli
|
4
|
-
module List
|
5
|
-
class << self
|
6
|
-
def apply(dones=[])
|
7
|
-
dones.select{|it| it["is_goal"] == false}.each_with_index do |d,i|
|
8
|
-
#{
|
9
|
-
# "id"=>22609300, "created"=>"2015-09-09T06:26:07.120", "updated"=>"2015-09-19T13:00:03.570", "markedup_text"=>"fix api smoke", "done_date"=>"2015-09-20", "owner"=>"ben.biddington",
|
10
|
-
# "team_short_name"=>"benbiddington-personal", "tags"=>[], "likes"=>[], "comments"=>[], "meta_data"=>{}, "is_goal"=>true, "goal_completed"=>false,
|
11
|
-
# "url"=>"https://idonethis.com/api/v0.1/dones/22609300/", "team"=>"https://idonethis.com/api/v0.1/teams/benbiddington-personal/", "raw_text"=>"[ ] fix api smoke", "permalink"=>"https://idonethis.com/done/22609300/"}
|
12
|
-
# puts d.inspect
|
13
|
-
printf("%-5s", i+1); print(%Q{#{d["created"]} #{d["team_short_name"]} }); printf("%-20s", d["owner"]); print(%Q{ -- #{d["raw_text"].slice(0,150)}}); print("\n")
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
module Teams
|
20
|
-
class << self
|
21
|
-
def apply(teams=[])
|
22
|
-
teams.select.each_with_index do |d,i|
|
23
|
-
#{
|
24
|
-
# "updated"=>"2015-05-20T23:53:58.831", "created"=>"2015-05-20T23:53:48.357",
|
25
|
-
# "done_count"=>138,
|
26
|
-
# "url"=>"https://idonethis.com/api/v0.1/teams/benbiddington-personal/",
|
27
|
-
# "name"=>"ben.biddington personal", "short_name"=>"benbiddington-personal",
|
28
|
-
# "dones"=>"https://idonethis.com/api/v0.1/dones/?team=benbiddington-personal", "is_personal"=>true, "permalink"=>"https://idonethis.com/cal/benbiddington-personal/"}
|
29
|
-
printf("%-5s", i+1); print(%Q{#{d["updated"]}}); print(" "); printf("%-30s", d["name"]); printf("%-5s", %Q{(#{d["done_count"]})}); print(" "); print(%Q{#{d["permalink"]}}); print("\n")
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
1
|
+
module Idonethis::Adapters
|
2
|
+
module Views
|
3
|
+
module Cli
|
4
|
+
module List
|
5
|
+
class << self
|
6
|
+
def apply(dones=[])
|
7
|
+
dones.select{|it| it["is_goal"] == false}.each_with_index do |d,i|
|
8
|
+
#{
|
9
|
+
# "id"=>22609300, "created"=>"2015-09-09T06:26:07.120", "updated"=>"2015-09-19T13:00:03.570", "markedup_text"=>"fix api smoke", "done_date"=>"2015-09-20", "owner"=>"ben.biddington",
|
10
|
+
# "team_short_name"=>"benbiddington-personal", "tags"=>[], "likes"=>[], "comments"=>[], "meta_data"=>{}, "is_goal"=>true, "goal_completed"=>false,
|
11
|
+
# "url"=>"https://idonethis.com/api/v0.1/dones/22609300/", "team"=>"https://idonethis.com/api/v0.1/teams/benbiddington-personal/", "raw_text"=>"[ ] fix api smoke", "permalink"=>"https://idonethis.com/done/22609300/"}
|
12
|
+
# puts d.inspect
|
13
|
+
printf("%-5s", i+1); print(%Q{#{d["created"]} #{d["team_short_name"]} }); printf("%-20s", d["owner"]); print(%Q{ -- #{d["raw_text"].slice(0,150)}}); print("\n")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module Teams
|
20
|
+
class << self
|
21
|
+
def apply(teams=[])
|
22
|
+
teams.select.each_with_index do |d,i|
|
23
|
+
#{
|
24
|
+
# "updated"=>"2015-05-20T23:53:58.831", "created"=>"2015-05-20T23:53:48.357",
|
25
|
+
# "done_count"=>138,
|
26
|
+
# "url"=>"https://idonethis.com/api/v0.1/teams/benbiddington-personal/",
|
27
|
+
# "name"=>"ben.biddington personal", "short_name"=>"benbiddington-personal",
|
28
|
+
# "dones"=>"https://idonethis.com/api/v0.1/dones/?team=benbiddington-personal", "is_personal"=>true, "permalink"=>"https://idonethis.com/cal/benbiddington-personal/"}
|
29
|
+
printf("%-5s", i+1); print(%Q{#{d["updated"]}}); print(" "); printf("%-30s", d["name"]); printf("%-5s", %Q{(#{d["done_count"]})}); print(" "); print(%Q{#{d["permalink"]}}); print("\n")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/idonethis.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
require "idonethis/cli/version"
|
2
|
-
|
3
|
-
lib = File.expand_path(File.join(File.dirname(__FILE__), "idonethis"))
|
4
|
-
adapters = File.expand_path(File.join(File.dirname(__FILE__), "adapters"))
|
5
|
-
|
6
|
-
$:.unshift lib
|
7
|
-
$:.unshift adapters
|
8
|
-
|
9
|
-
Dir.glob(File.join(lib, "**", "*.rb")).each {|file| require file}
|
10
|
-
Dir.glob(File.join(adapters, "**", "*.rb")).each {|file| require file}
|
1
|
+
require "idonethis/cli/version"
|
2
|
+
|
3
|
+
lib = File.expand_path(File.join(File.dirname(__FILE__), "idonethis"))
|
4
|
+
adapters = File.expand_path(File.join(File.dirname(__FILE__), "adapters"))
|
5
|
+
|
6
|
+
$:.unshift lib
|
7
|
+
$:.unshift adapters
|
8
|
+
|
9
|
+
Dir.glob(File.join(lib, "**", "*.rb")).each {|file| require file}
|
10
|
+
Dir.glob(File.join(adapters, "**", "*.rb")).each {|file| require file}
|
@@ -1,5 +1,5 @@
|
|
1
|
-
module Idonethis
|
2
|
-
module Cli
|
3
|
-
VERSION = "0.
|
4
|
-
end
|
5
|
-
end
|
1
|
+
module Idonethis
|
2
|
+
module Cli
|
3
|
+
VERSION = "0.13.0"
|
4
|
+
end
|
5
|
+
end
|
data/lib/idonethis/index.rb
CHANGED
@@ -1,27 +1,27 @@
|
|
1
|
-
module Idonethis
|
2
|
-
module Index
|
3
|
-
class << self
|
4
|
-
def dones(params={})
|
5
|
-
%Q{#{dones_base_earl}?#{params.map{|k,v| "#{k}=#{v}"}.join('&')}}
|
6
|
-
end
|
7
|
-
|
8
|
-
def teams()
|
9
|
-
teams_base_earl
|
10
|
-
end
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
def dones_base_earl
|
15
|
-
"#{base_earl}/dones/"
|
16
|
-
end
|
17
|
-
|
18
|
-
def teams_base_earl
|
19
|
-
"#{base_earl}/teams/"
|
20
|
-
end
|
21
|
-
|
22
|
-
def base_earl
|
23
|
-
"https://idonethis.com/api/v0.1"
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
1
|
+
module Idonethis
|
2
|
+
module Index
|
3
|
+
class << self
|
4
|
+
def dones(params={})
|
5
|
+
%Q{#{dones_base_earl}?#{params.map{|k,v| "#{k}=#{v}"}.join('&')}}
|
6
|
+
end
|
7
|
+
|
8
|
+
def teams()
|
9
|
+
teams_base_earl
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def dones_base_earl
|
15
|
+
"#{base_earl}/dones/"
|
16
|
+
end
|
17
|
+
|
18
|
+
def teams_base_earl
|
19
|
+
"#{base_earl}/teams/"
|
20
|
+
end
|
21
|
+
|
22
|
+
def base_earl
|
23
|
+
"https://idonethis.com/api/v0.1"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
27
|
end
|