xcli 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.
- data/bin/xcli +5 -0
- data/lib/xcli/cli.rb +167 -0
- data/lib/xcli/configuration.rb +27 -0
- data/lib/xcli.rb +11 -0
- metadata +96 -0
data/bin/xcli
ADDED
data/lib/xcli/cli.rb
ADDED
@@ -0,0 +1,167 @@
|
|
1
|
+
module Xcli
|
2
|
+
class Cli < Thor
|
3
|
+
include CommandLineReporter
|
4
|
+
include HTTParty
|
5
|
+
|
6
|
+
def self.configuration
|
7
|
+
@configuration ||= Xcli::Configuration.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def configuration
|
11
|
+
self.class.configuration
|
12
|
+
end
|
13
|
+
|
14
|
+
base_uri configuration.url
|
15
|
+
|
16
|
+
desc 'clients', 'list clients'
|
17
|
+
method_option :initials, :type => :string
|
18
|
+
def clients
|
19
|
+
report(:message => 'Loading Clients...', :complete => '', :indent_size => 8) do
|
20
|
+
require_login
|
21
|
+
clients = self.class.get("/api/v1/clients", :body => {:auth_token => @token, :initials => options[:initials]})
|
22
|
+
table(:border => true) do
|
23
|
+
row do
|
24
|
+
column('Initials', :width => 20)
|
25
|
+
column('NAME', :width => 20)
|
26
|
+
end
|
27
|
+
clients.each do |client|
|
28
|
+
row do
|
29
|
+
column(client["initials"])
|
30
|
+
column(client["name"])
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
desc 'projects', 'list projects'
|
38
|
+
method_option :client_initials, :type => :string
|
39
|
+
def projects
|
40
|
+
report(:message => 'Loading projects...', :complete => '', :indent_size => 8) do
|
41
|
+
require_login
|
42
|
+
projects = self.class.get("/api/v1/projects", :body => {:auth_token => @token, :client_initials => options[:client_initials]})
|
43
|
+
table(:border => true) do
|
44
|
+
row do
|
45
|
+
column('NAME', :width => 20)
|
46
|
+
end
|
47
|
+
projects.each do |project|
|
48
|
+
row do
|
49
|
+
column(project["name"])
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
desc 'ticket', 'show current ticket based on git repo and branch'
|
57
|
+
def ticket
|
58
|
+
report(:message => 'Loading current ticket...', :complete => '', :indent_size => 8) do
|
59
|
+
table(:border => true) do
|
60
|
+
row do
|
61
|
+
column('NAME', :width => 20)
|
62
|
+
column('ESTIMATED HOURS', :width => 20)
|
63
|
+
column('HOURS WORKED', :width => 20)
|
64
|
+
column('PERCENTAGE COMPLETE', :width => 20)
|
65
|
+
end
|
66
|
+
row do
|
67
|
+
column(current_ticket["name"])
|
68
|
+
column(current_ticket["estimated_hours"])
|
69
|
+
column(current_ticket["hours"])
|
70
|
+
column("#{current_ticket["percentage_complete"].to_s}%")
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
desc 'new_ticket', 'create new ticket based on git repo and branch'
|
77
|
+
method_options :estimated_hours => :numeric, :name => :string, :message => :string
|
78
|
+
def new_ticket
|
79
|
+
report(:message => 'Creating new ticket...', :complete => '', :indent_size => 8) do
|
80
|
+
require_login
|
81
|
+
status = self.class.post("/api/v1/tickets", :body => {:ticket => {:project_id => current_project["id"], :estimated_hours => options[:estimated_hours], :description => options[:message], :git_branch => current_branch_name, :name => options[:name]}, :auth_token => @token})
|
82
|
+
table(:border => true) do
|
83
|
+
row do
|
84
|
+
column('NAME', :width => 20)
|
85
|
+
column('ESTIMATED HOURS', :width => 20)
|
86
|
+
column('HOURS WORKED', :width => 20)
|
87
|
+
column('PERCENTAGE COMPLETE', :width => 20)
|
88
|
+
end
|
89
|
+
row do
|
90
|
+
column(current_ticket["name"])
|
91
|
+
column(current_ticket["estimated_hours"])
|
92
|
+
column(current_ticket["hours"])
|
93
|
+
column("#{current_ticket["percentage_complete"].to_s}%")
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
desc 'enter_time', 'enter time to current ticket based on git repo and branch'
|
100
|
+
method_options :hours => :numeric, :message => :string
|
101
|
+
def enter_time
|
102
|
+
report(:message => 'Creating work unit...', :complete => '', :indent_size => 8) do
|
103
|
+
require_login
|
104
|
+
status = self.class.post("/api/v1/work_units", :body => {:work_unit => {:ticket_id => current_ticket["id"], :hours => options[:hours], :hours_type => "Normal", :description => options[:message], :scheduled_at => Time.now.to_s}, :auth_token => @token})
|
105
|
+
if status["success"]
|
106
|
+
puts "Time Entered"
|
107
|
+
else
|
108
|
+
puts "It didn't work"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
desc 'status', 'show information about the current user'
|
114
|
+
def status
|
115
|
+
report(:message => 'Loading status...', :complete => '', :indent_size => 8) do
|
116
|
+
require_login
|
117
|
+
table(:border => true) do
|
118
|
+
row do
|
119
|
+
column('USERNAME', :width => 20)
|
120
|
+
column('CURRENT HOURS', :width => 20)
|
121
|
+
column('OFFSET', :width => 20)
|
122
|
+
end
|
123
|
+
row do
|
124
|
+
column(configuration.email)
|
125
|
+
column(@current_hours)
|
126
|
+
column(@offset)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
private
|
133
|
+
|
134
|
+
def current_branch_name
|
135
|
+
r = Grit::Repo.new('.')
|
136
|
+
r.head.name
|
137
|
+
end
|
138
|
+
|
139
|
+
def git_repo_url
|
140
|
+
r = Grit::Repo.new('.')
|
141
|
+
r.config["remote.origin.url"]
|
142
|
+
end
|
143
|
+
|
144
|
+
def require_login
|
145
|
+
login unless @token
|
146
|
+
end
|
147
|
+
|
148
|
+
def login
|
149
|
+
login_response = self.class.post("/api/v1/tokens", :body => {:email => configuration.email, :password => configuration.password})
|
150
|
+
@token = login_response["token"]
|
151
|
+
@current_hours = login_response["current_hours"]
|
152
|
+
@offset = login_response["offset"]
|
153
|
+
end
|
154
|
+
|
155
|
+
def current_ticket
|
156
|
+
return @current_ticket if @current_ticket
|
157
|
+
require_login
|
158
|
+
@current_ticket = self.class.get("/api/v1/tickets", :body => {:auth_token => @token, :repo_url => git_repo_url, :branch => current_branch_name}).first
|
159
|
+
end
|
160
|
+
|
161
|
+
def current_project
|
162
|
+
return @current_project if @current_project
|
163
|
+
require_login
|
164
|
+
@current_project = self.class.get("/api/v1/projects", :body => {:auth_token => @token, :git_repo_url => git_repo_url}).first
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Xcli
|
2
|
+
class Configuration
|
3
|
+
attr_accessor :url, :email, :password
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
load_config
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def load_config
|
12
|
+
config_file = File.expand_path(File.join(ENV["HOME"],'/.xronorc'))
|
13
|
+
if File.exist? config_file
|
14
|
+
@config = YAML.load_file config_file
|
15
|
+
else
|
16
|
+
@config = {}
|
17
|
+
end
|
18
|
+
|
19
|
+
self.url = @config.fetch('url', 'http://127.0.0.1:3000')
|
20
|
+
self.email = @config.fetch('email', 'dev@xrono.org')
|
21
|
+
self.password = @config.fetch('password', '123456')
|
22
|
+
|
23
|
+
@config
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
data/lib/xcli.rb
ADDED
metadata
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: xcli
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Adam Gamble
|
9
|
+
- Ben Holley
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2012-01-30 00:00:00.000000000Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: thor
|
17
|
+
requirement: &70302048454240 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ~>
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.14.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *70302048454240
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: command_line_reporter
|
28
|
+
requirement: &70302048453760 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.1'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *70302048453760
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: grit
|
39
|
+
requirement: &70302048453300 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ~>
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 2.4.1
|
45
|
+
type: :runtime
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: *70302048453300
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: httparty
|
50
|
+
requirement: &70302048452840 !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ~>
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 0.8.1
|
56
|
+
type: :runtime
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *70302048452840
|
59
|
+
description: Xrono Command Line Client
|
60
|
+
email:
|
61
|
+
- adamgamble@gmail.com
|
62
|
+
- ben@isotope11.com
|
63
|
+
executables:
|
64
|
+
- xcli
|
65
|
+
extensions: []
|
66
|
+
extra_rdoc_files: []
|
67
|
+
files:
|
68
|
+
- bin/xcli
|
69
|
+
- lib/xcli.rb
|
70
|
+
- lib/xcli/configuration.rb
|
71
|
+
- lib/xcli/cli.rb
|
72
|
+
homepage: http://rubygems.org/gems/example
|
73
|
+
licenses: []
|
74
|
+
post_install_message:
|
75
|
+
rdoc_options: []
|
76
|
+
require_paths:
|
77
|
+
- lib
|
78
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
79
|
+
none: false
|
80
|
+
requirements:
|
81
|
+
- - ! '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ! '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
requirements: []
|
91
|
+
rubyforge_project:
|
92
|
+
rubygems_version: 1.8.10
|
93
|
+
signing_key:
|
94
|
+
specification_version: 3
|
95
|
+
summary: Xrono Command Line Client
|
96
|
+
test_files: []
|