assembla_cli 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|