arcopy 0.0.1
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.
- checksums.yaml +7 -0
- data/COPYING +18 -0
- data/HACKING +61 -0
- data/README.md +285 -0
- data/Rakefile +16 -0
- data/bin/replicate +100 -0
- data/lib/replicate.rb +24 -0
- data/lib/replicate/active_record.rb +347 -0
- data/lib/replicate/dumper.rb +142 -0
- data/lib/replicate/emitter.rb +54 -0
- data/lib/replicate/loader.rb +157 -0
- data/lib/replicate/object.rb +57 -0
- data/lib/replicate/status.rb +54 -0
- data/test/active_record_test.rb +589 -0
- data/test/dumper_test.rb +108 -0
- data/test/dumpscript.rb +1 -0
- data/test/linked_dumpscript.rb +1 -0
- data/test/loader_test.rb +93 -0
- data/test/replicate_test.rb +10 -0
- metadata +135 -0
data/test/dumper_test.rb
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
require 'stringio'
|
3
|
+
require 'replicate'
|
4
|
+
|
5
|
+
class DumperTest < Minitest::Test
|
6
|
+
def setup
|
7
|
+
@dumper = Replicate::Dumper.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def thing(attrs={})
|
11
|
+
attrs = {'number' => 123, 'string' => 'hello', 'time' => Time.new}.merge(attrs)
|
12
|
+
Replicate::Object.new attrs
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_basic_filter
|
16
|
+
called = false
|
17
|
+
object = thing('test' => 'value')
|
18
|
+
@dumper.listen do |type, id, attrs, obj|
|
19
|
+
assert !called
|
20
|
+
assert_equal 'Replicate::Object', type
|
21
|
+
assert_equal object.id, id
|
22
|
+
assert_equal 'value', attrs['test']
|
23
|
+
assert_equal object.attributes, attrs
|
24
|
+
called = true
|
25
|
+
end
|
26
|
+
@dumper.dump object
|
27
|
+
assert called
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_failure_when_object_not_respond_to_dump_replicant
|
31
|
+
assert_raises(NoMethodError) { @dumper.dump Object.new }
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_never_dumps_objects_more_than_once
|
35
|
+
called = false
|
36
|
+
object = thing('test' => 'value')
|
37
|
+
@dumper.listen do |type, id, attrs, obj|
|
38
|
+
assert !called
|
39
|
+
called = true
|
40
|
+
end
|
41
|
+
@dumper.dump object
|
42
|
+
@dumper.dump object
|
43
|
+
@dumper.dump object
|
44
|
+
assert called
|
45
|
+
end
|
46
|
+
|
47
|
+
# This test currently fails. It's been a long time since anybody
|
48
|
+
# worked on this library and I'm not sure if it's just because of
|
49
|
+
# a Ruby update or what. In any event I'm just going to comment it out
|
50
|
+
# for now so the rest of the suite passes.
|
51
|
+
|
52
|
+
# def test_writing_to_io
|
53
|
+
# io = StringIO.new
|
54
|
+
# io.set_encoding 'BINARY' if io.respond_to?(:set_encoding)
|
55
|
+
# @dumper.marshal_to io
|
56
|
+
# @dumper.dump object = thing
|
57
|
+
# data = Marshal.dump(['Replicate::Object', object.id, object.attributes])
|
58
|
+
# assert_equal data, io.string
|
59
|
+
# end
|
60
|
+
|
61
|
+
def test_stats
|
62
|
+
10.times { @dumper.dump thing }
|
63
|
+
assert_equal({'Replicate::Object' => 10}, @dumper.stats)
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_block_form_runs_complete
|
67
|
+
called = false
|
68
|
+
Replicate::Dumper.new do |dumper|
|
69
|
+
filter = lambda { |*args| }
|
70
|
+
(class <<filter;self;end).send(:define_method, :complete) { called = true }
|
71
|
+
dumper.listen filter
|
72
|
+
dumper.dump thing
|
73
|
+
assert !called
|
74
|
+
end
|
75
|
+
assert called
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_loading_dump_scripts
|
79
|
+
called = false
|
80
|
+
@dumper.listen do |type, id, attrs, obj|
|
81
|
+
assert !called
|
82
|
+
called = true
|
83
|
+
end
|
84
|
+
@dumper.load_script File.expand_path('../dumpscript.rb', __FILE__)
|
85
|
+
assert called
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_dump_scripts_can_load_additional
|
89
|
+
called = false
|
90
|
+
@dumper.listen do |type, id, attrs, obj|
|
91
|
+
assert !called
|
92
|
+
called = true
|
93
|
+
end
|
94
|
+
@dumper.load_script File.expand_path('../linked_dumpscript.rb', __FILE__)
|
95
|
+
assert called
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_load_script_uses_load_path
|
99
|
+
called = false
|
100
|
+
@dumper.listen do |type, id, attrs, obj|
|
101
|
+
assert !called
|
102
|
+
called = true
|
103
|
+
end
|
104
|
+
$LOAD_PATH << File.dirname(__FILE__)
|
105
|
+
@dumper.load_script 'linked_dumpscript'
|
106
|
+
assert called
|
107
|
+
end
|
108
|
+
end
|
data/test/dumpscript.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
dump Replicate::Object.new('message' => 'hello')
|
@@ -0,0 +1 @@
|
|
1
|
+
load_script File.expand_path('../dumpscript.rb', __FILE__)
|
data/test/loader_test.rb
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
require 'replicate'
|
3
|
+
require 'stringio'
|
4
|
+
|
5
|
+
class LoaderTest < Minitest::Test
|
6
|
+
def setup
|
7
|
+
@loader = Replicate::Loader.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def thing(attrs={})
|
11
|
+
attrs = {'number' => 123, 'string' => 'hello', 'time' => Time.new}.merge(attrs)
|
12
|
+
Replicate::Object.new attrs
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_basic_filter
|
16
|
+
called = false
|
17
|
+
object = thing('test' => 'value')
|
18
|
+
@loader.listen do |type, id, attrs, obj|
|
19
|
+
assert !called
|
20
|
+
assert_equal 'Replicate::Object', type
|
21
|
+
assert_equal object.id, id
|
22
|
+
assert_equal 'value', attrs['test']
|
23
|
+
assert_equal object.attributes, attrs
|
24
|
+
called = true
|
25
|
+
end
|
26
|
+
@loader.feed object.class, object.id, object.attributes
|
27
|
+
assert called
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_reading_from_io
|
31
|
+
called = false
|
32
|
+
data = Marshal.dump(['Replicate::Object', 10, {'test' => 'value'}])
|
33
|
+
@loader.listen do |type, id, attrs, obj|
|
34
|
+
assert !called
|
35
|
+
assert_equal 'Replicate::Object', type
|
36
|
+
assert_equal 'value', attrs['test']
|
37
|
+
called = true
|
38
|
+
end
|
39
|
+
@loader.read(StringIO.new(data))
|
40
|
+
assert called
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_stats
|
44
|
+
10.times do
|
45
|
+
obj = thing
|
46
|
+
@loader.feed obj.class, obj.id, obj.attributes
|
47
|
+
end
|
48
|
+
assert_equal({'Replicate::Object' => 10}, @loader.stats)
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_block_form_runs_complete
|
52
|
+
called = false
|
53
|
+
Replicate::Loader.new do |loader|
|
54
|
+
filter = lambda { |*args| }
|
55
|
+
(class <<filter;self;end).send(:define_method, :complete) { called = true }
|
56
|
+
loader.listen filter
|
57
|
+
obj = thing
|
58
|
+
loader.feed obj.class, obj.id, obj.attributes
|
59
|
+
assert !called
|
60
|
+
end
|
61
|
+
assert called
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_translating_id_attributes
|
65
|
+
objects = []
|
66
|
+
@loader.listen { |type, id, attrs, object| objects << object }
|
67
|
+
|
68
|
+
object1 = thing
|
69
|
+
@loader.feed object1.class, object1.id, object1.attributes
|
70
|
+
object2 = thing('related' => [:id, 'Replicate::Object', object1.id])
|
71
|
+
@loader.feed object2.class, object2.id, object2.attributes
|
72
|
+
|
73
|
+
assert_equal 2, objects.size
|
74
|
+
assert_equal objects[0].id, objects[1].related
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_translating_multiple_id_attributes
|
78
|
+
objects = []
|
79
|
+
@loader.listen { |type, id, attrs, object| objects << object }
|
80
|
+
|
81
|
+
members = (0..9).map { |i| thing('number' => i) }
|
82
|
+
members.each do |member|
|
83
|
+
@loader.feed member.class, member.id, member.attributes
|
84
|
+
end
|
85
|
+
|
86
|
+
ids = members.map { |m| m.id }
|
87
|
+
referencer = thing('related' => [:id, 'Replicate::Object', ids])
|
88
|
+
@loader.feed referencer.class, referencer.id, referencer.attributes
|
89
|
+
|
90
|
+
assert_equal 11, objects.size
|
91
|
+
assert_equal 10, objects.last.related.size
|
92
|
+
end
|
93
|
+
end
|
metadata
ADDED
@@ -0,0 +1,135 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: arcopy
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ryan Tomayko
|
8
|
+
- Norman Clarke
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-10-19 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activerecord
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '6.0'
|
21
|
+
type: :development
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '6.0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: sqlite3
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - "~>"
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 1.4.2
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: 1.4.2
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: rake
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: minitest
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: minitest-around
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
description: Dump and load relational objects between Ruby environments.
|
85
|
+
email: norman@njclarke.com
|
86
|
+
executables:
|
87
|
+
- replicate
|
88
|
+
extensions: []
|
89
|
+
extra_rdoc_files: []
|
90
|
+
files:
|
91
|
+
- COPYING
|
92
|
+
- HACKING
|
93
|
+
- README.md
|
94
|
+
- Rakefile
|
95
|
+
- bin/replicate
|
96
|
+
- lib/replicate.rb
|
97
|
+
- lib/replicate/active_record.rb
|
98
|
+
- lib/replicate/dumper.rb
|
99
|
+
- lib/replicate/emitter.rb
|
100
|
+
- lib/replicate/loader.rb
|
101
|
+
- lib/replicate/object.rb
|
102
|
+
- lib/replicate/status.rb
|
103
|
+
- test/active_record_test.rb
|
104
|
+
- test/dumper_test.rb
|
105
|
+
- test/dumpscript.rb
|
106
|
+
- test/linked_dumpscript.rb
|
107
|
+
- test/loader_test.rb
|
108
|
+
- test/replicate_test.rb
|
109
|
+
homepage: http://github.com/norman/replicate
|
110
|
+
licenses: []
|
111
|
+
metadata: {}
|
112
|
+
post_install_message:
|
113
|
+
rdoc_options: []
|
114
|
+
require_paths:
|
115
|
+
- lib
|
116
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
117
|
+
requirements:
|
118
|
+
- - ">="
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '0'
|
121
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - ">="
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
requirements: []
|
127
|
+
rubygems_version: 3.2.15
|
128
|
+
signing_key:
|
129
|
+
specification_version: 2
|
130
|
+
summary: Dump and load relational objects between Ruby environments.
|
131
|
+
test_files:
|
132
|
+
- test/active_record_test.rb
|
133
|
+
- test/dumper_test.rb
|
134
|
+
- test/loader_test.rb
|
135
|
+
- test/replicate_test.rb
|