xplanner 0.0.5 → 0.0.6

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.
@@ -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