pttool 0.0.1 → 0.0.2
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/lib/pttool/application.rb +48 -13
- data/lib/pttool/helper.rb +19 -0
- data/lib/pttool/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3bf5a304fdae3f4e070674b98371db20a4729107
|
4
|
+
data.tar.gz: a218731a02d3ca720b8483f2e60d2692d69d965a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f0ea3cf189c58660d8ce3572ddc1e8f785fbaaeca6f92da046db9ff275ef746d7086ef6eef8569e37eb99f54f9734e0d5c0acd4dba4ec77b1a87c13cb1870c98
|
7
|
+
data.tar.gz: 096cf82fd99f7984e8f430af67c83f48337cb2f9a9c739fb9b88ec2b02d6652390d3ca980b36342c2eaad1cb352a8904c4010004c2fd750dd0e6574c2aada352
|
data/lib/pttool/application.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'docopt'
|
2
2
|
require_relative 'error'
|
3
|
+
require_relative 'helper'
|
3
4
|
require_relative 'version'
|
4
5
|
|
5
6
|
module PTTool
|
@@ -10,10 +11,12 @@ module PTTool
|
|
10
11
|
|
11
12
|
Usage:
|
12
13
|
pttool projects [--sort=<key>] [--members]
|
14
|
+
pttool sync PROJECT... [--force]
|
13
15
|
pttool -h | --help
|
14
16
|
pttool --version
|
15
17
|
|
16
18
|
Options:
|
19
|
+
--force Do not prompt for confirmation [default: false].
|
17
20
|
--members Output the number of members [default: false].
|
18
21
|
--sort=<key> Sort output by name or id [default: name].
|
19
22
|
-h --help Show this information.
|
@@ -25,28 +28,47 @@ module PTTool
|
|
25
28
|
end
|
26
29
|
|
27
30
|
def cmd_projects(members, sort)
|
28
|
-
|
29
|
-
|
30
|
-
end
|
31
|
+
valid = %w(name id)
|
32
|
+
raise Docopt::Exit, 'invalid sort option' unless valid.include?(sort)
|
31
33
|
PTTool.client.projects.sort_by { |k| k.send(sort) }.each do |project|
|
32
34
|
member_extra = " (#{project.memberships.size} members)" if members
|
33
35
|
puts format("%8s: #{project.name}#{member_extra}", project.id)
|
34
36
|
end
|
35
37
|
end
|
36
38
|
|
37
|
-
def
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
39
|
+
def cmd_sync(projects, force)
|
40
|
+
raise Docopt::Exit, 'must list at least two projects' if projects.size < 2
|
41
|
+
|
42
|
+
require 'set'
|
43
|
+
all_people_ids = Set.new
|
44
|
+
by_project = {}
|
45
|
+
|
46
|
+
PTTool.client.projects.each do |project|
|
47
|
+
next unless projects.include?(project.name)
|
48
|
+
projects.delete(project.name)
|
49
|
+
|
50
|
+
all_people_ids.merge(
|
51
|
+
# tracker_api doesn't properly compare People objects so we'll only
|
52
|
+
# use their id (for now)
|
53
|
+
by_project[project] = project.memberships.map(&:person).map(&:id))
|
45
54
|
end
|
46
|
-
|
55
|
+
|
56
|
+
puts "Could not match: #{projects.join(', ')}" unless projects.empty?
|
57
|
+
raise Error, 'too few matching projects' if by_project.size < 2
|
58
|
+
|
59
|
+
by_project.each do |project, people_ids|
|
60
|
+
to_add = all_people_ids - people_ids
|
61
|
+
next if to_add.empty? || (!force && !Helper.prompt(
|
62
|
+
"Do you want to add #{to_add.size} people to #{project.name}?"))
|
63
|
+
to_add.each { |person_id| Helper.add_membership(project, person_id) }
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def run
|
68
|
+
handle_args(Docopt.docopt(DOC, version: VERSION))
|
47
69
|
rescue Docopt::Exit => exc
|
48
70
|
exit_with_status(exc.message, exc.class.usage != '')
|
49
|
-
rescue => exc
|
71
|
+
rescue Error => exc
|
50
72
|
exit_with_status(exc.message)
|
51
73
|
end
|
52
74
|
|
@@ -56,5 +78,18 @@ module PTTool
|
|
56
78
|
puts msg
|
57
79
|
@exit_status == 0 && condition ? 1 : @exit_status
|
58
80
|
end
|
81
|
+
|
82
|
+
def handle_args(options)
|
83
|
+
if options['projects']
|
84
|
+
cmd_projects(options['--members'], options['--sort'])
|
85
|
+
elsif options['sync']
|
86
|
+
cmd_sync(options['PROJECT'], options['--force'])
|
87
|
+
else
|
88
|
+
commands = options.find_all { |x| x[1] == true }.map { |x| x[0] }
|
89
|
+
puts "Unhandled command(s): #{commands}"
|
90
|
+
@exit_status = 2
|
91
|
+
end
|
92
|
+
@exit_status
|
93
|
+
end
|
59
94
|
end
|
60
95
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require_relative 'error'
|
2
|
+
|
3
|
+
module PTTool
|
4
|
+
# Module for helper functions.
|
5
|
+
module Helper
|
6
|
+
def self.prompt(msg = 'Do you want to continue?')
|
7
|
+
print("#{msg} [(y)es|(N)o|(a)bort] ")
|
8
|
+
response = STDIN.gets.strip.downcase
|
9
|
+
raise Error, 'aborted' if %w(a abort).include?(response)
|
10
|
+
%w(y yes true 1).include?(response)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.add_membership(project, person_id, role = 'member')
|
14
|
+
data = PTTool.client.post("/projects/#{project.id}/memberships",
|
15
|
+
params: { person_id: person_id, role: role })
|
16
|
+
puts data.body
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/pttool/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pttool
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bryce Boe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: docopt
|
@@ -52,6 +52,7 @@ files:
|
|
52
52
|
- lib/pttool/application.rb
|
53
53
|
- lib/pttool/client.rb
|
54
54
|
- lib/pttool/error.rb
|
55
|
+
- lib/pttool/helper.rb
|
55
56
|
- lib/pttool/pttool_module.rb
|
56
57
|
- lib/pttool/version.rb
|
57
58
|
homepage: https://github.com/bboe/pttool
|