assembla_cli 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
File without changes
@@ -0,0 +1,7 @@
1
+ init.rb
2
+ *.gem
3
+ .bundle
4
+ Gemfile.lock
5
+ pkg/*
6
+ .rvmrc
7
+
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+ # Specify your gem's dependencies in assembla_cli.gemspec
3
+ gemspec
@@ -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
@@ -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
@@ -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
+
@@ -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
@@ -0,0 +1,3 @@
1
+ module AssemblaCli
2
+ VERSION = "0.0.1"
3
+ 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
+