xplanner 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,14 @@
1
+ module AttrAccessorWithDirtyBit
2
+ def dirty_accessor( *names )
3
+ attr_reader *names
4
+
5
+ names.each do |name|
6
+ define_method :"#{name}=" do |v|
7
+ if instance_variable_get(:"@#{name}") != v
8
+ @dirty_bit = true
9
+ instance_variable_set(:"@#{name}", v)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,3 +1,3 @@
1
1
  module XPlanner
2
- VERSION = '0.0.5'
3
- end
2
+ VERSION = '0.0.6'
3
+ end
@@ -26,15 +26,20 @@ module XPlanner
26
26
  results
27
27
  end
28
28
 
29
- def self.remote_action( rpc, payload )
29
+ def self.remote_delete( rpc, payload )
30
30
  invalid_usage unless @@soap_client
31
31
  @@soap_client.call( rpc, payload ).success?
32
32
  end
33
33
 
34
- def remote_action( rpc, payload )
34
+ def remote_update( rpc, payload )
35
35
  invalid_usage unless @@soap_client
36
- result = @@soap_client.call( rpc, payload )
37
- result.success?
36
+ if @dirty_bit
37
+ result = @@soap_client.call( rpc, payload )
38
+ @dirty_bit = false if( result.success? )
39
+ return result.success?
40
+ else
41
+ return true
42
+ end
38
43
  end
39
44
 
40
45
  def self.parse_date( date )
@@ -49,7 +54,7 @@ module XPlanner
49
54
  end
50
55
 
51
56
  def create_payload
52
- payload = hashify.delete_if { |key, value| !key == :last_update_time }
57
+ payload = hashify.delete_if { |key, value| [:last_update_time, :dirty_bit].include? key }
53
58
  end
54
59
 
55
60
  end
@@ -16,6 +16,5 @@ module XPlanner
16
16
  soap.body = payload unless payload.nil?
17
17
  end
18
18
  end
19
-
20
19
  end
21
20
  end
@@ -1,26 +1,29 @@
1
1
  module XPlanner
2
2
  class Iteration < ModelHelper
3
- attr_accessor :name,
4
- :description,
5
- :project_id,
6
- :status_key,
7
- :actual_hours,
8
- :added_hours,
9
- :adjusted_estimated_hours,
10
- :days_worked,
11
- :estimated_hours,
12
- :overestimated_hours,
13
- :postponed_hours,
14
- :remaining_hours,
15
- :start_date,
16
- :end_date,
17
- :underestimated_hours
3
+ extend AttrAccessorWithDirtyBit
4
+ dirty_accessor :name,
5
+ :description,
6
+ :project_id,
7
+ :status_key,
8
+ :actual_hours,
9
+ :added_hours,
10
+ :adjusted_estimated_hours,
11
+ :days_worked,
12
+ :estimated_hours,
13
+ :overestimated_hours,
14
+ :postponed_hours,
15
+ :remaining_hours,
16
+ :start_date,
17
+ :end_date,
18
+ :underestimated_hours
18
19
 
19
20
  attr_reader :id,
20
21
  :last_update_time
21
22
 
22
23
 
23
24
  def initialize( iter )
25
+ @dirty_bit = false
26
+
24
27
  @id = iter[:id]
25
28
  @name = iter[:name]
26
29
  @description = iter[:description]
@@ -74,7 +77,7 @@ module XPlanner
74
77
  def self.delete( id )
75
78
  rpc = :remove_iteration
76
79
  payload = { :id => id }
77
- remote_action( rpc, payload )
80
+ remote_delete( rpc, payload )
78
81
  end
79
82
 
80
83
  def delete
@@ -84,7 +87,7 @@ module XPlanner
84
87
  def save
85
88
  rpc = :update
86
89
  payload = { :iterationData => create_payload }
87
- remote_action( rpc, payload )
90
+ remote_update( rpc, payload )
88
91
  end
89
92
 
90
93
  end
@@ -1,15 +1,18 @@
1
1
  module XPlanner
2
2
  class Person < ModelHelper
3
- attr_accessor :name,
4
- :email,
5
- :initials,
6
- :phone,
7
- :user_id
3
+ extend AttrAccessorWithDirtyBit
4
+ dirty_accessor :name,
5
+ :email,
6
+ :initials,
7
+ :phone,
8
+ :user_id
8
9
 
9
10
  attr_reader :id,
10
11
  :last_update_time
11
12
 
12
13
  def initialize( p )
14
+ @dirty_bit = false
15
+
13
16
  @id = p[:id]
14
17
  @name = p[:name]
15
18
  @last_update_time = Person.parse_date p[:last_update_time]
@@ -48,7 +51,7 @@ module XPlanner
48
51
  def self.delete( id )
49
52
  rpc = :remove_person
50
53
  payload = { :id => id }
51
- remote_action( rpc, payload )
54
+ remote_delete( rpc, payload )
52
55
  end
53
56
 
54
57
  def delete
@@ -58,7 +61,7 @@ module XPlanner
58
61
  def save
59
62
  rpc = :update
60
63
  payload = { :personData => create_payload }
61
- remote_action( rpc, payload )
64
+ remote_update( rpc, payload )
62
65
  end
63
66
  end
64
67
  end
@@ -1,12 +1,15 @@
1
1
  module XPlanner
2
2
  class Project < ModelHelper
3
- attr_accessor :name,
4
- :description
3
+ extend AttrAccessorWithDirtyBit
4
+ dirty_accessor :name,
5
+ :description
5
6
 
6
7
  attr_reader :id,
7
8
  :last_update_time
8
9
 
9
10
  def initialize( p )
11
+ @dirty_bit = false
12
+
10
13
  @id = p[:id]
11
14
  @name = p[:name]
12
15
  @last_update_time = Project.parse_date p[:last_update_time]
@@ -36,7 +39,7 @@ module XPlanner
36
39
  def self.delete( id )
37
40
  rpc = :remove_project
38
41
  payload = { :id => id }
39
- remote_action( rpc, payload )
42
+ remote_delete( rpc, payload )
40
43
  end
41
44
 
42
45
  def delete
@@ -46,7 +49,7 @@ module XPlanner
46
49
  def save
47
50
  rpc = :update
48
51
  payload = { :projectData => create_payload }
49
- remote_action( rpc, payload )
52
+ remote_update( rpc, payload )
50
53
  end
51
54
 
52
55
  def link
@@ -1,7 +1,8 @@
1
1
  module XPlanner
2
2
  class Story < ModelHelper
3
+ extend AttrAccessorWithDirtyBit
3
4
 
4
- attr_accessor :actual_hours,
5
+ dirty_accessor :actual_hours,
5
6
  :adjusted_estimated_hours,
6
7
  :completed,
7
8
  :customer_id,
@@ -21,6 +22,8 @@ module XPlanner
21
22
 
22
23
 
23
24
  def initialize( story )
25
+ @dirty_bit = false
26
+
24
27
  @actual_hours = story[:actual_hours]
25
28
  @adjusted_estimated_hours = story[:adjusted_estimated_hours]
26
29
  @completed = story[:completed]
@@ -71,7 +74,7 @@ module XPlanner
71
74
  def self.delete( id )
72
75
  rpc = :remove_user_story
73
76
  payload = { :id => id }
74
- remote_action( rpc, payload )
77
+ remote_delete( rpc, payload )
75
78
  end
76
79
 
77
80
  def delete
@@ -81,7 +84,7 @@ module XPlanner
81
84
  def save
82
85
  rpc = :update
83
86
  payload = { :userStoryData => create_payload }
84
- remote_action( rpc, payload )
87
+ remote_update( rpc, payload )
85
88
  end
86
89
 
87
90
  end
@@ -1,7 +1,8 @@
1
1
  module XPlanner
2
2
  class Task < ModelHelper
3
+ extend AttrAccessorWithDirtyBit
3
4
 
4
- attr_accessor :acceptor_id,
5
+ dirty_accessor :acceptor_id,
5
6
  :actual_hours,
6
7
  :adjusted_estimated_hours,
7
8
  :completed,
@@ -20,6 +21,8 @@ module XPlanner
20
21
 
21
22
 
22
23
  def initialize( task )
24
+ @dirty_bit = false
25
+
23
26
  @acceptor_id = task[:acceptor_id]
24
27
  @actual_hours = task[:actual_hours]
25
28
  @adjusted_estimated_hours = task[:adjusted_estimated_hours]
@@ -70,7 +73,7 @@ module XPlanner
70
73
  def self.delete( id )
71
74
  rpc = :remove_task
72
75
  payload = { :id => id }
73
- remote_action( rpc, payload )
76
+ remote_delete( rpc, payload )
74
77
  end
75
78
 
76
79
  def delete
@@ -80,7 +83,7 @@ module XPlanner
80
83
  def save
81
84
  rpc = :update
82
85
  payload = { :taskData => create_payload }
83
- remote_action( rpc, payload )
86
+ remote_update( rpc, payload )
84
87
  end
85
88
 
86
89
  end
@@ -20,11 +20,11 @@ describe 'XPlanner+ SOAP interface' do
20
20
  end
21
21
 
22
22
  it 'Update' do
23
- @myProject.description += ' O_o '
23
+ @myProject.description= ' O_o '
24
24
  result = @myProject.save
25
25
  result.should equal true
26
26
  this_project = XPlanner::Project.retrieve( @myProject.id )
27
- this_project.description.should include ' O_o '
27
+ this_project.description.should eq ' O_o '
28
28
  end
29
29
 
30
30
  it 'creates link tot he project on XPlanner' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xplanner
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,12 +9,12 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-21 00:00:00.000000000 +00:00
12
+ date: 2012-11-22 00:00:00.000000000 +00:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: savon
17
- requirement: &2168461780 !ruby/object:Gem::Requirement
17
+ requirement: &2168985100 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 1.2.0
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *2168461780
25
+ version_requirements: *2168985100
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: nokogiri
28
- requirement: &2168461280 !ruby/object:Gem::Requirement
28
+ requirement: &2168984600 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ~>
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: 1.5.0
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *2168461280
36
+ version_requirements: *2168984600
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: activesupport
39
- requirement: &2168460820 !ruby/object:Gem::Requirement
39
+ requirement: &2168984140 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: 3.2.0
45
45
  type: :runtime
46
46
  prerelease: false
47
- version_requirements: *2168460820
47
+ version_requirements: *2168984140
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: rspec
50
- requirement: &2168460440 !ruby/object:Gem::Requirement
50
+ requirement: &2168983760 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,7 +55,7 @@ dependencies:
55
55
  version: '0'
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *2168460440
58
+ version_requirements: *2168983760
59
59
  description: Ruby wrapper for XPlanner+ SOAP interface
60
60
  email:
61
61
  - whoojemaflip@gmail.com
@@ -67,6 +67,7 @@ files:
67
67
  - Gemfile
68
68
  - LICENSE.txt
69
69
  - README.md
70
+ - lib/config/attr_accessor_dirty_bit.rb
70
71
  - lib/config/default_config.rb
71
72
  - lib/config/savon_config.rb
72
73
  - lib/config/version.rb