assembla_cli 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/.assemblarc +0 -0
- data/.gitignore +7 -0
- data/Gemfile +3 -0
- data/README.md +38 -0
- data/Rakefile +1 -0
- data/assembla_cli.gemspec +25 -0
- data/bin/assembla +95 -0
- data/lib/assembla_cli.rb +63 -0
- data/lib/assembla_cli/version.rb +3 -0
- metadata +147 -0
data/.assemblarc
ADDED
File without changes
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
## use cases
|
2
|
+
|
3
|
+
> assembla
|
4
|
+
|
5
|
+
> tickets //returns a table with my tickets
|
6
|
+
|
7
|
+
#number priority status title
|
8
|
+
123 high new just another bug
|
9
|
+
321 low test an easy fix
|
10
|
+
|
11
|
+
> select(123) //sets ticket 123 as the current ticket
|
12
|
+
> open(123) //opens the ticket 123 in the browser for analysis
|
13
|
+
|
14
|
+
> status //lists the possible statusses for the ticket
|
15
|
+
# label
|
16
|
+
0 invalid
|
17
|
+
1 new
|
18
|
+
2 test
|
19
|
+
3 fixed
|
20
|
+
|
21
|
+
> status 2 //sets the current ticket to test
|
22
|
+
> ticket //shows the current ticket summary
|
23
|
+
> comment "some comment or reason i already fixed this before ...."
|
24
|
+
|
25
|
+
> exit //well it exits :P
|
26
|
+
|
27
|
+
## Install
|
28
|
+
|
29
|
+
bundle
|
30
|
+
gem build assembla_cli.gemspec
|
31
|
+
gem i assembla_cli-0.0.1.gem
|
32
|
+
|
33
|
+
# Use
|
34
|
+
|
35
|
+
$ assembla
|
36
|
+
$ assempla Space?> space-name
|
37
|
+
$ assembla> milestones
|
38
|
+
$ assembla> exit
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "assembla_cli/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "assembla_cli"
|
7
|
+
s.version = AssemblaCli::VERSION
|
8
|
+
s.authors = ["azendal", "ktlacaelel", "edgarjs"]
|
9
|
+
s.email = ["azendal@gmail.com", "ktlacaelel@gmail.com", "edgar.js@gmail.com"]
|
10
|
+
s.homepage = "https://github.com/azendal/assembla_cli/"
|
11
|
+
s.summary = %q{A CLI to use Assembla for easy usage}
|
12
|
+
s.description = %q{A CLI to use Assembla for easy usage}
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
|
19
|
+
# specify any dependencies here; for example:
|
20
|
+
s.add_development_dependency "ruby-debug"
|
21
|
+
s.add_runtime_dependency "hirb"
|
22
|
+
s.add_runtime_dependency "hashie"
|
23
|
+
s.add_runtime_dependency "httparty"
|
24
|
+
s.add_runtime_dependency "isna"
|
25
|
+
end
|
data/bin/assembla
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# $:.unshift File.expand_path('../..', __FILE__)
|
4
|
+
require 'assembla_cli'
|
5
|
+
|
6
|
+
# TODO: Prompt for credentials and create this file if not exists
|
7
|
+
# TODO: Move authentication to another class or module
|
8
|
+
username, password = File.read("#{ENV['HOME']}/.assembla_cli").split
|
9
|
+
Assembla.login(username, password)
|
10
|
+
# Assembla.space('space name')
|
11
|
+
# Assembla.my_report('personal report id')
|
12
|
+
|
13
|
+
extend Hirb::Console
|
14
|
+
|
15
|
+
# Statuses dont change a log, so keep them cached to make ticket
|
16
|
+
# listing faster.
|
17
|
+
def status_translations
|
18
|
+
@status_translations ||= Assembla.statuses['ticket_statuses']
|
19
|
+
end
|
20
|
+
|
21
|
+
def milestone_translation
|
22
|
+
@milestone_translation ||= Assembla.milestones['milestones']
|
23
|
+
end
|
24
|
+
|
25
|
+
def clean_cache
|
26
|
+
@milestone_translation
|
27
|
+
@status_translations
|
28
|
+
end
|
29
|
+
|
30
|
+
def priority_string number
|
31
|
+
['', 'Highest (1)', 'High (2)', 'Normal (3)', 'Low (4)', 'Lowest (5)'][number]
|
32
|
+
end
|
33
|
+
|
34
|
+
# Translates a status-id into its status-name equivalent.
|
35
|
+
def status_string number
|
36
|
+
status_translations.each do |hash|
|
37
|
+
if hash['list_order'] == number
|
38
|
+
return hash['name']
|
39
|
+
end
|
40
|
+
end
|
41
|
+
'Unknown'
|
42
|
+
end
|
43
|
+
|
44
|
+
# Translates a milestone-id into its milestone-name equivalent.
|
45
|
+
def milestone_string number
|
46
|
+
milestone_translation.each do |hash|
|
47
|
+
if hash['id'] == number
|
48
|
+
return hash['title']
|
49
|
+
end
|
50
|
+
end
|
51
|
+
'Unknown'
|
52
|
+
end
|
53
|
+
|
54
|
+
def tickets
|
55
|
+
# Prepare table data.
|
56
|
+
headers = ['number', 'priority', 'milestone_id', 'status_name', 'summary']
|
57
|
+
hash = Assembla.my_tickets['tickets']
|
58
|
+
|
59
|
+
# Replace status numbers for status strings
|
60
|
+
# TODO: we might need to send data so overriding is not cool.
|
61
|
+
# So maybe we should manage translations differently.
|
62
|
+
hash.each { |row| row['priority'] = priority_string(row['priority']) }
|
63
|
+
hash.each { |row| row['milestone_id'] = milestone_string(row['milestone_id']) }
|
64
|
+
|
65
|
+
# Print data
|
66
|
+
table = Hirb::Helpers::AutoTable.render(hash, :fields => headers)
|
67
|
+
c = :green
|
68
|
+
table.each_line do |line|
|
69
|
+
c = c == :green ? :yellow : :green
|
70
|
+
puts line.chomp.to_ansi.send(c)
|
71
|
+
end
|
72
|
+
# TODO: Think on how this can be handled better.
|
73
|
+
# clean_cache
|
74
|
+
nil
|
75
|
+
end
|
76
|
+
|
77
|
+
def milestones
|
78
|
+
table Assembla.milestones['milestones'], :fields => ['id', 'title']
|
79
|
+
end
|
80
|
+
|
81
|
+
def open (ticket_id)
|
82
|
+
`open https://www.assembla.com/spaces/breezi/tickets/#{ticket_id}`
|
83
|
+
nil
|
84
|
+
end
|
85
|
+
|
86
|
+
# TODO: Fix this
|
87
|
+
print "assembla Space?> "
|
88
|
+
cmd = gets.chomp
|
89
|
+
Assembla.space(cmd)
|
90
|
+
while cmd != 'exit' do
|
91
|
+
print "assembla> "
|
92
|
+
cmd = gets.chomp
|
93
|
+
send(cmd)
|
94
|
+
end
|
95
|
+
|
data/lib/assembla_cli.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'hirb'
|
3
|
+
require 'hashie'
|
4
|
+
require 'httparty'
|
5
|
+
require 'isna'
|
6
|
+
require "assembla_cli/version"
|
7
|
+
|
8
|
+
module Assembla
|
9
|
+
include HTTParty
|
10
|
+
format :xml
|
11
|
+
base_uri 'assembla.com'
|
12
|
+
|
13
|
+
def self.xml_headers
|
14
|
+
{:headers => {'Accept' => 'application/xml'}}
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.login (login_name, password)
|
18
|
+
@login_name = login_name
|
19
|
+
@password = password
|
20
|
+
|
21
|
+
basic_auth(login_name, password)
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.spaces
|
25
|
+
self.get('/spaces/my_spaces', xml_headers)
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.space (space_name)
|
29
|
+
@current_space = self.get("/spaces/#{space_name}", xml_headers)['space']
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.my_report (report_id)
|
33
|
+
@my_report_id = report_id
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.statuses
|
37
|
+
self.get("/spaces/#{@current_space['id']}/tickets/custom_statuses", xml_headers)
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.users
|
41
|
+
self.get("/spaces/#{@current_space['id']}/users", xml_headers)
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.milestones
|
45
|
+
@statusses ||= get("/spaces/#{@current_space['id']}/milestones/", xml_headers)
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.tickets
|
49
|
+
self.get("/spaces/#{@current_space['id']}/tickets/report/9", xml_headers)
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.my_tickets
|
53
|
+
get("/spaces/#{@current_space['id']}/tickets/custom_report/#{@my_report_id}", xml_headers)
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.custom_reports
|
57
|
+
get("/spaces/#{@current_space['id']}/custom_reports", xml_headers)
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.custom_report (report_id)
|
61
|
+
get("/spaces/#{@current_space['id']}/tickets/custom_report/#{report_id}", xml_headers)
|
62
|
+
end
|
63
|
+
end
|
metadata
ADDED
@@ -0,0 +1,147 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: assembla_cli
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- azendal
|
14
|
+
- ktlacaelel
|
15
|
+
- edgarjs
|
16
|
+
autorequire:
|
17
|
+
bindir: bin
|
18
|
+
cert_chain: []
|
19
|
+
|
20
|
+
date: 2012-01-06 00:00:00 Z
|
21
|
+
dependencies:
|
22
|
+
- !ruby/object:Gem::Dependency
|
23
|
+
name: ruby-debug
|
24
|
+
prerelease: false
|
25
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ">="
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
hash: 3
|
31
|
+
segments:
|
32
|
+
- 0
|
33
|
+
version: "0"
|
34
|
+
type: :development
|
35
|
+
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: hirb
|
38
|
+
prerelease: false
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 3
|
45
|
+
segments:
|
46
|
+
- 0
|
47
|
+
version: "0"
|
48
|
+
type: :runtime
|
49
|
+
version_requirements: *id002
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
name: hashie
|
52
|
+
prerelease: false
|
53
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
hash: 3
|
59
|
+
segments:
|
60
|
+
- 0
|
61
|
+
version: "0"
|
62
|
+
type: :runtime
|
63
|
+
version_requirements: *id003
|
64
|
+
- !ruby/object:Gem::Dependency
|
65
|
+
name: httparty
|
66
|
+
prerelease: false
|
67
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
hash: 3
|
73
|
+
segments:
|
74
|
+
- 0
|
75
|
+
version: "0"
|
76
|
+
type: :runtime
|
77
|
+
version_requirements: *id004
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: isna
|
80
|
+
prerelease: false
|
81
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
hash: 3
|
87
|
+
segments:
|
88
|
+
- 0
|
89
|
+
version: "0"
|
90
|
+
type: :runtime
|
91
|
+
version_requirements: *id005
|
92
|
+
description: A CLI to use Assembla for easy usage
|
93
|
+
email:
|
94
|
+
- azendal@gmail.com
|
95
|
+
- ktlacaelel@gmail.com
|
96
|
+
- edgar.js@gmail.com
|
97
|
+
executables:
|
98
|
+
- assembla
|
99
|
+
extensions: []
|
100
|
+
|
101
|
+
extra_rdoc_files: []
|
102
|
+
|
103
|
+
files:
|
104
|
+
- .assemblarc
|
105
|
+
- .gitignore
|
106
|
+
- Gemfile
|
107
|
+
- README.md
|
108
|
+
- Rakefile
|
109
|
+
- assembla_cli.gemspec
|
110
|
+
- bin/assembla
|
111
|
+
- lib/assembla_cli.rb
|
112
|
+
- lib/assembla_cli/version.rb
|
113
|
+
homepage: https://github.com/azendal/assembla_cli/
|
114
|
+
licenses: []
|
115
|
+
|
116
|
+
post_install_message:
|
117
|
+
rdoc_options: []
|
118
|
+
|
119
|
+
require_paths:
|
120
|
+
- lib
|
121
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ">="
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
hash: 3
|
127
|
+
segments:
|
128
|
+
- 0
|
129
|
+
version: "0"
|
130
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
131
|
+
none: false
|
132
|
+
requirements:
|
133
|
+
- - ">="
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
hash: 3
|
136
|
+
segments:
|
137
|
+
- 0
|
138
|
+
version: "0"
|
139
|
+
requirements: []
|
140
|
+
|
141
|
+
rubyforge_project:
|
142
|
+
rubygems_version: 1.8.10
|
143
|
+
signing_key:
|
144
|
+
specification_version: 3
|
145
|
+
summary: A CLI to use Assembla for easy usage
|
146
|
+
test_files: []
|
147
|
+
|