hprevalence 0.1.1 → 0.2.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/lib/hprevalence.rb +28 -181
- data/lib/internal/command_logger.rb +11 -34
- data/lib/internal/marshallers/default.rb +17 -0
- data/lib/internal/marshallers/soap_marshaller.rb +26 -0
- data/lib/internal/marshallers/yaml_marshaller.rb +22 -0
- data/lib/internal/serializer.rb +38 -52
- data/lib/internal/store_manager.rb +9 -24
- data/rakefile.rb +1 -1
- data/samples/simple/main.rb +10 -0
- data/{test → samples/simple}/task_model.rb +0 -12
- data/samples/transparent/task_model.rb +36 -0
- data/test/command_logger_test.rb +2 -6
- data/test/default_model_serializer_test.rb +9 -8
- data/test/marshaller_test.rb +68 -0
- data/test/models/task_model.rb +91 -0
- data/test/simple_engine_test.rb +22 -5
- data/test/simple_engine_with_soap_test.rb +94 -0
- data/test/simple_engine_with_yaml_test.rb +94 -0
- metadata +12 -10
- data/lib/transparent.rb +0 -245
- data/test/circular_reference_test.rb +0 -96
- data/test/dvd_store_model.rb +0 -97
- data/test/natural_object_model_test.rb +0 -143
- data/test/project_model.rb +0 -99
- data/test/restoring_test.rb +0 -54
- data/test/transparent_module_test.rb +0 -115
@@ -2,10 +2,15 @@
|
|
2
2
|
module HPrevalence
|
3
3
|
|
4
4
|
class StorageManager
|
5
|
-
|
6
|
-
def initialize(
|
7
|
-
|
8
|
-
|
5
|
+
|
6
|
+
def initialize(
|
7
|
+
target_dir,
|
8
|
+
iomanager = FileIOManager.new(target_dir),
|
9
|
+
marshaller = DefaultMarshaller.new(),
|
10
|
+
model_serializer = DefaultModelSerializer.new(iomanager, marshaller) )
|
11
|
+
|
12
|
+
@model_serializer = model_serializer
|
13
|
+
@logger = CommandLogger.new(iomanager, marshaller)
|
9
14
|
@comand_store = nil
|
10
15
|
end
|
11
16
|
|
@@ -50,25 +55,5 @@ module HPrevalence
|
|
50
55
|
end
|
51
56
|
|
52
57
|
end
|
53
|
-
|
54
|
-
#
|
55
|
-
#
|
56
|
-
#
|
57
|
-
class TransparentStorageManager < StorageManager
|
58
|
-
|
59
|
-
def initialize( engine, target_dir, iomanager = FileIOManager.new(target_dir), logger = CommandLogger.new(iomanager), model_serializer = DefaultModelSerializer.new(iomanager) )
|
60
|
-
super( target_dir, iomanager, logger, model_serializer )
|
61
|
-
@engine = engine
|
62
|
-
end
|
63
58
|
|
64
|
-
def restore( system )
|
65
|
-
@engine.within_engine {
|
66
|
-
system = restore_snapshot( system )
|
67
|
-
restore_commands( system )
|
68
|
-
}
|
69
|
-
system
|
70
|
-
end
|
71
|
-
|
72
|
-
end
|
73
|
-
|
74
59
|
end
|
data/rakefile.rb
CHANGED
@@ -0,0 +1,10 @@
|
|
1
|
+
|
2
|
+
require 'tkclass'
|
3
|
+
|
4
|
+
root = TkRoot.new() { title "More Widgets" }
|
5
|
+
frame = TkFrame.new(root).pack("side"=>"right")
|
6
|
+
buttons = TkFrame.new(frame).pack("side"=>"bottom")
|
7
|
+
load = TkButton.new(buttons) { text "Load" }
|
8
|
+
save = TkButton.new(buttons) { text "Save" }
|
9
|
+
TkGrid.configure(load, save)
|
10
|
+
root.mainloop()
|
@@ -1,22 +1,17 @@
|
|
1
|
-
$:.unshift(File.dirname(__FILE__) + "/../lib/")
|
2
1
|
|
3
2
|
class Task
|
4
|
-
|
5
3
|
attr_accessor :name, :contents
|
6
4
|
|
7
5
|
def initialize( name, contents )
|
8
6
|
@name, @contents = name, contents
|
9
7
|
end
|
10
|
-
|
11
8
|
end
|
12
9
|
|
13
10
|
class TaskDatabase
|
14
11
|
attr_reader :tasks
|
15
|
-
attr_accessor :priority_task
|
16
12
|
|
17
13
|
def initialize()
|
18
14
|
@tasks = []
|
19
|
-
@priority_task = nil
|
20
15
|
end
|
21
16
|
|
22
17
|
def add_task( task )
|
@@ -38,11 +33,9 @@ class TaskDatabase
|
|
38
33
|
task.name == name
|
39
34
|
}
|
40
35
|
end
|
41
|
-
|
42
36
|
end
|
43
37
|
|
44
38
|
class AddTaskCommand
|
45
|
-
|
46
39
|
def initialize( task )
|
47
40
|
@task = task
|
48
41
|
end
|
@@ -50,11 +43,9 @@ class AddTaskCommand
|
|
50
43
|
def execute( system )
|
51
44
|
system.add_task( @task )
|
52
45
|
end
|
53
|
-
|
54
46
|
end
|
55
47
|
|
56
48
|
class UpdateTaskCommand
|
57
|
-
|
58
49
|
def initialize( name, new_content )
|
59
50
|
@name, @new_content = name, new_content
|
60
51
|
end
|
@@ -62,11 +53,9 @@ class UpdateTaskCommand
|
|
62
53
|
def execute( system )
|
63
54
|
system.find_task_by_name( @name ).contents = new_content
|
64
55
|
end
|
65
|
-
|
66
56
|
end
|
67
57
|
|
68
58
|
class RemoveTaskCommand
|
69
|
-
|
70
59
|
def initialize( name )
|
71
60
|
@name = name
|
72
61
|
end
|
@@ -74,5 +63,4 @@ class RemoveTaskCommand
|
|
74
63
|
def execute( system )
|
75
64
|
system.remove_task_by_name( @name )
|
76
65
|
end
|
77
|
-
|
78
66
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
|
2
|
+
class Task
|
3
|
+
attr_accessor :name, :contents
|
4
|
+
|
5
|
+
def initialize( name, contents )
|
6
|
+
@name, @contents = name, contents
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class TaskDatabase
|
11
|
+
attr_reader :tasks
|
12
|
+
|
13
|
+
def initialize()
|
14
|
+
@tasks = []
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_task( task )
|
18
|
+
@tasks << task
|
19
|
+
end
|
20
|
+
|
21
|
+
def add( name, contents )
|
22
|
+
add_task( Task.new(name, contents) )
|
23
|
+
end
|
24
|
+
|
25
|
+
def remove_task_by_name( name )
|
26
|
+
@tasks.delete_if { |task|
|
27
|
+
task.name == name
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
def find_task_by_name( name )
|
32
|
+
@tasks.find { |task|
|
33
|
+
task.name == name
|
34
|
+
}
|
35
|
+
end
|
36
|
+
end
|
data/test/command_logger_test.rb
CHANGED
@@ -2,6 +2,7 @@ $:.unshift(File.dirname(__FILE__) + "/../lib/")
|
|
2
2
|
|
3
3
|
require 'internal/command_logger'
|
4
4
|
require 'internal/iomanager'
|
5
|
+
require 'internal/marshallers/default'
|
5
6
|
require 'abstract_hprevalence_testcase'
|
6
7
|
require 'test/unit'
|
7
8
|
|
@@ -10,16 +11,11 @@ class CommandLoggerTest < Test::Unit::TestCase
|
|
10
11
|
|
11
12
|
def setup
|
12
13
|
reset_dir 'store/file_command_test'
|
13
|
-
|
14
|
-
@fc = CommandLogger.new( FileIOManager.new( @target_dir ) )
|
14
|
+
@fc = CommandLogger.new( FileIOManager.new( @target_dir ), DefaultMarshaller.new() )
|
15
15
|
end
|
16
16
|
|
17
17
|
def test_available_logs
|
18
18
|
assert_equal 0, @fc.log_files.length
|
19
|
-
|
20
|
-
ensure_dir
|
21
|
-
|
22
|
-
assert_equal 0, @fc.log_files.length
|
23
19
|
end
|
24
20
|
|
25
21
|
def test_new_log
|
@@ -2,9 +2,10 @@ $:.unshift(File.dirname(__FILE__) + "/../lib/")
|
|
2
2
|
|
3
3
|
require 'internal/iomanager'
|
4
4
|
require 'internal/serializer'
|
5
|
+
require 'internal/marshallers/default'
|
5
6
|
require 'abstract_hprevalence_testcase'
|
6
7
|
require 'test/unit'
|
7
|
-
require 'task_model'
|
8
|
+
require 'models/task_model'
|
8
9
|
|
9
10
|
class DefaultModelSerializerTest < Test::Unit::TestCase
|
10
11
|
include AbstractHPrevalenceTestHelper
|
@@ -13,15 +14,15 @@ class DefaultModelSerializerTest < Test::Unit::TestCase
|
|
13
14
|
reset_dir 'store/default_model_serializer'
|
14
15
|
ensure_dir
|
15
16
|
|
16
|
-
@serializer = DefaultModelSerializer.new( FileIOManager.new( @target_dir ) )
|
17
|
+
@serializer = DefaultModelSerializer.new( FileIOManager.new( @target_dir ), DefaultMarshaller.new() )
|
17
18
|
end
|
18
19
|
|
19
20
|
def test_dump_and_load
|
20
21
|
|
21
22
|
db = TaskDatabase.new()
|
22
|
-
db.add_task( Task.new( 'one', 'yada yada yada' ) )
|
23
|
-
db.add_task( Task.new( 'two', 'yada yada yada' ) )
|
24
|
-
db.add_task( Task.new( 'three', 'yada yada yada' ) )
|
23
|
+
db.add_task( Task.new( 'one', 'yada yada yada' ), Time.now )
|
24
|
+
db.add_task( Task.new( 'two', 'yada yada yada' ), Time.now )
|
25
|
+
db.add_task( Task.new( 'three', 'yada yada yada' ), Time.now )
|
25
26
|
db.priority_task = db.tasks[0]
|
26
27
|
|
27
28
|
@serializer.dump( db )
|
@@ -43,15 +44,15 @@ class DefaultModelSerializerTest < Test::Unit::TestCase
|
|
43
44
|
def test_multiple_snapshots
|
44
45
|
|
45
46
|
db = TaskDatabase.new()
|
46
|
-
db.add_task( Task.new( 'one', 'yada yada yada' ) )
|
47
|
+
db.add_task( Task.new( 'one', 'yada yada yada' ), Time.now )
|
47
48
|
|
48
49
|
@serializer.dump( db )
|
49
50
|
|
50
|
-
db.add_task( Task.new( 'two', 'yada yada yada' ) )
|
51
|
+
db.add_task( Task.new( 'two', 'yada yada yada' ), Time.now )
|
51
52
|
|
52
53
|
@serializer.dump( db )
|
53
54
|
|
54
|
-
db.add_task( Task.new( 'three', 'yada yada yada' ) )
|
55
|
+
db.add_task( Task.new( 'three', 'yada yada yada' ), Time.now )
|
55
56
|
|
56
57
|
@serializer.dump( db )
|
57
58
|
|
@@ -0,0 +1,68 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__) + "/../lib/")
|
2
|
+
|
3
|
+
require 'internal/marshallers/default'
|
4
|
+
require 'internal/marshallers/soap_marshaller'
|
5
|
+
require 'internal/marshallers/yaml_marshaller'
|
6
|
+
require 'abstract_hprevalence_testcase'
|
7
|
+
require 'test/unit'
|
8
|
+
require 'models/task_model'
|
9
|
+
|
10
|
+
class MarshalersTest < Test::Unit::TestCase
|
11
|
+
include AbstractHPrevalenceTestHelper
|
12
|
+
|
13
|
+
def setup
|
14
|
+
reset_dir 'store/marshallers'
|
15
|
+
ensure_dir
|
16
|
+
|
17
|
+
@db = TaskDatabase.new()
|
18
|
+
@db.add_task( Task.new('first','contents'), Time.now )
|
19
|
+
@db.add_task( Task.new('second','contents'), Time.now )
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_default
|
23
|
+
serialize_and_deserialize( DefaultMarshaller.new() )
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_soap
|
27
|
+
serialize_and_deserialize( SoapMarshaller.new() )
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_yaml
|
31
|
+
serialize_and_deserialize( YamlMarshaller.new() )
|
32
|
+
end
|
33
|
+
|
34
|
+
def serialize_and_deserialize( marshaller )
|
35
|
+
marshalled = marshaller.serialize( @db )
|
36
|
+
assert_not_nil marshalled
|
37
|
+
newdb = marshaller.restore( marshalled )
|
38
|
+
assert_not_nil newdb
|
39
|
+
assert_task newdb
|
40
|
+
|
41
|
+
file_name = File.join( @target_dir, 'temp' )
|
42
|
+
stream = File.new( file_name, 'w' )
|
43
|
+
marshaller.serialize_to_stream( '1', stream )
|
44
|
+
marshaller.serialize_to_stream( '2', stream )
|
45
|
+
marshaller.serialize_to_stream( '3', stream )
|
46
|
+
stream.close
|
47
|
+
|
48
|
+
File.open( file_name, 'r' ) { |readstream|
|
49
|
+
assert_equal '1', marshaller.restore( readstream )
|
50
|
+
assert_equal '2', marshaller.restore( readstream )
|
51
|
+
assert_equal '3', marshaller.restore( readstream )
|
52
|
+
}
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
def assert_task(newdb)
|
57
|
+
assert_equal @db.tasks.length, newdb.tasks.length
|
58
|
+
task1 = @db.tasks[0]
|
59
|
+
task2 = @db.tasks[1]
|
60
|
+
|
61
|
+
assert_equal 'first', task1.name
|
62
|
+
assert_equal 'contents', task1.contents
|
63
|
+
assert_equal 'second', task2.name
|
64
|
+
assert_equal 'contents', task2.contents
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
@@ -0,0 +1,91 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__) + "/../lib/")
|
2
|
+
|
3
|
+
class Task
|
4
|
+
|
5
|
+
attr_accessor :name, :contents, :creation
|
6
|
+
|
7
|
+
def initialize( name, contents )
|
8
|
+
@name, @contents = name, contents
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
class TaskDatabase
|
14
|
+
attr_reader :tasks
|
15
|
+
attr_accessor :priority_task
|
16
|
+
|
17
|
+
def initialize()
|
18
|
+
@tasks = []
|
19
|
+
@priority_task = nil
|
20
|
+
end
|
21
|
+
|
22
|
+
def add_task( task, time )
|
23
|
+
task.creation = time
|
24
|
+
@tasks << task
|
25
|
+
end
|
26
|
+
|
27
|
+
def remove_task_by_name( name )
|
28
|
+
@tasks.delete_if { |task|
|
29
|
+
task.name == name
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
def find_task_by_name( name )
|
34
|
+
@tasks.find { |task|
|
35
|
+
task.name == name
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
class AddTaskCommand
|
42
|
+
|
43
|
+
def initialize( task )
|
44
|
+
@task = task
|
45
|
+
end
|
46
|
+
|
47
|
+
def now=(value)
|
48
|
+
@now = value
|
49
|
+
end
|
50
|
+
|
51
|
+
def execute( system )
|
52
|
+
system.add_task( @task, @now )
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
class SetPriorityTaskCommand
|
58
|
+
|
59
|
+
def initialize( task_name )
|
60
|
+
@task_name = task_name
|
61
|
+
end
|
62
|
+
|
63
|
+
def execute( system )
|
64
|
+
system.priority_task = system.find_task_by_name( @task_name )
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
class UpdateTaskCommand
|
70
|
+
|
71
|
+
def initialize( name, new_content )
|
72
|
+
@name, @new_content = name, new_content
|
73
|
+
end
|
74
|
+
|
75
|
+
def execute( system )
|
76
|
+
system.find_task_by_name( @name ).contents = new_content
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
class RemoveTaskCommand
|
82
|
+
|
83
|
+
def initialize( name )
|
84
|
+
@name = name
|
85
|
+
end
|
86
|
+
|
87
|
+
def execute( system )
|
88
|
+
system.remove_task_by_name( @name )
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
data/test/simple_engine_test.rb
CHANGED
@@ -3,7 +3,7 @@ $:.unshift(File.dirname(__FILE__) + "/../lib/")
|
|
3
3
|
require 'hprevalence'
|
4
4
|
require 'test/unit'
|
5
5
|
require 'abstract_hprevalence_testcase'
|
6
|
-
require 'task_model'
|
6
|
+
require 'models/task_model'
|
7
7
|
|
8
8
|
class SimpleEngineTest < Test::Unit::TestCase
|
9
9
|
include AbstractHPrevalenceTestHelper
|
@@ -35,24 +35,41 @@ class SimpleEngineTest < Test::Unit::TestCase
|
|
35
35
|
@engine.execute_command( AddTaskCommand.new( task ) )
|
36
36
|
|
37
37
|
assert_equal 1, @system.tasks.length
|
38
|
+
creation = task.creation
|
39
|
+
assert_not_nil creation
|
38
40
|
|
39
41
|
load_engine
|
40
42
|
|
41
43
|
assert_equal 1, @system.tasks.length
|
44
|
+
creation2 = @system.tasks[0].creation
|
45
|
+
assert_equal creation, creation2
|
46
|
+
|
42
47
|
assert_equal 'put the cat out', @system.tasks[0].name
|
43
48
|
assert_equal 'Before go sleep, put the cat out otherwise he will meow during the night', @system.tasks[0].contents
|
44
49
|
end
|
45
50
|
|
51
|
+
def test_same_object
|
52
|
+
task = Task.new( 'first', 'content' )
|
53
|
+
@engine.execute_command( AddTaskCommand.new( task ) )
|
54
|
+
@engine.execute_command( SetPriorityTaskCommand.new('first') )
|
55
|
+
|
56
|
+
assert_equal 1, @system.tasks.length
|
57
|
+
assert_not_nil @system.priority_task
|
58
|
+
|
59
|
+
load_engine
|
60
|
+
|
61
|
+
assert_not_nil @system.priority_task
|
62
|
+
assert_equal 1, @system.tasks.length
|
63
|
+
assert_equal @system.priority_task, @system.tasks[0]
|
64
|
+
end
|
65
|
+
|
46
66
|
def test_add_and_remove
|
47
67
|
task = Task.new( 'one', 'Before go sleep, put the cat out otherwise he will meow during the night' )
|
48
68
|
@engine.execute_command( AddTaskCommand.new( task ) )
|
49
69
|
task = Task.new( 'two', 'Brush your teeth before go to bed' )
|
50
70
|
@engine.execute_command( AddTaskCommand.new( task ) )
|
51
|
-
|
52
71
|
assert_equal 2, @system.tasks.length
|
53
|
-
|
54
|
-
@engine.execute_command( RemoveTaskCommand.new( 'two' ) )
|
55
|
-
|
72
|
+
@engine.execute_command( RemoveTaskCommand.new( 'two' ) )
|
56
73
|
assert_equal 1, @system.tasks.length
|
57
74
|
|
58
75
|
load_engine
|