sadie 0.1.7 → 0.1.8
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 +4 -4
- data/CHANGELOG +2 -1
- data/Rakefile +12 -1
- data/doc/{v2 → planning/brainstorm.txt} +13 -1
- data/doc/planning/todo.examples.txt +7 -0
- data/lib/primer.rb +3 -0
- data/lib/sadie/version.rb +1 -1
- data/lib/sadie_server.rb +43 -4
- data/lib/sadie_session.rb +17 -3
- data/lib/sadie_storage_manager.rb +18 -12
- data/lib/storage/file.rb +50 -0
- data/spec/primer.rb +55 -41
- data/spec/sadie_server.rb +34 -2
- data/spec/sadie_server_lib.rb +7 -4
- data/spec/sadie_session.rb +90 -41
- data/spec/storage_mechanisms/file.rb +31 -0
- data/test/v2/another_test_installation/config/sadie.yml +4 -0
- data/test/v2/another_test_installation/primers/minimal.rb +5 -0
- data/test/v2/test_installation/config/sadie.yml +4 -0
- metadata +9 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3d35237ce7365435d796e102a1e8d8e2455d9363
|
4
|
+
data.tar.gz: 03e110b3da7e3ab6d6ad0445e3a7c6ce357fdb55
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f148d1da7eb8101b19d167ffb72fa7b1b0918093254fe62eaea3c915322b8658646150bbd89239a6ad31e29d73569977dbd9a4d5a05716f4eb2b351a343e6a6
|
7
|
+
data.tar.gz: 8e849601b5ea45613827de33250b67f31cc980aed5d306f6b051bc9438416b9f5a48f0f8f57d6795c53a48f7e11604308a8ddcbc55b8dd39fd2e0d0fc6d69b02
|
data/CHANGELOG
CHANGED
@@ -25,4 +25,5 @@
|
|
25
25
|
[0.0.50] fixed isset? bug (was only working for non-expensive keys)
|
26
26
|
[0.0.51] eacher bugfix. now correctly handles specific keys.
|
27
27
|
[0.0.52] code cleanup
|
28
|
-
[0.1.01] ** ground-up rewrite, ignore everything before this line if you're not a historian **
|
28
|
+
[0.1.01] ** ground-up rewrite, ignore everything before this line if you're not a historian **
|
29
|
+
[0.1.8] new version now at capability pairing with old version.
|
data/Rakefile
CHANGED
@@ -13,16 +13,27 @@ end
|
|
13
13
|
|
14
14
|
namespace :spec do
|
15
15
|
|
16
|
+
desc "run all spec tests"
|
17
|
+
task :all => [ 'spec:sadie_server_lib', 'spec:storage_mechanism:memory',
|
18
|
+
'spec:storage_mechanism:memory', 'spec:primer', 'spec:storage_manager',
|
19
|
+
'spec:session', 'spec:server' ]do
|
20
|
+
a = 1 # a do nothing statement
|
21
|
+
end
|
22
|
+
|
16
23
|
desc "test sadie server library"
|
17
24
|
task :sadie_server_lib do
|
18
25
|
system "rspec spec/sadie_server_lib.rb"
|
19
26
|
end
|
20
27
|
|
21
28
|
namespace :storage_mechanism do
|
22
|
-
desc "test the memory
|
29
|
+
desc "test the memory-based storage mechanism"
|
23
30
|
task :memory do
|
24
31
|
system "rspec spec/storage_mechanisms/memory.rb"
|
25
32
|
end
|
33
|
+
desc "test the file-based storage mechanism"
|
34
|
+
task :file do
|
35
|
+
system "rspec spec/storage_mechanisms/file.rb"
|
36
|
+
end
|
26
37
|
end
|
27
38
|
|
28
39
|
desc "test primer"
|
@@ -158,4 +158,16 @@ It should be possible to choose the method of storage for an item
|
|
158
158
|
end
|
159
159
|
end
|
160
160
|
|
161
|
-
|
161
|
+
It should also be possible to set the default method of storage
|
162
|
+
|
163
|
+
expire and refresh should accept the same triggers, which should be pluggable and should include, by default,
|
164
|
+
|
165
|
+
* file changes
|
166
|
+
* database table changes
|
167
|
+
* git repository updates
|
168
|
+
|
169
|
+
it should be possible to incorporate tests into the framework
|
170
|
+
|
171
|
+
it should be possible to regularly run tests and make the output available as sadie data
|
172
|
+
|
173
|
+
Right now, there's a refresh thread, an expiry thread, and the main thread, which essentially serves the get and set methods. The set and unset methods are protected by the @storage_manager_thread_mutex such that the set and unset can never run at the same time and, similarly, only a single set or unset can be in operation at the same time. And this is good. But the next iteration will target a distributed deployment of cooperating sadie instances which share a redis server (or cluster) and a filesystem (possibly distributed via nfs or something similar) or an s3 bucket. So, at this point, a simple mutex isn't really going to cut it. I've found a redis-mutex gem that will be of some assistance. But really what's needed is an abstraction on the locking mechanism...ideally even configurable to the point where I can sub in another in an initializer file...one that makes sense locally and in a distributed context.
|
@@ -0,0 +1,7 @@
|
|
1
|
+
===ActiveRecord/ActiveModel
|
2
|
+
|
3
|
+
=Updating internal models based on git repo
|
4
|
+
A great example would be to update activerecord and/or activemodel data representations based on changes in a git repo. This could, in turn, fire off a series of tests that could 1) accept the changes and notify or 2) reject the changes, revert to earlier version and notify
|
5
|
+
|
6
|
+
=Updating ActiveRecord database using internal models
|
7
|
+
It would be handy to show how Sadie could augment a Rails site by using ActiveRecord models to update the database on which the Rails site depends. Data mining would be an appropriate task to illustrate.
|
data/lib/primer.rb
CHANGED
data/lib/sadie/version.rb
CHANGED
data/lib/sadie_server.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
require 'sadie_session'
|
2
|
+
require 'yaml'
|
3
|
+
require 'pp'
|
2
4
|
|
3
5
|
class SadieServer
|
4
6
|
|
5
|
-
attr_accessor :framework_dirpath
|
6
|
-
def initialize( params )
|
7
|
+
attr_accessor :framework_dirpath, :default_storage_mechanism
|
8
|
+
def initialize( params=nil )
|
7
9
|
self.framework_dirpath = "/var/sadie"
|
10
|
+
self.default_storage_mechanism = :memory
|
8
11
|
unless params.nil?
|
9
12
|
if params.is_a? Hash
|
10
13
|
if params.has_key?( :framework_dirpath )
|
@@ -12,7 +15,25 @@ class SadieServer
|
|
12
15
|
end
|
13
16
|
end
|
14
17
|
end
|
15
|
-
|
18
|
+
|
19
|
+
sess_params = {
|
20
|
+
:primers_dirpath => File.join( self.framework_dirpath, 'primers' )
|
21
|
+
}
|
22
|
+
if _config_hash.is_a?( Hash ) &&
|
23
|
+
_config_hash.has_key?( 'storage' ) &&
|
24
|
+
_config_hash['storage'].is_a?( Hash )
|
25
|
+
if _config_hash['storage'].has_key?( 'default_storage_mechanism' )
|
26
|
+
sess_params[:default_storage_mechanism] = _config_hash['storage']['default_storage_mechanism']
|
27
|
+
end
|
28
|
+
if _config_hash['storage'].has_key?( 'file' ) &&
|
29
|
+
_config_hash['storage']['file'].is_a?( Hash ) &&
|
30
|
+
_config_hash['storage']['file'].has_key?( 'key_storage_dirpath' )
|
31
|
+
sess_params[:file_storage_mechanism_dirpath] = _config_hash['storage']['file']['key_storage_dirpath']
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
puts "sess_params: #{sess_params.pretty_inspect}"
|
36
|
+
@sadie_session = SadieSession.new( sess_params )
|
16
37
|
end
|
17
38
|
|
18
39
|
def get( key )
|
@@ -32,7 +53,25 @@ class SadieServer
|
|
32
53
|
# def get_multiple
|
33
54
|
# end
|
34
55
|
|
35
|
-
def
|
56
|
+
def _config_hash
|
57
|
+
|
58
|
+
if @config_hash.nil?
|
59
|
+
@config_hash = YAML.load_file(File.join(self.framework_dirpath,'config','sadie.yml'))
|
60
|
+
|
61
|
+
if @config_hash.is_a?( Hash )
|
62
|
+
if ( @config_hash.has_key?( 'storage' ) ) &&
|
63
|
+
( @config_hash['storage'].is_a?( Hash ) ) &&
|
64
|
+
( @config_hash['storage'].has_key?( 'default_storage_mechanism' ) )
|
65
|
+
@config_hash['storage']['default_storage_mechanism'] = @config_hash['storage']['default_storage_mechanism'].to_sym
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
@config_hash
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.proc_args( argv_param=nil )
|
36
75
|
argv = argv_param.dup
|
37
76
|
ARGV.clear
|
38
77
|
ret = nil
|
data/lib/sadie_session.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'sadie_storage_manager'
|
2
2
|
require 'storage/memory'
|
3
|
+
require 'storage/file'
|
3
4
|
require 'primer'
|
4
5
|
require 'thread'
|
5
6
|
require 'rbtree'
|
@@ -22,14 +23,25 @@ class SadieSession
|
|
22
23
|
end
|
23
24
|
|
24
25
|
@registered_key = {}
|
25
|
-
|
26
|
+
@default_storage_mechanism = :memory
|
27
|
+
@file_storage_mechanism_dirpath = nil
|
26
28
|
unless params.nil?
|
27
29
|
if params.is_a? Hash
|
30
|
+
|
28
31
|
if params.has_key?( :primers_dirpath )
|
29
32
|
self.primers_dirpath = params[:primers_dirpath]
|
30
33
|
puts "initializing session with primer dirpath: #{self.primers_dirpath}"
|
31
34
|
_register_primers
|
32
35
|
end
|
36
|
+
|
37
|
+
if params.has_key?( :default_storage_mechanism )
|
38
|
+
@default_storage_mechanism = params[:default_storage_mechanism]
|
39
|
+
end
|
40
|
+
|
41
|
+
if params.has_key?( :file_storage_mechanism_dirpath )
|
42
|
+
@file_storage_mechanism_dirpath = params[:file_storage_mechanism_dirpath]
|
43
|
+
end
|
44
|
+
|
33
45
|
end
|
34
46
|
end
|
35
47
|
|
@@ -37,6 +49,7 @@ class SadieSession
|
|
37
49
|
@storage_manager = SadieStorageManager.new
|
38
50
|
@storage_manager_thread_mutex.synchronize do
|
39
51
|
@storage_manager.register_storage_mechanism :memory, SadieStorageMechanismMemory.new
|
52
|
+
@storage_manager.register_storage_mechanism :file, SadieStorageMechanismFile.new(:key_storage_dirpath => @file_storage_mechanism_dirpath)
|
40
53
|
end
|
41
54
|
end
|
42
55
|
|
@@ -57,7 +70,7 @@ class SadieSession
|
|
57
70
|
end
|
58
71
|
|
59
72
|
def set( keys, value, params=nil )
|
60
|
-
expires, mechanism = :never,
|
73
|
+
expires, mechanism = :never, @default_storage_mechanism
|
61
74
|
unless params.nil?
|
62
75
|
if params.is_a? Hash
|
63
76
|
expires = params[:expire] if params.has_key?( :expire )
|
@@ -121,7 +134,8 @@ class SadieSession
|
|
121
134
|
|
122
135
|
def _register_primers
|
123
136
|
Dir.glob( File.join( self.primers_dirpath, "**", "*.rb" ) ).each do |primer_filepath|
|
124
|
-
p = Primer.new( :session => self
|
137
|
+
p = Primer.new( :session => self,
|
138
|
+
:default_storage_mechanism => @default_storage_mechanism )
|
125
139
|
p.mode = :registration
|
126
140
|
p.decorate( primer_filepath )
|
127
141
|
_register_keys p.keys, primer_filepath
|
@@ -2,7 +2,6 @@ class SadieStorageManager
|
|
2
2
|
|
3
3
|
def initialize
|
4
4
|
@mechanisms = {}
|
5
|
-
@known_keys = {}
|
6
5
|
end
|
7
6
|
|
8
7
|
def register_storage_mechanism( handle, mechanism )
|
@@ -10,23 +9,35 @@ class SadieStorageManager
|
|
10
9
|
end
|
11
10
|
|
12
11
|
def mechanism_is_registered?( mechanism_handle )
|
13
|
-
|
14
12
|
@mechanisms.has_key?( mechanism_handle )
|
15
|
-
|
13
|
+
end
|
14
|
+
|
15
|
+
def registered_mechanisms
|
16
|
+
@mechanisms.keys
|
17
|
+
end
|
18
|
+
|
19
|
+
def where_key?( key )
|
20
|
+
ret = nil
|
21
|
+
registered_mechanisms.each do |mech|
|
22
|
+
if @mechanisms[mech].has_key?( key )
|
23
|
+
ret = mech
|
24
|
+
break
|
25
|
+
end
|
26
|
+
end
|
27
|
+
ret
|
16
28
|
end
|
17
29
|
|
18
30
|
def has_key?( key )
|
19
|
-
|
31
|
+
( ! where_key?( key ).nil? )
|
20
32
|
end
|
21
33
|
|
22
34
|
def get( key )
|
23
|
-
@mechanisms[
|
35
|
+
@mechanisms[where_key?( key )].get( key ) if has_key?( key )
|
24
36
|
end
|
25
37
|
|
26
38
|
def unset( key )
|
27
39
|
if has_key?( key )
|
28
|
-
@mechanisms[
|
29
|
-
@known_keys.delete key
|
40
|
+
@mechanisms[where_key?( key )].unset( key )
|
30
41
|
end
|
31
42
|
end
|
32
43
|
|
@@ -44,16 +55,11 @@ class SadieStorageManager
|
|
44
55
|
|
45
56
|
params[:keys].each do |key|
|
46
57
|
@mechanisms[params[:mechanism]].set( key, params[:value] )
|
47
|
-
@known_keys[key] = params[:mechanism]
|
48
58
|
end
|
49
59
|
end
|
50
|
-
|
51
60
|
end
|
52
|
-
|
53
61
|
end
|
54
|
-
|
55
62
|
end
|
56
|
-
|
57
63
|
end
|
58
64
|
end
|
59
65
|
|
data/lib/storage/file.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'sadie_storage_mechanism'
|
2
|
+
class SadieStorageMechanismFile < SadieStorageMechanism
|
3
|
+
attr_accessor :key_storage_dirpath
|
4
|
+
|
5
|
+
def initialize( params=nil )
|
6
|
+
self.key_storage_dirpath = "/tmp/sadie-key-storage"
|
7
|
+
unless params.nil?
|
8
|
+
if params.is_a?( Hash )
|
9
|
+
if params.has_key?( :key_storage_dirpath ) && ! params[:key_storage_dirpath].nil?
|
10
|
+
self.key_storage_dirpath = params[:key_storage_dirpath]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def set( key, value )
|
17
|
+
_validate_keystorage_directory
|
18
|
+
File.open(_keyvalue_filepath(key), 'wb') { |file| file.write(value) }
|
19
|
+
end
|
20
|
+
|
21
|
+
def get( key )
|
22
|
+
_validate_keystorage_directory
|
23
|
+
value = File.open(_keyvalue_filepath(key), 'rb') { |f| f.read }
|
24
|
+
value
|
25
|
+
end
|
26
|
+
|
27
|
+
def unset( key )
|
28
|
+
_validate_keystorage_directory
|
29
|
+
File.delete(_keyvalue_filepath(key))
|
30
|
+
end
|
31
|
+
|
32
|
+
def has_key?( key )
|
33
|
+
_validate_keystorage_directory
|
34
|
+
File.exists?(_keyvalue_filepath(key))
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def _validate_keystorage_directory
|
40
|
+
raise "Key storage directory (#{self.key_storage_dirpath}) does not exist" unless _keystorage_directory_exists?
|
41
|
+
end
|
42
|
+
|
43
|
+
def _keyvalue_filepath(key)
|
44
|
+
File.join(self.key_storage_dirpath,key)
|
45
|
+
end
|
46
|
+
|
47
|
+
def _keystorage_directory_exists?
|
48
|
+
Dir.exists?( self.key_storage_dirpath )
|
49
|
+
end
|
50
|
+
end
|
data/spec/primer.rb
CHANGED
@@ -9,29 +9,40 @@ require 'pp'
|
|
9
9
|
|
10
10
|
describe Primer do
|
11
11
|
|
12
|
+
before :each do
|
13
|
+
system 'install -d /tmp/sadie-test-keystor'
|
14
|
+
@session = SadieSession.new(
|
15
|
+
:primers_dirpath =>
|
16
|
+
File.join(
|
17
|
+
File.dirname( __FILE__ ), '..','test','v2',
|
18
|
+
'test_installation','primers'
|
19
|
+
),
|
20
|
+
:file_storage_mechanism_dirpath => '/tmp/sadie-test-keystor'
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
after :each do
|
25
|
+
system 'rm -rf /tmp/sadie-test-keystor'
|
26
|
+
end
|
27
|
+
|
12
28
|
it "should default to the memory storage mechanism" do
|
13
29
|
p = Primer.new
|
14
30
|
p.storage_mechanism.should == :memory
|
15
31
|
end
|
16
32
|
|
17
33
|
it "should be able to successfully set using a storage manager" do
|
18
|
-
|
19
|
-
p = Primer.new( :session => session )
|
34
|
+
p = Primer.new( :session => @session )
|
20
35
|
p.prime [ "simple.test"] do
|
21
36
|
p.assign [ "simple.test" ] do
|
22
37
|
p.set( "simple.value" )
|
23
38
|
end
|
24
39
|
end
|
25
|
-
session.get( "simple.test" ).should == "simple.value"
|
40
|
+
@session.get( "simple.test" ).should == "simple.value"
|
26
41
|
end
|
27
42
|
|
28
43
|
it "should not allow assignment for keys not mentioned in the prime directive" do
|
29
44
|
expect {
|
30
|
-
|
31
|
-
# storage = SadieStorageManager.new
|
32
|
-
# mech = SadieStorageMechanismMemory.new
|
33
|
-
# storage.register_storage_mechanism :memory, mech
|
34
|
-
p = Primer.new( :session => session )
|
45
|
+
p = Primer.new( :session => @session )
|
35
46
|
p.prime [ "simple.test"] do
|
36
47
|
p.assign [ "simple.other" ]
|
37
48
|
end
|
@@ -41,8 +52,7 @@ describe Primer do
|
|
41
52
|
|
42
53
|
it "should not allow set for keys not mentioned in the assign directive" do
|
43
54
|
expect {
|
44
|
-
|
45
|
-
p = Primer.new( :session => session )
|
55
|
+
p = Primer.new( :session => @session )
|
46
56
|
p.prime [ "simple.test"] do
|
47
57
|
p.assign [ "simple.test" ] do
|
48
58
|
p.set ["simple.other"], "someval"
|
@@ -52,55 +62,50 @@ describe Primer do
|
|
52
62
|
end
|
53
63
|
|
54
64
|
it "should be ok to use strings instead of arrays for prime" do
|
55
|
-
|
56
|
-
p = Primer.new( :session => session )
|
65
|
+
p = Primer.new( :session => @session )
|
57
66
|
p.prime "simple.test" do
|
58
67
|
p.assign [ "simple.test" ] do
|
59
68
|
p.set "someval"
|
60
69
|
end
|
61
70
|
end
|
62
|
-
session.get("simple.test").should == "someval"
|
71
|
+
@session.get("simple.test").should == "someval"
|
63
72
|
end
|
64
73
|
|
65
74
|
it "should be ok to use strings instead of arrays for assign" do
|
66
|
-
|
67
|
-
p = Primer.new( :session => session )
|
75
|
+
p = Primer.new( :session => @session )
|
68
76
|
p.prime ["simple.test"] do
|
69
77
|
p.assign "simple.test" do
|
70
78
|
p.set "someval"
|
71
79
|
end
|
72
80
|
end
|
73
|
-
session.get("simple.test").should == "someval"
|
81
|
+
@session.get("simple.test").should == "someval"
|
74
82
|
end
|
75
83
|
|
76
84
|
it "should be ok to use strings instead of arrays for set" do
|
77
|
-
|
78
|
-
p = Primer.new( :session => session )
|
85
|
+
p = Primer.new( :session => @session )
|
79
86
|
p.prime ["simple.test"] do
|
80
87
|
p.assign "simple.test" do
|
81
88
|
p.set "simple.test","someval"
|
82
89
|
end
|
83
90
|
end
|
84
|
-
session.get("simple.test").should == "someval"
|
91
|
+
@session.get("simple.test").should == "someval"
|
85
92
|
end
|
86
93
|
|
87
94
|
it "should successfully load a primer file using decorate method" do
|
88
|
-
|
89
|
-
p = Primer.new( :session => session )
|
95
|
+
p = Primer.new( :session => @session )
|
90
96
|
p.decorate( File.join(File.dirname(__FILE__), '..', 'test', 'v2', 'test_installation', 'primers', 'minimal.rb') )
|
91
|
-
session.get( "minimal.primer" ).should == "testval"
|
97
|
+
@session.get( "minimal.primer" ).should == "testval"
|
92
98
|
end
|
93
99
|
|
94
100
|
it "should successfully execute before each clauses" do
|
95
101
|
|
96
|
-
|
97
|
-
p = Primer.new( :session => session )
|
102
|
+
p = Primer.new( :session => @session )
|
98
103
|
def p.get_r
|
99
104
|
@r
|
100
105
|
end
|
101
106
|
p.decorate( File.join(File.dirname(__FILE__), '..', 'test', 'v2', 'test_installation', 'primers', 'test_before_each.rb') )
|
102
|
-
session.get( "test.var1" ).should == "val1"
|
103
|
-
session.get( "test.var2" ).should == "val2"
|
107
|
+
@session.get( "test.var1" ).should == "val1"
|
108
|
+
@session.get( "test.var2" ).should == "val2"
|
104
109
|
r= p.get_r
|
105
110
|
r.has_key?("test.var1").should be_true
|
106
111
|
r.has_key?("test.var2").should be_true
|
@@ -110,14 +115,13 @@ describe Primer do
|
|
110
115
|
|
111
116
|
it "should successfully execute before key clauses" do
|
112
117
|
|
113
|
-
|
114
|
-
p = Primer.new( :session => session )
|
118
|
+
p = Primer.new( :session => @session )
|
115
119
|
def p.get_r
|
116
120
|
@r
|
117
121
|
end
|
118
122
|
p.decorate( File.join(File.dirname(__FILE__), '..', 'test', 'v2', 'test_installation', 'primers', 'test_before_key.rb') )
|
119
|
-
session.get( "test.var1" ).should == "val1"
|
120
|
-
session.get( "test.var2" ).should == "val2"
|
123
|
+
@session.get( "test.var1" ).should == "val1"
|
124
|
+
@session.get( "test.var2" ).should == "val2"
|
121
125
|
r= p.get_r
|
122
126
|
r.has_key?("test.var1").should be_true
|
123
127
|
r.has_key?("test.var2").should be_false
|
@@ -126,14 +130,13 @@ describe Primer do
|
|
126
130
|
|
127
131
|
it "should successfully execute after each clauses" do
|
128
132
|
|
129
|
-
|
130
|
-
p = Primer.new( :session => session )
|
133
|
+
p = Primer.new( :session => @session )
|
131
134
|
def p.get_r
|
132
135
|
@r
|
133
136
|
end
|
134
137
|
p.decorate( File.join(File.dirname(__FILE__), '..', 'test', 'v2', 'test_installation', 'primers', 'test_after_each.rb') )
|
135
|
-
session.get( "test.var1" ).should == "val1"
|
136
|
-
session.get( "test.var2" ).should == "val2"
|
138
|
+
@session.get( "test.var1" ).should == "val1"
|
139
|
+
@session.get( "test.var2" ).should == "val2"
|
137
140
|
r= p.get_r
|
138
141
|
r.has_key?("test.var1").should be_true
|
139
142
|
r.has_key?("test.var2").should be_true
|
@@ -143,14 +146,13 @@ describe Primer do
|
|
143
146
|
|
144
147
|
it "should successfully execute after key clauses" do
|
145
148
|
|
146
|
-
|
147
|
-
p = Primer.new( :session => session )
|
149
|
+
p = Primer.new( :session => @session )
|
148
150
|
def p.get_r
|
149
151
|
@r
|
150
152
|
end
|
151
153
|
p.decorate( File.join(File.dirname(__FILE__), '..', 'test', 'v2', 'test_installation', 'primers', 'test_after_key.rb') )
|
152
|
-
session.get( "test.var1" ).should == "val1"
|
153
|
-
session.get( "test.var2" ).should == "val2"
|
154
|
+
@session.get( "test.var1" ).should == "val1"
|
155
|
+
@session.get( "test.var2" ).should == "val2"
|
154
156
|
r= p.get_r
|
155
157
|
r.has_key?("test.var1").should be_true
|
156
158
|
r.has_key?("test.var2").should be_false
|
@@ -158,10 +160,22 @@ describe Primer do
|
|
158
160
|
end
|
159
161
|
|
160
162
|
it "should set the refresh rate" do
|
161
|
-
|
162
|
-
p = Primer.new( :session => session )
|
163
|
+
p = Primer.new( :session => @session )
|
163
164
|
p.decorate( File.join(File.dirname(__FILE__), '..', 'test', 'v2', 'test_installation', 'primers', 'test_refresh.rb') )
|
164
|
-
p.refresh_rate.should ==
|
165
|
+
p.refresh_rate.should == 1
|
166
|
+
end
|
167
|
+
|
168
|
+
it "should be possible to set the default storage mechanism" do
|
169
|
+
p1 = Primer.new( :session => @session )
|
170
|
+
p2 = Primer.new( :session => @session, :default_storage_mechanism => :file )
|
171
|
+
def p1.get_default_stormech
|
172
|
+
self.storage_mechanism
|
173
|
+
end
|
174
|
+
def p2.get_default_stormech
|
175
|
+
self.storage_mechanism
|
176
|
+
end
|
177
|
+
p1.get_default_stormech.should == :memory
|
178
|
+
p2.get_default_stormech.should == :file
|
165
179
|
end
|
166
180
|
|
167
181
|
end
|
data/spec/sadie_server.rb
CHANGED
@@ -4,8 +4,8 @@ $:.unshift File.join(File.dirname(__FILE__), '..')
|
|
4
4
|
require 'sadie_server'
|
5
5
|
|
6
6
|
class SadieServer
|
7
|
-
def self.proc_args( argv )
|
8
|
-
{ :framework_dirpath => File.join( File.dirname( __FILE__ ), '..','test','v2','
|
7
|
+
def self.proc_args( argv=nil )
|
8
|
+
{ :framework_dirpath => File.join( File.dirname( __FILE__ ), '..','test','v2','another_test_installation' ) }
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
@@ -20,6 +20,14 @@ describe 'the sadie server app' do
|
|
20
20
|
Sinatra::Application
|
21
21
|
end
|
22
22
|
|
23
|
+
before :each do
|
24
|
+
system 'install -d /tmp/sadie-test-keystor'
|
25
|
+
end
|
26
|
+
|
27
|
+
after :each do
|
28
|
+
system 'rm -rf /tmp/sadie-test-keystor'
|
29
|
+
end
|
30
|
+
|
23
31
|
it "returns the correct value" do
|
24
32
|
get '/minimal.primer'
|
25
33
|
expect(last_response).to be_ok
|
@@ -36,4 +44,28 @@ describe 'the sadie server app' do
|
|
36
44
|
expect(last_response).to be_ok
|
37
45
|
expect(last_response.body).to eq('testval99')
|
38
46
|
end
|
47
|
+
|
48
|
+
it "should return the config as a hash" do
|
49
|
+
srv = SadieServer.new( SadieServer::proc_args )
|
50
|
+
srv._config_hash.is_a?( Hash ).should be_true
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should return the default storage mechanism config val as a symbol" do
|
54
|
+
srv = SadieServer.new( SadieServer::proc_args )
|
55
|
+
srv._config_hash['storage']['default_storage_mechanism'].is_a?(Symbol).should be_true
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should initialize the session with the default storage mechanism" do
|
59
|
+
srv = SadieServer.new( SadieServer::proc_args )
|
60
|
+
def srv.get_session
|
61
|
+
@sadie_session
|
62
|
+
end
|
63
|
+
sess = srv.get_session
|
64
|
+
puts "sess: #{sess.pretty_inspect}"
|
65
|
+
def sess.get_default_storage_mechanism
|
66
|
+
@default_storage_mechanism
|
67
|
+
end
|
68
|
+
sess.get_default_storage_mechanism.should == :file
|
69
|
+
end
|
70
|
+
|
39
71
|
end
|
data/spec/sadie_server_lib.rb
CHANGED
@@ -1,17 +1,20 @@
|
|
1
1
|
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
2
2
|
require 'sadie_server'
|
3
3
|
require 'pp'
|
4
|
+
|
5
|
+
test_framework_dirpath = File.join( File.dirname(__FILE__), '..', 'test', 'v2', 'test_installation')
|
6
|
+
|
4
7
|
describe SadieServer do
|
5
8
|
|
6
9
|
describe '#proc_args' do
|
7
10
|
|
8
11
|
it "should accept a framework-dirpath arg" do
|
9
12
|
|
10
|
-
result = SadieServer::proc_args ["--framework-dirpath
|
13
|
+
result = SadieServer::proc_args ["--framework-dirpath=#{test_framework_dirpath}"]
|
11
14
|
result.should_not be_nil
|
12
15
|
result.is_a?( Hash ).should be_true
|
13
16
|
result.has_key?( :framework_dirpath ).should be_true
|
14
|
-
result[:framework_dirpath].should ==
|
17
|
+
result[:framework_dirpath].should == test_framework_dirpath
|
15
18
|
|
16
19
|
end
|
17
20
|
|
@@ -21,8 +24,8 @@ describe SadieServer do
|
|
21
24
|
|
22
25
|
it "should store the framework dirpath" do
|
23
26
|
|
24
|
-
serv = SadieServer.new( SadieServer::proc_args( ["--framework-dirpath
|
25
|
-
serv.framework_dirpath.should ==
|
27
|
+
serv = SadieServer.new( SadieServer::proc_args( ["--framework-dirpath=#{test_framework_dirpath}"] ) )
|
28
|
+
serv.framework_dirpath.should == test_framework_dirpath
|
26
29
|
|
27
30
|
end
|
28
31
|
|
data/spec/sadie_session.rb
CHANGED
@@ -3,74 +3,125 @@ require 'sadie_session'
|
|
3
3
|
require 'pp'
|
4
4
|
describe SadieSession do
|
5
5
|
|
6
|
+
before :each do
|
7
|
+
system 'install -d /tmp/sadie-test-keystor'
|
8
|
+
@session = SadieSession.new(
|
9
|
+
:primers_dirpath =>
|
10
|
+
File.join(
|
11
|
+
File.dirname( __FILE__ ), '..','test','v2',
|
12
|
+
'test_installation','primers'
|
13
|
+
),
|
14
|
+
:file_storage_mechanism_dirpath => '/tmp/sadie-test-keystor'
|
15
|
+
)
|
16
|
+
@session_default_file = SadieSession.new(
|
17
|
+
:primers_dirpath =>
|
18
|
+
File.join(
|
19
|
+
File.dirname( __FILE__ ), '..','test','v2',
|
20
|
+
'test_installation','primers'
|
21
|
+
),
|
22
|
+
:file_storage_mechanism_dirpath => '/tmp/sadie-test-keystor',
|
23
|
+
:default_storage_mechanism => :file
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
after :each do
|
28
|
+
system 'rm -rf /tmp/sadie-test-keystor'
|
29
|
+
end
|
30
|
+
|
6
31
|
it "should be able to get and set" do
|
7
|
-
session
|
8
|
-
session.
|
9
|
-
session.get('test.key').should == 'test.value'
|
32
|
+
@session.set('test.key','test.value')
|
33
|
+
@session.get('test.key').should == 'test.value'
|
10
34
|
end
|
11
35
|
|
12
36
|
it "should register primers" do
|
13
|
-
session
|
14
|
-
session.primer_registered?("minimal.primer").should be_true
|
37
|
+
@session.primer_registered?("minimal.primer").should be_true
|
15
38
|
end
|
16
39
|
|
17
40
|
it "should not execute primer assign directives" do
|
18
|
-
session
|
19
|
-
session.has_key?("minimal.primer").should be_false
|
41
|
+
@session.has_key?("minimal.primer").should be_false
|
20
42
|
end
|
21
43
|
|
22
44
|
it "should be possible to _get_ registered keys" do
|
23
|
-
session
|
24
|
-
session.get("minimal.primer").should == "testval"
|
45
|
+
@session.get("minimal.primer").should == "testval"
|
25
46
|
end
|
26
47
|
|
27
48
|
it "should find primers in subdirectories" do
|
28
|
-
session
|
29
|
-
session.get("subdir.test").should == "testval"
|
49
|
+
@session.get("subdir.test").should == "testval"
|
30
50
|
end
|
31
51
|
|
32
52
|
it "should be possible to expire on get" do
|
33
|
-
session
|
34
|
-
session.
|
35
|
-
session.has_key?("test.expires.onget").should be_false
|
53
|
+
@session.get("test.expires.onget").should == "testval"
|
54
|
+
@session.has_key?("test.expires.onget").should be_false
|
36
55
|
end
|
37
56
|
|
38
57
|
it "should put keys in the expire schedule" do
|
39
|
-
session
|
40
|
-
|
41
|
-
def session.in_expire_schedule?( key )
|
58
|
+
def @session.in_expire_schedule?( key )
|
42
59
|
( ! @expire_schedule.values.index(key).nil? )
|
43
60
|
end
|
44
61
|
|
45
|
-
session.get("test.expires.nsecs").should == "testval"
|
46
|
-
session.in_expire_schedule?("test.expires.nsecs").should be true
|
62
|
+
@session.get("test.expires.nsecs").should == "testval"
|
63
|
+
@session.in_expire_schedule?("test.expires.nsecs").should be true
|
47
64
|
end
|
48
65
|
|
49
66
|
it "should expire keys using _expire_pass" do
|
50
67
|
|
51
|
-
session
|
52
|
-
def session.run_expiry_pass
|
68
|
+
def @session.run_expiry_pass
|
53
69
|
_expiry_pass
|
54
70
|
end
|
55
|
-
session.stub(:_current_time).and_return(2,5,8,11,14)
|
56
|
-
session.stub(:_expiry_loop).and_return(false)
|
57
|
-
session.get("test.expires.nsecs").should == "testval"
|
58
|
-
session.has_key?("test.expires.nsecs").should be_true
|
59
|
-
session.run_expiry_pass
|
60
|
-
session.has_key?("test.expires.nsecs").should be_false
|
71
|
+
@session.stub(:_current_time).and_return(2,5,8,11,14)
|
72
|
+
@session.stub(:_expiry_loop).and_return(false)
|
73
|
+
@session.get("test.expires.nsecs").should == "testval"
|
74
|
+
@session.has_key?("test.expires.nsecs").should be_true
|
75
|
+
@session.run_expiry_pass
|
76
|
+
@session.has_key?("test.expires.nsecs").should be_false
|
61
77
|
end
|
62
78
|
|
63
79
|
it "should refresh keys" do
|
64
80
|
|
65
|
-
session
|
66
|
-
def session.run_refresh_pass
|
81
|
+
def @session.run_refresh_pass
|
67
82
|
_refresh_pass
|
68
83
|
end
|
69
|
-
session.stub(:_current_time).and_return(2,5,8,11,14)
|
70
|
-
session.stub(:_refresh_loop).and_return(false)
|
71
|
-
session.get("test.refresh").should == "refresh"
|
72
|
-
session.run_refresh_pass
|
73
|
-
session.get("test.refresh").should == "rrefresh"
|
84
|
+
@session.stub(:_current_time).and_return(2,5,8,11,14)
|
85
|
+
@session.stub(:_refresh_loop).and_return(false)
|
86
|
+
@session.get("test.refresh").should == "refresh"
|
87
|
+
@session.run_refresh_pass
|
88
|
+
@session.get("test.refresh").should == "rrefresh"
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should set the default storage mechanism" do
|
92
|
+
def @session.get_default_storage_mechanism
|
93
|
+
@default_storage_mechanism
|
94
|
+
end
|
95
|
+
@session.get_default_storage_mechanism.should == :memory
|
96
|
+
@session_default_file = SadieSession.new(
|
97
|
+
:primers_dirpath => File.join( File.dirname( __FILE__ ), '..','test','v2','test_installation','primers' ),
|
98
|
+
:default_storage_mechanism => :file)
|
99
|
+
def @session_default_file.get_default_storage_mechanism
|
100
|
+
@default_storage_mechanism
|
101
|
+
end
|
102
|
+
@session_default_file.get_default_storage_mechanism.should == :file
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should initialize the file storage mechanism with the key storage dirpath set in init params" do
|
106
|
+
def @session.storagemgr
|
107
|
+
@storage_manager
|
108
|
+
end
|
109
|
+
mgr = @session.storagemgr
|
110
|
+
def mgr.getfilemech
|
111
|
+
@mechanisms[:file]
|
112
|
+
end
|
113
|
+
filemech = mgr.getfilemech
|
114
|
+
filemech.key_storage_dirpath.should == '/tmp/sadie-test-keystor'
|
115
|
+
end
|
116
|
+
|
117
|
+
it "should store keys in different storage mechanisms" do
|
118
|
+
def @session.detect_storage_mechanism(key)
|
119
|
+
@storage_manager.where_key?( key )
|
120
|
+
end
|
121
|
+
@session.set('key1','val1',:mechanism => :memory)
|
122
|
+
@session.set('key2','val2',:mechanism => :file)
|
123
|
+
@session.detect_storage_mechanism('key1').should == :memory
|
124
|
+
@session.detect_storage_mechanism('key2').should == :file
|
74
125
|
end
|
75
126
|
|
76
127
|
# --- SLOW!
|
@@ -78,19 +129,17 @@ describe SadieSession do
|
|
78
129
|
|
79
130
|
it "should expire keys after specified time" do
|
80
131
|
|
81
|
-
session
|
82
|
-
session.
|
83
|
-
session.has_key?("test.expires.nsecs").should be_true
|
132
|
+
@session.get("test.expires.nsecs").should == "testval"
|
133
|
+
@session.has_key?("test.expires.nsecs").should be_true
|
84
134
|
sleep 2
|
85
|
-
session.has_key?("test.expires.nsecs").should be_false
|
135
|
+
@session.has_key?("test.expires.nsecs").should be_false
|
86
136
|
end
|
87
137
|
|
88
138
|
it "should refresh keys after specified time" do
|
89
139
|
|
90
|
-
session
|
91
|
-
session.get("test.refresh").should == "refresh"
|
140
|
+
@session.get("test.refresh").should == "refresh"
|
92
141
|
sleep 2
|
93
|
-
session.get("test.refresh").should == "rrefresh"
|
142
|
+
@session.get("test.refresh").should == "rrefresh"
|
94
143
|
end
|
95
144
|
|
96
145
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'storage/file'
|
2
|
+
describe SadieStorageMechanismFile do
|
3
|
+
|
4
|
+
before :each do
|
5
|
+
system 'install -d /tmp/stormech-file-test'
|
6
|
+
@mech = SadieStorageMechanismFile.new( :key_storage_dirpath => '/tmp/stormech-file-test' )
|
7
|
+
end
|
8
|
+
|
9
|
+
after :each do
|
10
|
+
system 'rm -rf /tmp/stormech-file-test'
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should successfully return a set value" do
|
14
|
+
@mech.set 'somekey.test','some_value'
|
15
|
+
@mech.get( 'somekey.test' ).should == 'some_value'
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should have a functional has_key? method" do
|
19
|
+
@mech.has_key?( "somekey.test" ).should be_false
|
20
|
+
@mech.set 'somekey.test','some_value'
|
21
|
+
@mech.has_key?( "somekey.test" ).should be_true
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should have a functional unset method" do
|
25
|
+
@mech.set 'somekey.test','some_value'
|
26
|
+
@mech.has_key?( "somekey.test" ).should be_true
|
27
|
+
@mech.unset 'somekey.test'
|
28
|
+
@mech.has_key?( "somekey.test" ).should be_false
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sadie
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fred McDavid
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sinatra
|
@@ -93,7 +93,8 @@ files:
|
|
93
93
|
- bin/sadie_query_server
|
94
94
|
- bin/sadie_server
|
95
95
|
- bin/sadie_server.rb
|
96
|
-
- doc/
|
96
|
+
- doc/planning/brainstorm.txt
|
97
|
+
- doc/planning/todo.examples.txt
|
97
98
|
- lib/.gitignore
|
98
99
|
- lib/primer.rb
|
99
100
|
- lib/sadie/version.rb
|
@@ -101,6 +102,7 @@ files:
|
|
101
102
|
- lib/sadie_session.rb
|
102
103
|
- lib/sadie_storage_manager.rb
|
103
104
|
- lib/sadie_storage_mechanism.rb
|
105
|
+
- lib/storage/file.rb
|
104
106
|
- lib/storage/memory.rb
|
105
107
|
- rdoc/classes/Sadie.html
|
106
108
|
- rdoc/created.rid
|
@@ -119,7 +121,11 @@ files:
|
|
119
121
|
- spec/sadie_server_lib.rb
|
120
122
|
- spec/sadie_session.rb
|
121
123
|
- spec/storage_manager.rb
|
124
|
+
- spec/storage_mechanisms/file.rb
|
122
125
|
- spec/storage_mechanisms/memory.rb
|
126
|
+
- test/v2/another_test_installation/config/sadie.yml
|
127
|
+
- test/v2/another_test_installation/primers/minimal.rb
|
128
|
+
- test/v2/test_installation/config/sadie.yml
|
123
129
|
- test/v2/test_installation/primers/minimal.rb
|
124
130
|
- test/v2/test_installation/primers/onelevel/twolevel/test_subdir.rb
|
125
131
|
- test/v2/test_installation/primers/test_after_each.rb
|