taskmapper-kanbanpad 0.7.0 → 0.8.0
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/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
|
-
|