rally_workspace_utils 0.0.2 → 0.0.3
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/Manifest.txt +2 -0
- data/bin/translate_workspace +1 -0
- data/lib/translate/copy/object_copy.rb +3 -3
- data/lib/translate/translate.rb +24 -35
- data/lib/translate/translation_audit.rb +1 -1
- data/lib/translate/translation_store.rb +76 -0
- data/lib/translate/version.rb +1 -1
- data/test/translation_store_spec.rb +123 -0
- metadata +4 -2
data/Manifest.txt
CHANGED
data/bin/translate_workspace
CHANGED
@@ -4,6 +4,7 @@ class ObjectCopy
|
|
4
4
|
end
|
5
5
|
|
6
6
|
def copy(new_workspace, additional_values = {})
|
7
|
+
@object.rally_rest.logger.info "Copying #{@object.type} -- #{@object.name}"
|
7
8
|
values = shallow_copy(@object, new_workspace)
|
8
9
|
values.merge! additional_values
|
9
10
|
|
@@ -18,8 +19,7 @@ class ObjectCopy
|
|
18
19
|
end
|
19
20
|
|
20
21
|
def remember old, new
|
21
|
-
|
22
|
-
$TRANSLATED[old.oid] = new.oid
|
22
|
+
TranslationStore[old.oid] = new.oid
|
23
23
|
end
|
24
24
|
|
25
25
|
def create_object(rally_rest, values)
|
@@ -85,7 +85,7 @@ class ObjectCopy
|
|
85
85
|
|
86
86
|
def fetch_object(type, oid, workspace)
|
87
87
|
@@cached_objects ||= {}
|
88
|
-
new_oid =
|
88
|
+
new_oid = TranslationStore[oid]
|
89
89
|
return @@cached_objects[new_oid] if @@cached_objects.key? oid
|
90
90
|
|
91
91
|
object = @object.rally_rest.find(type, :workspace => workspace) { equal :object_i_d, new_oid }.first
|
data/lib/translate/translate.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/copy'
|
2
2
|
require File.dirname(__FILE__) + '/translation_audit'
|
3
|
+
require File.dirname(__FILE__) + '/translation_store'
|
3
4
|
|
4
5
|
class Translate
|
5
6
|
include TranslationAudit
|
@@ -13,7 +14,6 @@ class Translate
|
|
13
14
|
@from_workspace_name = args[:from_workspace]
|
14
15
|
@to_workspace_name = args[:to_workspace]
|
15
16
|
@logger = args[:logger] if args[:logger]
|
16
|
-
$TRANSLATED ||= {}
|
17
17
|
end
|
18
18
|
|
19
19
|
def run
|
@@ -25,41 +25,30 @@ class Translate
|
|
25
25
|
raise "No such workspace #{@from_workspace_name}" unless @from_workspace
|
26
26
|
raise "No such workspace #{@to_workspace_name}" unless @to_workspace
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
28
|
+
store = TranslationStore.instance(@from_workspace, @to_workspace)
|
29
|
+
|
30
|
+
begin
|
31
|
+
# now do the copy
|
32
|
+
[:iteration, :release, :story, :defect, :test_case].each do |type|
|
33
|
+
# @slm.find_all(type, :workspace => @from_workspace, :order => [:creation_date, :desc]).each do |o|
|
34
|
+
@slm.find_all(type, :workspace => @from_workspace).each do |o|
|
35
|
+
o.copy(@to_workspace) unless TranslationStore[o.oid]
|
36
|
+
end
|
37
|
+
end unless store.copy_finished?
|
38
|
+
store.copy_finished!
|
39
|
+
|
40
|
+
# Now tangle the objects
|
41
|
+
[:test_case, :defect].each do |type|
|
42
|
+
@slm.find_all(type, :workspace => @from_workspace).each do |o|
|
43
|
+
o.tangle(@to_workspace)
|
44
|
+
end
|
45
|
+
end unless store.tangle_finished?
|
46
|
+
store.tangle_finished!
|
47
|
+
rescue Exception => e
|
48
|
+
@logger.info "Caught an exception #{e}. Remembering where we were."
|
49
|
+
# Remember where we were if there was a failure
|
50
|
+
store.dump
|
39
51
|
end
|
40
|
-
|
41
|
-
# now do the copy
|
42
|
-
[:iteration, :release, :story, :defect, :test_case].each do |type|
|
43
|
-
@slm.find_all(type, :workspace => @from_workspace).each do |o|
|
44
|
-
@logger.info "Copying #{o.type} -- #{o.name}"
|
45
|
-
o.copy(@to_workspace)
|
46
|
-
end
|
47
|
-
end unless $TRANSLATED[:copy]
|
48
|
-
# mark these workspaces as copied
|
49
|
-
$TRANSLATED[:copy] = true
|
50
|
-
# dump the oids to disk
|
51
|
-
dump_oids
|
52
|
-
|
53
|
-
# Now tangle the objects
|
54
|
-
[:test_case, :defect].each do |type|
|
55
|
-
@slm.find_all(type, :workspace => @from_workspace).each do |o|
|
56
|
-
@logger.info "Tangle #{o.type} -- #{o.name}"
|
57
|
-
o.tangle(@to_workspace)
|
58
|
-
end
|
59
|
-
end unless $TRANSLATED[:tangle]
|
60
|
-
|
61
|
-
$TRANSLATED[:tangle] = true
|
62
|
-
dump_oids
|
63
52
|
end
|
64
53
|
|
65
54
|
def dump_oids
|
@@ -55,7 +55,7 @@ module TranslationAudit
|
|
55
55
|
|
56
56
|
def compare_each(type)
|
57
57
|
@slm.find_all(type, :workspace => @from_workspace).each do |old_object|
|
58
|
-
new_object = @slm.find(type, :workspace => @to_workspace) { equal :object_i_d,
|
58
|
+
new_object = @slm.find(type, :workspace => @to_workspace) { equal :object_i_d, TranslationStore[old_object.oid] }.first
|
59
59
|
if new_object.nil?
|
60
60
|
self.logger.info "Cound not find a copy for object #{old_object.type} -- #{old_object.name} -- #{old_object.oid}"
|
61
61
|
next
|
@@ -0,0 +1,76 @@
|
|
1
|
+
|
2
|
+
class TranslationStore
|
3
|
+
private_class_method :new
|
4
|
+
|
5
|
+
def TranslationStore.instance(from_workspace = nil, to_workspace = nil)
|
6
|
+
unless defined? @@instance
|
7
|
+
raise "TranslationStory needs to be initialized with two workspaces" unless from_workspace && to_workspace
|
8
|
+
@@instance = new(from_workspace, to_workspace)
|
9
|
+
end
|
10
|
+
@@instance
|
11
|
+
end
|
12
|
+
|
13
|
+
def TranslationStore.[](key)
|
14
|
+
instance[key]
|
15
|
+
end
|
16
|
+
|
17
|
+
def TranslationStore.[]=(key, value)
|
18
|
+
instance[key] = value
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(w1, w2)
|
22
|
+
@w1 = w1.oid
|
23
|
+
@w2 = w2.oid
|
24
|
+
@store = {}
|
25
|
+
@store[:copy] = false
|
26
|
+
@store[:tangle] = false
|
27
|
+
load
|
28
|
+
end
|
29
|
+
|
30
|
+
def [](key)
|
31
|
+
@store[key]
|
32
|
+
end
|
33
|
+
|
34
|
+
def []=(key, value)
|
35
|
+
@store[key] = value
|
36
|
+
end
|
37
|
+
|
38
|
+
def copy_finished!
|
39
|
+
@store[:copy] = true
|
40
|
+
dump
|
41
|
+
end
|
42
|
+
|
43
|
+
def copy_finished?
|
44
|
+
@store[:copy] == true
|
45
|
+
end
|
46
|
+
|
47
|
+
def tangle_finished!
|
48
|
+
@store[:tangle] = true
|
49
|
+
dump
|
50
|
+
end
|
51
|
+
|
52
|
+
def tangle_finished?
|
53
|
+
@store[:tangle] == true
|
54
|
+
end
|
55
|
+
|
56
|
+
def dump
|
57
|
+
File.open(filename, "w+") do |f|
|
58
|
+
Marshal.dump(@store, f)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def load
|
63
|
+
File.open(filename, "r") do |f|
|
64
|
+
@store = Marshal.load(f)
|
65
|
+
end if File.exists? filename
|
66
|
+
end
|
67
|
+
|
68
|
+
def filename
|
69
|
+
"translate-#{@w1}-#{@w2}"
|
70
|
+
end
|
71
|
+
|
72
|
+
def cleanup
|
73
|
+
File.delete(filename) if File.exists? filename
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
data/lib/translate/version.rb
CHANGED
@@ -0,0 +1,123 @@
|
|
1
|
+
|
2
|
+
require 'rubygems'
|
3
|
+
require 'spec'
|
4
|
+
|
5
|
+
require File.dirname(__FILE__) + '/../lib/translate/translation_store'
|
6
|
+
|
7
|
+
context "A TranslationStore singleton" do
|
8
|
+
|
9
|
+
setup do
|
10
|
+
@workspace1 = Object.new
|
11
|
+
@workspace1.stub!(:oid).and_return(12345)
|
12
|
+
@workspace2 = Object.new
|
13
|
+
@workspace2.stub!(:oid).and_return(54321)
|
14
|
+
end
|
15
|
+
|
16
|
+
teardown do
|
17
|
+
TranslationStore.send(:remove_class_variable, :@@instance) rescue ""
|
18
|
+
end
|
19
|
+
|
20
|
+
specify "should only have a single instance" do
|
21
|
+
lambda { TranslationStore.new }.should_raise Exception
|
22
|
+
TranslationStore.should_respond_to :instance
|
23
|
+
end
|
24
|
+
|
25
|
+
specify "singleton should be initialized with two workspaces" do
|
26
|
+
|
27
|
+
lambda { TranslationStore.instance }.should_raise Exception
|
28
|
+
lambda { TranslationStore.instance(nil, nil) }.should_raise Exception
|
29
|
+
lambda { TranslationStore.instance(nil, @workspace1) }.should_raise Exception
|
30
|
+
lambda { TranslationStore.instance(@workspace1, nil) }.should_raise Exception
|
31
|
+
lambda { TranslationStore[1] = 2 }.should_raise Exception
|
32
|
+
lambda { TranslationStore.instance(@workspace1, @workspace2) }.should_not_raise Exception
|
33
|
+
end
|
34
|
+
|
35
|
+
specify "singleton should return an instance of TranslationStory when initialized with two workspaces" do
|
36
|
+
TranslationStore.instance(@workspace1, @workspace2).should_be_instance_of TranslationStore
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "A TranslationStore" do
|
41
|
+
setup do
|
42
|
+
@workspace1 = Object.new
|
43
|
+
@workspace1.stub!(:oid).and_return(12345)
|
44
|
+
@workspace2 = Object.new
|
45
|
+
@workspace2.stub!(:oid).and_return(54321)
|
46
|
+
@store = TranslationStore.instance(@workspace1, @workspace2)
|
47
|
+
end
|
48
|
+
|
49
|
+
teardown do
|
50
|
+
@store.cleanup
|
51
|
+
TranslationStore.send(:remove_class_variable, :@@instance) rescue ""
|
52
|
+
end
|
53
|
+
|
54
|
+
specify "should store mappings of old oids to new oids" do
|
55
|
+
@store[12345] = 54321
|
56
|
+
@store[12345].should_be 54321
|
57
|
+
|
58
|
+
TranslationStore[1] = 2
|
59
|
+
TranslationStore[1].should_be 2
|
60
|
+
end
|
61
|
+
|
62
|
+
specify "should write all contents to a file" do
|
63
|
+
@store[1] = 2
|
64
|
+
@store.dump
|
65
|
+
File.exists?("translate-12345-54321").should_be true
|
66
|
+
end
|
67
|
+
|
68
|
+
specify "should cleanup file" do
|
69
|
+
@store[1] = 2
|
70
|
+
@store.dump
|
71
|
+
File.exists?("translate-12345-54321").should_be true
|
72
|
+
@store.cleanup
|
73
|
+
File.exists?("translate-12345-54321").should_be false
|
74
|
+
end
|
75
|
+
|
76
|
+
specify "should read contents from a file" do
|
77
|
+
@store[1] = 2
|
78
|
+
@store.dump
|
79
|
+
File.exists?("translate-12345-54321").should_be true
|
80
|
+
TranslationStore.send(:remove_class_variable, :@@instance) rescue ""
|
81
|
+
@store = TranslationStore.instance(@workspace1, @workspace2)
|
82
|
+
@store[1].should_be 2
|
83
|
+
end
|
84
|
+
|
85
|
+
specify "should read from a file, only when the workspace oids match" do
|
86
|
+
@store[1] = 2
|
87
|
+
@store.dump
|
88
|
+
TranslationStore.send(:remove_class_variable, :@@instance) rescue ""
|
89
|
+
|
90
|
+
@workspace2 = Object.new
|
91
|
+
@workspace2.stub!(:oid).and_return(11111)
|
92
|
+
@store = TranslationStore.instance(@workspace1, @workspace2)
|
93
|
+
@store.load
|
94
|
+
@store[1].should_be nil
|
95
|
+
end
|
96
|
+
|
97
|
+
specify "should remember when the copy is finished" do
|
98
|
+
@store.copy_finished?.should_be false
|
99
|
+
@store.copy_finished!
|
100
|
+
@store.copy_finished?.should_be true
|
101
|
+
|
102
|
+
@store.dump
|
103
|
+
TranslationStore.send(:remove_class_variable, :@@instance) rescue ""
|
104
|
+
@store = TranslationStore.instance(@workspace1, @workspace2)
|
105
|
+
@store.load
|
106
|
+
|
107
|
+
@store.copy_finished?.should_be true
|
108
|
+
end
|
109
|
+
|
110
|
+
specify "should remember when the tangle is finished" do
|
111
|
+
@store.tangle_finished?.should_be false
|
112
|
+
@store.tangle_finished!
|
113
|
+
@store.tangle_finished?.should_be true
|
114
|
+
|
115
|
+
@store.dump
|
116
|
+
TranslationStore.send(:remove_class_variable, :@@instance) rescue ""
|
117
|
+
@store = TranslationStore.instance(@workspace1, @workspace2)
|
118
|
+
@store.load
|
119
|
+
|
120
|
+
@store.tangle_finished?.should_be true
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
|
|
3
3
|
specification_version: 1
|
4
4
|
name: rally_workspace_utils
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0.
|
7
|
-
date: 2006-12-
|
6
|
+
version: 0.0.3
|
7
|
+
date: 2006-12-20 00:00:00 -07:00
|
8
8
|
summary: A utility to translate a UseCase workspace to a UserStory workspace
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -45,6 +45,8 @@ files:
|
|
45
45
|
- lib/translate/copy/defect_copy.rb
|
46
46
|
- lib/translate/copy/object_copy.rb
|
47
47
|
- lib/translate/copy/test_case_copy.rb
|
48
|
+
- lib/translate/translation_store.rb
|
49
|
+
- test/translation_store_spec.rb
|
48
50
|
- lib/rally_workspace_utils.rb
|
49
51
|
test_files:
|
50
52
|
- test/rally_workspace_utils_test.rb
|