taskmapper-kanbanpad 0.7.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +14 -15
- data/Gemfile.lock +22 -19
- data/VERSION +1 -1
- data/lib/provider/api-extensions.rb +31 -0
- data/lib/provider/kanbanpad.rb +2 -2
- data/lib/provider/project.rb +4 -0
- data/lib/provider/ticket.rb +31 -32
- data/lib/taskmapper-kanbanpad.rb +1 -1
- data/spec/project_comments_spec.rb +36 -28
- data/spec/projects_spec.rb +39 -44
- data/spec/ticket_comments_spec.rb +44 -38
- data/spec/ticketmaster-kanbanpad_spec.rb +17 -5
- data/spec/tickets_spec.rb +89 -88
- data/taskmapper-kanbanpad.gemspec +4 -6
- metadata +88 -72
data/Gemfile
CHANGED
@@ -1,15 +1,14 @@
|
|
1
|
-
source "http://rubygems.org"
|
2
|
-
# Add dependencies required to use your gem here.
|
3
|
-
# Example:
|
4
|
-
# gem "activesupport", ">= 2.3.5"
|
5
|
-
|
6
|
-
gem "taskmapper", "~> 0.8"
|
7
|
-
# Add dependencies to develop your gem here.
|
8
|
-
# Include everything needed to run rake, tests, features, etc.
|
9
|
-
group :development do
|
10
|
-
gem "rspec", "~> 2.8"
|
11
|
-
gem "
|
12
|
-
gem "
|
13
|
-
gem "
|
14
|
-
|
15
|
-
end
|
1
|
+
source "http://rubygems.org"
|
2
|
+
# Add dependencies required to use your gem here.
|
3
|
+
# Example:
|
4
|
+
# gem "activesupport", ">= 2.3.5"
|
5
|
+
|
6
|
+
gem "taskmapper", "~> 0.8"
|
7
|
+
# Add dependencies to develop your gem here.
|
8
|
+
# Include everything needed to run rake, tests, features, etc.
|
9
|
+
group :development do
|
10
|
+
gem "rspec", "~> 2.8"
|
11
|
+
gem "jeweler", "~> 1.6"
|
12
|
+
gem "simplecov", "~> 0.5", :platforms => :ruby_19
|
13
|
+
gem "rcov", "~> 1.0", :platforms => :ruby_18
|
14
|
+
end
|
data/Gemfile.lock
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
-
activemodel (3.2.
|
5
|
-
activesupport (= 3.2.
|
4
|
+
activemodel (3.2.5)
|
5
|
+
activesupport (= 3.2.5)
|
6
6
|
builder (~> 3.0.0)
|
7
|
-
activeresource (3.2.
|
8
|
-
activemodel (= 3.2.
|
9
|
-
activesupport (= 3.2.
|
10
|
-
activesupport (3.2.
|
7
|
+
activeresource (3.2.5)
|
8
|
+
activemodel (= 3.2.5)
|
9
|
+
activesupport (= 3.2.5)
|
10
|
+
activesupport (3.2.5)
|
11
11
|
i18n (~> 0.6)
|
12
12
|
multi_json (~> 1.0)
|
13
13
|
builder (3.0.0)
|
@@ -15,23 +15,27 @@ GEM
|
|
15
15
|
git (1.2.5)
|
16
16
|
hashie (1.2.0)
|
17
17
|
i18n (0.6.0)
|
18
|
-
jeweler (1.
|
18
|
+
jeweler (1.8.3)
|
19
19
|
bundler (~> 1.0)
|
20
20
|
git (>= 1.2.5)
|
21
21
|
rake
|
22
|
-
|
22
|
+
rdoc
|
23
|
+
json (1.7.3)
|
24
|
+
multi_json (1.3.6)
|
23
25
|
rake (0.9.2.2)
|
24
26
|
rcov (1.0.0)
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
rspec-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
rspec-
|
33
|
-
|
34
|
-
|
27
|
+
rdoc (3.12)
|
28
|
+
json (~> 1.4)
|
29
|
+
rspec (2.10.0)
|
30
|
+
rspec-core (~> 2.10.0)
|
31
|
+
rspec-expectations (~> 2.10.0)
|
32
|
+
rspec-mocks (~> 2.10.0)
|
33
|
+
rspec-core (2.10.1)
|
34
|
+
rspec-expectations (2.10.0)
|
35
|
+
diff-lcs (~> 1.1.3)
|
36
|
+
rspec-mocks (2.10.1)
|
37
|
+
simplecov (0.6.4)
|
38
|
+
multi_json (~> 1.0)
|
35
39
|
simplecov-html (~> 0.5.3)
|
36
40
|
simplecov-html (0.5.3)
|
37
41
|
taskmapper (0.8.0)
|
@@ -43,7 +47,6 @@ PLATFORMS
|
|
43
47
|
ruby
|
44
48
|
|
45
49
|
DEPENDENCIES
|
46
|
-
bundler (~> 1.1)
|
47
50
|
jeweler (~> 1.6)
|
48
51
|
rcov (~> 1.0)
|
49
52
|
rspec (~> 2.8)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.8.0
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module APIExtentions
|
2
|
+
def to_ticket_hash
|
3
|
+
{:id => id,
|
4
|
+
:title => title,
|
5
|
+
:created_at => created_at,
|
6
|
+
:updated_at => updated_at,
|
7
|
+
:wip => wip,
|
8
|
+
:step_id => step_id,
|
9
|
+
:project_slug => project_slug,
|
10
|
+
:finished => finished,
|
11
|
+
:backlog => backlog,
|
12
|
+
:assignee => assigned_to}
|
13
|
+
end
|
14
|
+
|
15
|
+
def update_with(ticket)
|
16
|
+
self.assigned_to = ticket.assignee == 'Nobody' ? '' : ticket.assignee
|
17
|
+
self.title = ticket.title
|
18
|
+
self.task_id = ticket.id
|
19
|
+
self.note = ticket.description
|
20
|
+
self
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
class KanbanpadAPI::Task
|
26
|
+
include APIExtentions
|
27
|
+
end
|
28
|
+
|
29
|
+
class KanbanpadAPI::TaskList
|
30
|
+
include APIExtentions
|
31
|
+
end
|
data/lib/provider/kanbanpad.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
module TaskMapper::Provider
|
2
2
|
# This is the Kanbanpad Provider for taskmapper
|
3
|
-
|
3
|
+
|
4
4
|
module Kanbanpad
|
5
5
|
include TaskMapper::Provider::Base
|
6
6
|
TICKET_API = KanbanpadAPI::Task
|
7
7
|
PROJECT_API = KanbanpadAPI::Project
|
8
|
-
|
8
|
+
|
9
9
|
# This is for cases when you want to instantiate using TaskMapper::Provider::Kanbanpad.new(auth)
|
10
10
|
def self.new(auth = {})
|
11
11
|
TaskMapper.new(:kanbanpad, auth)
|
data/lib/provider/project.rb
CHANGED
data/lib/provider/ticket.rb
CHANGED
@@ -7,24 +7,12 @@ module TaskMapper::Provider
|
|
7
7
|
STEP_API = KanbanpadAPI::Step
|
8
8
|
TASK_COMMENT_API = KanbanpadAPI::TaskCommentCreator
|
9
9
|
|
10
|
-
def initialize(*
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
:finished => object.finished,
|
17
|
-
:title => object.title,
|
18
|
-
:backlog => object.backlog,
|
19
|
-
:assigned_to => object.assigned_to,
|
20
|
-
:wip => object.wip,
|
21
|
-
:project_slug => object.project_slug,
|
22
|
-
:step_id => object.step_id,
|
23
|
-
:urgent => object.urgent}
|
24
|
-
else
|
25
|
-
hash = object
|
26
|
-
end
|
27
|
-
super hash
|
10
|
+
def initialize(*args)
|
11
|
+
case args.first
|
12
|
+
when Hash then super args.first
|
13
|
+
when KanbanpadAPI::Task then super args.first.to_ticket_hash
|
14
|
+
when KanbanpadAPI::TaskList then super args.first.to_ticket_hash
|
15
|
+
else raise ArgumentError.new
|
28
16
|
end
|
29
17
|
end
|
30
18
|
|
@@ -62,28 +50,26 @@ module TaskMapper::Provider
|
|
62
50
|
end
|
63
51
|
end
|
64
52
|
|
65
|
-
def
|
66
|
-
|
67
|
-
options.first.merge!(:assigned_to => options.first.delete(:assignee),
|
68
|
-
:note => options.first[:description])
|
69
|
-
task = API.new(options.first)
|
70
|
-
task.save
|
71
|
-
ticket = self.new task
|
72
|
-
end
|
53
|
+
def save
|
54
|
+
new? ? to_issue.save : update
|
73
55
|
end
|
74
56
|
|
75
|
-
def
|
76
|
-
|
77
|
-
|
57
|
+
def new?
|
58
|
+
project_id.nil? && step_id.nil?
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.create(attributes)
|
62
|
+
ticket = self.new(attributes)
|
63
|
+
ticket if ticket.save
|
78
64
|
end
|
79
65
|
|
80
66
|
def self.find_by_attributes(project_id, attributes = {})
|
81
|
-
|
67
|
+
search_by_attribute(search(project_id), attributes)
|
82
68
|
end
|
83
69
|
|
84
70
|
def self.search(project_id, options = {}, limit = 1000)
|
85
|
-
|
86
|
-
self.new
|
71
|
+
API.find(:all, :params => {:project_id => project_id, :backlog => 'yes', :finished => 'yes'}).collect do |task|
|
72
|
+
self.new task
|
87
73
|
end
|
88
74
|
end
|
89
75
|
|
@@ -122,6 +108,19 @@ module TaskMapper::Provider
|
|
122
108
|
STEP_API.find(self.step_id, :params => {:project_id => self.project_id}).name
|
123
109
|
end
|
124
110
|
|
111
|
+
def find_task
|
112
|
+
task = KanbanpadAPI::Task.find(id, :params => {:project_id => project_id, :step_id => step_id})
|
113
|
+
raise TaskMapper::Exception.new "Task with #{id} was not found" unless task
|
114
|
+
task
|
115
|
+
end
|
116
|
+
|
117
|
+
def update
|
118
|
+
find_task.update_with(self).save
|
119
|
+
end
|
120
|
+
|
121
|
+
def to_issue
|
122
|
+
KanbanpadAPI::TaskList.new(self)
|
123
|
+
end
|
125
124
|
end
|
126
125
|
end
|
127
126
|
end
|
data/lib/taskmapper-kanbanpad.rb
CHANGED
@@ -1,37 +1,45 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
3
|
describe TaskMapper::Provider::Kanbanpad::Comment do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
4
|
+
let(:headers) { {'Authorization' => 'Basic YWJjQGcuY29tOmllODIzZDYzanM='} }
|
5
|
+
let(:wheaders) { headers.merge('Accept' => 'application/json') }
|
6
|
+
let(:pheaders) { headers.merge("Content-Type" => "application/json") }
|
7
|
+
let(:project_id) { 'be74b643b64e3dc79aa0' }
|
8
|
+
let(:comment_id) { '4d684e6f973c7d5648000009' }
|
9
|
+
let(:tm) { TaskMapper.new(:kanbanpad, :username => 'abc@g.com', :password => 'ie823d63js') }
|
10
|
+
let(:comment_class) { TaskMapper::Provider::Kanbanpad::Comment }
|
11
|
+
|
12
|
+
describe "Retrieving comments from a project" do
|
13
|
+
before(:each) do
|
14
|
+
ActiveResource::HttpMock.respond_to do |mock|
|
15
|
+
mock.get '/api/v1/projects/be74b643b64e3dc79aa0.json', wheaders, fixture_for('projects/be74b643b64e3dc79aa0'), 200
|
16
|
+
mock.get '/api/v1/projects/be74b643b64e3dc79aa0/comments.json', wheaders, fixture_for('comments'), 200
|
17
|
+
end
|
13
18
|
end
|
14
|
-
|
15
|
-
@ticket_id = '4cd428c496f0734eef000007'
|
16
|
-
@comment_id = '4d684e6f973c7d5648000009'
|
17
|
-
end
|
19
|
+
let(:project) { tm.project project_id }
|
18
20
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
21
|
+
context "when calling #comments to a project" do
|
22
|
+
subject { project.comments }
|
23
|
+
it { should be_instance_of Array }
|
24
|
+
it { subject.first.should be_an_instance_of comment_class }
|
25
|
+
end
|
23
26
|
end
|
24
27
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
comment.project_id.should be_a String
|
35
|
-
end
|
28
|
+
describe "Creating comments to a project" do
|
29
|
+
before(:each) do
|
30
|
+
ActiveResource::HttpMock.respond_to do |mock|
|
31
|
+
mock.get '/api/v1/projects/be74b643b64e3dc79aa0.json', wheaders, fixture_for('projects/be74b643b64e3dc79aa0'), 200
|
32
|
+
mock.get '/api/v1/projects/be74b643b64e3dc79aa0/comments.json', wheaders, fixture_for('comments'), 200
|
33
|
+
mock.post '/api/v1/projects/be74b643b64e3dc79aa0/comments.json', pheaders, '', 200
|
34
|
+
end
|
35
|
+
end
|
36
|
+
let(:project) { tm.project project_id }
|
36
37
|
|
38
|
+
context "when calling #comment! to a project instance" do
|
39
|
+
subject { project.comment! :body => 'New Project Comment' }
|
40
|
+
it { should be_an_instance_of comment_class }
|
41
|
+
it { subject.project_id.should_not be_nil }
|
42
|
+
it { subject.project_id.should be_a String }
|
43
|
+
end
|
44
|
+
end
|
37
45
|
end
|
data/spec/projects_spec.rb
CHANGED
@@ -1,49 +1,44 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
3
|
describe TaskMapper::Provider::Kanbanpad::Project do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
it "should be able to load projects from an array of ids" do
|
26
|
-
@projects = @taskmapper.projects([@project_id])
|
27
|
-
@projects.should be_an_instance_of(Array)
|
28
|
-
@projects.first.should be_an_instance_of(@klass)
|
29
|
-
@projects.first.slug.should == @project_id
|
30
|
-
end
|
31
|
-
|
32
|
-
it "should be able to load all projects from attributes" do
|
33
|
-
@projects = @taskmapper.projects(:slug => @project_id)
|
34
|
-
@projects.should be_an_instance_of(Array)
|
35
|
-
@projects.first.should be_an_instance_of(@klass)
|
36
|
-
@projects.first.slug.should == @project_id
|
37
|
-
end
|
38
|
-
|
39
|
-
it "should be able to find a project" do
|
40
|
-
@taskmapper.project.should == @klass
|
41
|
-
@taskmapper.project.find(@project_id).should be_an_instance_of(@klass)
|
42
|
-
end
|
43
|
-
|
44
|
-
it "should be able to find a project by slug" do
|
45
|
-
@taskmapper.project(@project_id).should be_an_instance_of(@klass)
|
46
|
-
@taskmapper.project(@project_id).slug.should == @project_id
|
47
|
-
end
|
4
|
+
let(:headers) { {'Authorization' => 'Basic YWJjQGcuY29tOmllODIzZDYzanM='} }
|
5
|
+
let(:wheaders) { headers.merge('Accept' => 'application/json') }
|
6
|
+
let(:project_id) { 'be74b643b64e3dc79aa0' }
|
7
|
+
let(:tm) { TaskMapper.new(:kanbanpad, :username => 'abc@g.com', :password => 'ie823d63js') }
|
8
|
+
let(:project_class) { TaskMapper::Provider::Kanbanpad::Project }
|
9
|
+
|
10
|
+
describe "Retrieving projects" do
|
11
|
+
before(:each) do
|
12
|
+
ActiveResource::HttpMock.respond_to do |mock|
|
13
|
+
mock.get '/api/v1/projects.json', wheaders, fixture_for('projects'), 200
|
14
|
+
mock.get '/api/v1/projects/be74b643b64e3dc79aa0.json', wheaders, fixture_for('projects/be74b643b64e3dc79aa0'), 200
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context "when calling #projects on a TaskMapper instance" do
|
19
|
+
subject { tm.projects }
|
20
|
+
it { should be_an_instance_of Array }
|
21
|
+
it { subject.first.should be_an_instance_of project_class }
|
22
|
+
end
|
48
23
|
|
24
|
+
context "when calling #projects on a TaskMapper instance with an array of project's id" do
|
25
|
+
subject { tm.projects([project_id]) }
|
26
|
+
it { should be_an_instance_of Array }
|
27
|
+
it { subject.first.should be_an_instance_of project_class }
|
28
|
+
it { subject.first.slug.should be_eql project_id }
|
29
|
+
end
|
30
|
+
|
31
|
+
context "when calling #projects on a TaskMapper instance passing a hash of attributes" do
|
32
|
+
subject { tm.projects :slug => project_id }
|
33
|
+
it { should be_an_instance_of Array }
|
34
|
+
it { subject.first.should be_an_instance_of project_class }
|
35
|
+
it { subject.first.slug.should be_eql project_id }
|
36
|
+
end
|
37
|
+
|
38
|
+
context "when calling #project with a project slug" do
|
39
|
+
subject { tm.project project_id }
|
40
|
+
it { should be_an_instance_of project_class }
|
41
|
+
it { subject.slug.should be_eql project_id }
|
42
|
+
end
|
43
|
+
end
|
49
44
|
end
|
@@ -1,55 +1,61 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
3
|
describe TaskMapper::Provider::Kanbanpad::Comment do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
let(:headers) { {'Authorization' => 'Basic YWJjQGcuY29tOmllODIzZDYzanM='} }
|
5
|
+
let(:wheaders) { headers.merge('Accept' => 'application/json') }
|
6
|
+
let(:pheaders) { headers.merge("Content-Type" => "application/json") }
|
7
|
+
let(:project_id) { 'be74b643b64e3dc79aa0' }
|
8
|
+
let(:ticket_id) { '4cd428c496f0734eef000007' }
|
9
|
+
let(:comment_id) { '4d684e6f973c7d5648000009' }
|
10
|
+
let(:tm) { TaskMapper.new(:kanbanpad, :username => 'abc@g.com', :password => 'ie823d63js') }
|
11
|
+
let(:comment_class) { TaskMapper::Provider::Kanbanpad::Comment }
|
12
|
+
|
13
|
+
before(:all) do
|
9
14
|
ActiveResource::HttpMock.respond_to do |mock|
|
10
15
|
mock.get '/api/v1/projects/be74b643b64e3dc79aa0.json', wheaders, fixture_for('projects/be74b643b64e3dc79aa0'), 200
|
11
|
-
mock.get '/api/v1/projects/be74b643b64e3dc79aa0/tasks.json', wheaders, fixture_for('tasks'), 200
|
12
|
-
mock.get '/api/v1/projects/be74b643b64e3dc79aa0/tasks.json?backlog=yes&finished=yes', wheaders, fixture_for('tasks'), 200
|
13
16
|
mock.get '/api/v1/projects/be74b643b64e3dc79aa0/tasks/4cd428c496f0734eef000007.json', wheaders, fixture_for('tasks/4cd428c496f0734eef000007'), 200
|
14
17
|
mock.get '/api/v1/projects/be74b643b64e3dc79aa0/tasks/4cd428c496f0734eef000007/comments.json', wheaders, fixture_for('comments'), 200
|
15
|
-
mock.post '/api/v1/projects/be74b643b64e3dc79aa0/steps/4dc312f49bd0ff6c37000040/tasks/4cd428c496f0734eef000007/comments.json', pheaders, fixture_for('comments/4ef2719bf17365000110df9e'), 200
|
16
18
|
end
|
17
|
-
@project_id = 'be74b643b64e3dc79aa0'
|
18
|
-
@ticket_id = '4cd428c496f0734eef000007'
|
19
|
-
@comment_id = '4d684e6f973c7d5648000009'
|
20
19
|
end
|
20
|
+
let(:project) { tm.project project_id }
|
21
|
+
let(:ticket) { project.ticket ticket_id }
|
21
22
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
23
|
+
describe "Retrieving ticket comments" do
|
24
|
+
context "when calling #comments to a ticket instance" do
|
25
|
+
subject { ticket.comments }
|
26
|
+
it { should be_an_instance_of Array }
|
27
|
+
it { subject.first.should be_an_instance_of comment_class }
|
28
|
+
end
|
28
29
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
30
|
+
context "when calling #comments with an array of comments id's" do
|
31
|
+
subject { ticket.comments [comment_id] }
|
32
|
+
it { should be_an_instance_of Array }
|
33
|
+
it { subject.first.should be_an_instance_of comment_class }
|
34
|
+
it { subject.first.id.should be_eql comment_id }
|
35
|
+
end
|
34
36
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
37
|
+
context "when calling #comments with a hash attributes" do
|
38
|
+
subject { ticket.comments :id => comment_id }
|
39
|
+
it { should be_an_instance_of Array }
|
40
|
+
it { subject.first.should be_an_instance_of comment_class }
|
41
|
+
it { subject.first.id.should be_eql comment_id }
|
42
|
+
end
|
40
43
|
|
41
|
-
it "should be able to load all comments based on attributes" do
|
42
|
-
@comments = @ticket.comments(:id => @comment_id)
|
43
|
-
@comments.should be_an_instance_of(Array)
|
44
|
-
@comments.first.should be_an_instance_of(@klass)
|
45
44
|
end
|
46
45
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
46
|
+
describe "Comment creation to a ticket" do
|
47
|
+
before(:each) do
|
48
|
+
ActiveResource::HttpMock.respond_to do |mock|
|
49
|
+
mock.post '/api/v1/projects/be74b643b64e3dc79aa0/steps/4dc312f49bd0ff6c37000040/tasks/4cd428c496f0734eef000007/comments.json', pheaders, '', 200
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context "when calling #comment! to a ticket instance" do
|
54
|
+
subject { ticket.comment! :body => 'New Ticket' }
|
55
|
+
it { should be_an_instance_of comment_class }
|
56
|
+
it { subject.ticket_id.should_not be_nil }
|
57
|
+
it { subject.ticket_id.should_not be_eql 0 }
|
58
|
+
end
|
53
59
|
end
|
54
|
-
|
60
|
+
|
55
61
|
end
|
@@ -1,11 +1,23 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
3
|
describe "TaskMapper::Provider::Kanbanpad" do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
let(:headers) { {"Authorization"=>"Basic eWVzOm5v", "Accept"=>"application/json"} }
|
5
|
+
|
6
|
+
describe "Provider initializer" do
|
7
|
+
subject { TaskMapper.new :kanbanpad, :username => 'blah', :password => 'let' }
|
8
|
+
it { should_not be_nil }
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "Provider credential validation" do
|
12
|
+
before(:each) do
|
13
|
+
ActiveResource::HttpMock.respond_to do |mock|
|
14
|
+
mock.get '/api/v1/projects.json', headers, fixture_for('projects'), 200
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
subject { TaskMapper.new(:kanbanpad, :username => 'yes', :password => 'no').valid? }
|
19
|
+
it { should be_true }
|
9
20
|
end
|
21
|
+
|
10
22
|
|
11
23
|
end
|
data/spec/tickets_spec.rb
CHANGED
@@ -1,105 +1,106 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
3
|
describe TaskMapper::Provider::Kanbanpad::Ticket do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
mock.get '/api/v1/projects/be74b643b64e3dc79aa0/steps/4dc312f49bd0ff6c37000040.json', wheaders, fixture_for('steps/4dc312f49bd0ff6c37000040'), 200
|
16
|
-
mock.get '/api/v1/projects/be74b643b64e3dc79aa0/tasks/4dc31c4c9bd0ff6c3700004e.json', wheaders, fixture_for('tasks/4dc31c4c9bd0ff6c3700004e'), 200
|
17
|
-
mock.put '/api/v1/projects/be74b643b64e3dc79aa0/steps/4dc312f49bd0ff6c37000040/tasks/4cd428c496f0734eef000007.json', pheaders, fixture_for('tasks/4cd428c496f0734eef000007'), 200
|
18
|
-
mock.post '/api/v1/projects/be74b643b64e3dc79aa0/tasks.json', pheaders, fixture_for('tasks/4cd428c496f0734eef000007'), 200
|
19
|
-
mock.get '/api/v1/projects/be74b643b64e3dc79aa0/steps/4dc312f49bd0ff6c37000040/tasks/4cd428c496f0734eef000007.json', wheaders, fixture_for('tasks/4cd428c496f0734eef000007'), 200
|
20
|
-
end
|
21
|
-
@project_id = 'be74b643b64e3dc79aa0'
|
22
|
-
@ticket_id = '4cd428c496f0734eef000007'
|
23
|
-
@ticket_id_without_note = '4cd428c496f0734eef000008'
|
24
|
-
@ticket_id_without_assignee = '4dc31c4c9bd0ff6c3700004e'
|
25
|
-
end
|
26
|
-
|
27
|
-
before(:each) do
|
28
|
-
@taskmapper = TaskMapper.new(:kanbanpad, :username => 'abc@g.com', :password => 'ie823d63js')
|
29
|
-
@project = @taskmapper.project(@project_id)
|
30
|
-
@klass = TaskMapper::Provider::Kanbanpad::Ticket
|
31
|
-
@comment_klass = TaskMapper::Provider::Kanbanpad::Comment
|
32
|
-
end
|
4
|
+
let(:headers) { {'Authorization' => 'Basic YWJjQGcuY29tOmllODIzZDYzanM='} }
|
5
|
+
let(:wheaders) { headers.merge('Accept' => 'application/json') }
|
6
|
+
let(:pheaders) { headers.merge("Content-Type" => "application/json") }
|
7
|
+
let(:ticket_data) { {:tasks => {:title => 'new ticket'}} }
|
8
|
+
let(:project_id) { 'be74b643b64e3dc79aa0'}
|
9
|
+
let(:ticket_id) { '4cd428c496f0734eef000007'}
|
10
|
+
let(:ticket_id_without_note) { '4cd428c496f0734eef000008' }
|
11
|
+
let(:ticket_id_without_assignee) { '4dc31c4c9bd0ff6c3700004e' }
|
12
|
+
let(:tm) { TaskMapper.new(:kanbanpad, :username => 'abc@g.com', :password => 'ie823d63js') }
|
13
|
+
let(:ticket_class) { TaskMapper::Provider::Kanbanpad::Ticket }
|
14
|
+
let(:comment_class) { TaskMapper::Provider::Kanbanpad::Comment }
|
33
15
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
16
|
+
describe "Retrieving tickets" do
|
17
|
+
before(:each) do
|
18
|
+
ActiveResource::HttpMock.respond_to do |mock|
|
19
|
+
mock.get '/api/v1/projects/be74b643b64e3dc79aa0.json', wheaders, fixture_for('projects/be74b643b64e3dc79aa0'), 200
|
20
|
+
mock.get '/api/v1/projects/be74b643b64e3dc79aa0/tasks.json?backlog=yes&finished=yes', headers, fixture_for('tasks'), 200
|
21
|
+
mock.get '/api/v1/projects/be74b643b64e3dc79aa0/tasks/4cd428c496f0734eef000007.json', headers, fixture_for('tasks/4cd428c496f0734eef000007'), 200
|
22
|
+
mock.get '/api/v1/projects/be74b643b64e3dc79aa0/tasks/4dc31c4c9bd0ff6c3700004e.json', headers, fixture_for('tasks/4dc31c4c9bd0ff6c3700004e'), 200
|
23
|
+
end
|
24
|
+
end
|
25
|
+
let(:project) { tm.project project_id }
|
38
26
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
end
|
27
|
+
context "when calling #tickets on a project instance" do
|
28
|
+
subject { project.tickets }
|
29
|
+
it { should be_an_instance_of Array }
|
30
|
+
it { subject.first.should be_an_instance_of ticket_class }
|
31
|
+
end
|
45
32
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
33
|
+
context "when calling #tickets with an array of ticket id's" do
|
34
|
+
subject { project.tickets([ticket_id]) }
|
35
|
+
it { should be_an_instance_of Array }
|
36
|
+
it { subject.first.should be_an_instance_of ticket_class }
|
37
|
+
it { subject.first.id.should be_eql ticket_id }
|
38
|
+
end
|
50
39
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
40
|
+
context "when calling #tickets with a hash attributes" do
|
41
|
+
subject { project.tickets :id => ticket_id }
|
42
|
+
it { should be_an_instance_of Array }
|
43
|
+
it { subject.first.should be_an_instance_of ticket_class }
|
44
|
+
it { subject.first.id.should be_eql ticket_id }
|
45
|
+
end
|
57
46
|
|
58
|
-
|
59
|
-
|
60
|
-
|
47
|
+
describe "Retrieve a single ticket" do
|
48
|
+
context "when calling #ticket with a ticket id" do
|
49
|
+
subject { project.ticket ticket_id }
|
50
|
+
it { should be_an_instance_of ticket_class }
|
51
|
+
it { subject.id.should be_eql ticket_id }
|
52
|
+
end
|
61
53
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
54
|
+
context "when calling #ticket with a hash attribute" do
|
55
|
+
subject { project.ticket :id => ticket_id }
|
56
|
+
it { should be_an_instance_of ticket_class }
|
57
|
+
it { subject.id.should be_eql ticket_id }
|
58
|
+
end
|
67
59
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
end
|
60
|
+
context "when retrieving a ticket without assignee" do
|
61
|
+
subject { project.ticket ticket_id_without_assignee }
|
62
|
+
it { subject.assignee.should be_eql 'Nobody' }
|
63
|
+
end
|
73
64
|
|
74
|
-
|
75
|
-
|
76
|
-
|
65
|
+
context "when retrieving a ticket" do
|
66
|
+
subject { project.ticket ticket_id }
|
67
|
+
it { subject.id.should be_eql '4cd428c496f0734eef000007' }
|
68
|
+
it { subject.status.should be_eql 'Finished' }
|
69
|
+
it { subject.priority.should be_eql 'Not Urgent' }
|
70
|
+
it { subject.resolution.should be_nil }
|
71
|
+
it { subject.title.should be_eql 'Fix UI detail' }
|
72
|
+
it { subject.created_at.should_not be_nil }
|
73
|
+
it { subject.updated_at.should_not be_nil }
|
74
|
+
it { subject.description.should be_nil }
|
75
|
+
it { subject.requestor.should be_nil }
|
76
|
+
it { subject.project_id.should be_eql 'be74b643b64e3dc79aa0' }
|
77
|
+
end
|
78
|
+
end
|
77
79
|
end
|
78
80
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
81
|
+
describe "Create and Update tickets" do
|
82
|
+
before(:each) do
|
83
|
+
ActiveResource::HttpMock.respond_to do |mock|
|
84
|
+
mock.get '/api/v1/projects/be74b643b64e3dc79aa0.json', wheaders, fixture_for('projects/be74b643b64e3dc79aa0'), 200
|
85
|
+
mock.get '/api/v1/projects/be74b643b64e3dc79aa0/tasks/4cd428c496f0734eef000007.json', wheaders, fixture_for('tasks/4cd428c496f0734eef000007'), 200
|
86
|
+
mock.get '/api/v1/projects/be74b643b64e3dc79aa0/steps/4dc312f49bd0ff6c37000040/tasks/4cd428c496f0734eef000007.json', wheaders, fixture_for('tasks/4cd428c496f0734eef000007'), 200
|
87
|
+
mock.post '/api/v1/projects/be74b643b64e3dc79aa0/tasks.json', pheaders, '', 200
|
88
|
+
mock.put '/api/v1/projects/be74b643b64e3dc79aa0/steps/4dc312f49bd0ff6c37000040/tasks/4cd428c496f0734eef000007.json', pheaders, fixture_for('tasks/4cd428c496f0734eef000007'), 200
|
89
|
+
end
|
90
|
+
end
|
91
|
+
let(:project) { tm.project project_id }
|
83
92
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
@ticket.save.should be_true
|
89
|
-
end
|
93
|
+
context "when calling #ticket! to a project instance" do
|
94
|
+
subject { project.ticket! :title => 'New Ticket', :assignee => ['john'], :description => 'Ticket description' }
|
95
|
+
it { should be_an_instance_of ticket_class }
|
96
|
+
end
|
90
97
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
ticket.created_at.should_not be_nil
|
99
|
-
ticket.updated_at.should_not be_nil
|
100
|
-
ticket.description.should be_nil
|
101
|
-
ticket.assignee.should == 'Rafael George'
|
102
|
-
ticket.requestor.should be_nil
|
103
|
-
ticket.project_id.should == 'be74b643b64e3dc79aa0'
|
98
|
+
context "when calling #save to a ticket instance and a field is change" do
|
99
|
+
it "should update the ticket instance in the backend" do
|
100
|
+
ticket = project.ticket ticket_id
|
101
|
+
ticket.title = 'Hello World'
|
102
|
+
ticket.save.should be_true
|
103
|
+
end
|
104
|
+
end
|
104
105
|
end
|
105
106
|
end
|
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "taskmapper-kanbanpad"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.8.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["HybridGroup"]
|
12
|
-
s.date = "2012-
|
12
|
+
s.date = "2012-06-18"
|
13
13
|
s.description = "Allows taskmapper to interact with kanbanpad."
|
14
14
|
s.email = "sonia@hybridgroup.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -28,6 +28,7 @@ Gem::Specification.new do |s|
|
|
28
28
|
"Rakefile",
|
29
29
|
"VERSION",
|
30
30
|
"lib/kanbanpad/kanbanpad-api.rb",
|
31
|
+
"lib/provider/api-extensions.rb",
|
31
32
|
"lib/provider/comment.rb",
|
32
33
|
"lib/provider/kanbanpad.rb",
|
33
34
|
"lib/provider/project.rb",
|
@@ -62,7 +63,7 @@ Gem::Specification.new do |s|
|
|
62
63
|
]
|
63
64
|
s.homepage = "http://github.com/hybridgroup/taskmapper-kanbanpad"
|
64
65
|
s.require_paths = ["lib"]
|
65
|
-
s.rubygems_version = "1.8.
|
66
|
+
s.rubygems_version = "1.8.24"
|
66
67
|
s.summary = "taskmapper Provider for Kanbanpad"
|
67
68
|
|
68
69
|
if s.respond_to? :specification_version then
|
@@ -71,7 +72,6 @@ Gem::Specification.new do |s|
|
|
71
72
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
72
73
|
s.add_runtime_dependency(%q<taskmapper>, ["~> 0.8"])
|
73
74
|
s.add_development_dependency(%q<rspec>, ["~> 2.8"])
|
74
|
-
s.add_development_dependency(%q<bundler>, ["~> 1.1"])
|
75
75
|
s.add_development_dependency(%q<jeweler>, ["~> 1.6"])
|
76
76
|
s.add_development_dependency(%q<simplecov>, ["~> 0.5"])
|
77
77
|
s.add_development_dependency(%q<rcov>, ["~> 1.0"])
|
@@ -79,7 +79,6 @@ Gem::Specification.new do |s|
|
|
79
79
|
else
|
80
80
|
s.add_dependency(%q<taskmapper>, ["~> 0.8"])
|
81
81
|
s.add_dependency(%q<rspec>, ["~> 2.8"])
|
82
|
-
s.add_dependency(%q<bundler>, ["~> 1.1"])
|
83
82
|
s.add_dependency(%q<jeweler>, ["~> 1.6"])
|
84
83
|
s.add_dependency(%q<simplecov>, ["~> 0.5"])
|
85
84
|
s.add_dependency(%q<rcov>, ["~> 1.0"])
|
@@ -88,7 +87,6 @@ Gem::Specification.new do |s|
|
|
88
87
|
else
|
89
88
|
s.add_dependency(%q<taskmapper>, ["~> 0.8"])
|
90
89
|
s.add_dependency(%q<rspec>, ["~> 2.8"])
|
91
|
-
s.add_dependency(%q<bundler>, ["~> 1.1"])
|
92
90
|
s.add_dependency(%q<jeweler>, ["~> 1.6"])
|
93
91
|
s.add_dependency(%q<simplecov>, ["~> 0.5"])
|
94
92
|
s.add_dependency(%q<rcov>, ["~> 1.0"])
|
metadata
CHANGED
@@ -1,104 +1,120 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: taskmapper-kanbanpad
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.8.0
|
4
5
|
prerelease:
|
5
|
-
version: 0.7.0
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- HybridGroup
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-06-18 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
16
15
|
name: taskmapper
|
17
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
18
17
|
none: false
|
19
|
-
requirements:
|
18
|
+
requirements:
|
20
19
|
- - ~>
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version:
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0.8'
|
23
22
|
type: :runtime
|
24
23
|
prerelease: false
|
25
|
-
version_requirements:
|
26
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0.8'
|
30
|
+
- !ruby/object:Gem::Dependency
|
27
31
|
name: rspec
|
28
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
29
33
|
none: false
|
30
|
-
requirements:
|
34
|
+
requirements:
|
31
35
|
- - ~>
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version:
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '2.8'
|
34
38
|
type: :development
|
35
39
|
prerelease: false
|
36
|
-
version_requirements:
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
|
-
name: bundler
|
39
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
41
|
none: false
|
41
|
-
requirements:
|
42
|
+
requirements:
|
42
43
|
- - ~>
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
version:
|
45
|
-
|
46
|
-
prerelease: false
|
47
|
-
version_requirements: *id003
|
48
|
-
- !ruby/object:Gem::Dependency
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '2.8'
|
46
|
+
- !ruby/object:Gem::Dependency
|
49
47
|
name: jeweler
|
50
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
51
49
|
none: false
|
52
|
-
requirements:
|
50
|
+
requirements:
|
53
51
|
- - ~>
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
version:
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '1.6'
|
56
54
|
type: :development
|
57
55
|
prerelease: false
|
58
|
-
version_requirements:
|
59
|
-
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.6'
|
62
|
+
- !ruby/object:Gem::Dependency
|
60
63
|
name: simplecov
|
61
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
62
65
|
none: false
|
63
|
-
requirements:
|
66
|
+
requirements:
|
64
67
|
- - ~>
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
version:
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0.5'
|
67
70
|
type: :development
|
68
71
|
prerelease: false
|
69
|
-
version_requirements:
|
70
|
-
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0.5'
|
78
|
+
- !ruby/object:Gem::Dependency
|
71
79
|
name: rcov
|
72
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
73
81
|
none: false
|
74
|
-
requirements:
|
82
|
+
requirements:
|
75
83
|
- - ~>
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version:
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '1.0'
|
78
86
|
type: :development
|
79
87
|
prerelease: false
|
80
|
-
version_requirements:
|
81
|
-
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '1.0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
82
95
|
name: rspec
|
83
|
-
requirement:
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
84
97
|
none: false
|
85
|
-
requirements:
|
86
|
-
- -
|
87
|
-
- !ruby/object:Gem::Version
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
88
101
|
version: 1.2.9
|
89
102
|
type: :development
|
90
103
|
prerelease: false
|
91
|
-
version_requirements:
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 1.2.9
|
92
110
|
description: Allows taskmapper to interact with kanbanpad.
|
93
111
|
email: sonia@hybridgroup.com
|
94
112
|
executables: []
|
95
|
-
|
96
113
|
extensions: []
|
97
|
-
|
98
|
-
extra_rdoc_files:
|
114
|
+
extra_rdoc_files:
|
99
115
|
- LICENSE
|
100
116
|
- README.md
|
101
|
-
files:
|
117
|
+
files:
|
102
118
|
- .document
|
103
119
|
- .rbenv-gemsets
|
104
120
|
- .rbenv-version
|
@@ -110,6 +126,7 @@ files:
|
|
110
126
|
- Rakefile
|
111
127
|
- VERSION
|
112
128
|
- lib/kanbanpad/kanbanpad-api.rb
|
129
|
+
- lib/provider/api-extensions.rb
|
113
130
|
- lib/provider/comment.rb
|
114
131
|
- lib/provider/kanbanpad.rb
|
115
132
|
- lib/provider/project.rb
|
@@ -143,30 +160,29 @@ files:
|
|
143
160
|
- taskmapper-kanbanpad.gemspec
|
144
161
|
homepage: http://github.com/hybridgroup/taskmapper-kanbanpad
|
145
162
|
licenses: []
|
146
|
-
|
147
163
|
post_install_message:
|
148
164
|
rdoc_options: []
|
149
|
-
|
150
|
-
require_paths:
|
165
|
+
require_paths:
|
151
166
|
- lib
|
152
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
167
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
153
168
|
none: false
|
154
|
-
requirements:
|
155
|
-
- -
|
156
|
-
- !ruby/object:Gem::Version
|
157
|
-
version:
|
158
|
-
|
169
|
+
requirements:
|
170
|
+
- - ! '>='
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: '0'
|
173
|
+
segments:
|
174
|
+
- 0
|
175
|
+
hash: 260360189
|
176
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
159
177
|
none: false
|
160
|
-
requirements:
|
161
|
-
- -
|
162
|
-
- !ruby/object:Gem::Version
|
163
|
-
version:
|
178
|
+
requirements:
|
179
|
+
- - ! '>='
|
180
|
+
- !ruby/object:Gem::Version
|
181
|
+
version: '0'
|
164
182
|
requirements: []
|
165
|
-
|
166
183
|
rubyforge_project:
|
167
|
-
rubygems_version: 1.8.
|
184
|
+
rubygems_version: 1.8.24
|
168
185
|
signing_key:
|
169
186
|
specification_version: 3
|
170
187
|
summary: taskmapper Provider for Kanbanpad
|
171
188
|
test_files: []
|
172
|
-
|