sadie 0.0.7 → 0.0.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.
- data/CHANGELOG +3 -1
- data/Gemfile +2 -6
- data/lib/sadie/primer_plugins/DatabaseConnection.plugin.rb +26 -0
- data/lib/sadie/primer_plugins/IniFile.plugin.rb +21 -0
- data/lib/sadie/primer_plugins/Resource.plugin.rb +7 -0
- data/lib/sadie/primer_plugins/SQLQuery.plugin.rb +21 -0
- data/lib/sadie/version.rb +1 -1
- data/lib/sadie.rb +519 -249
- data/sadie.gemspec +3 -0
- data/test/tc_sadie_toplevel.rb +2 -1
- data/test/tc_sadie_twodeep.rb +2 -1
- data/test/test_primers/.gitignore +1 -0
- data/test/test_primers/onedeep/multiresult.res +1 -3
- data/test/test_primers/toplevel_destructonget.res.rb +2 -4
- data/test/test_primers/toplevel_double.res.rb +2 -4
- data/test/test_primers/toplevel_single.res.rb +1 -3
- data/test/test_primers/two/deep/expensive.res +1 -3
- data/test/test_primers/two/deep/two_results.res +4 -3
- metadata +24 -7
- data/test/test_primers/.toplevel_double.res.rb.kate-swp +0 -0
data/CHANGELOG
CHANGED
data/Gemfile
CHANGED
@@ -1,8 +1,4 @@
|
|
1
|
-
source
|
2
|
-
source "http://rubyforge.org"
|
3
|
-
source :rubyforge
|
4
|
-
source "http://gems.rubyforge.org"
|
5
|
-
gem "ini", "~> 0.1.1"
|
1
|
+
source 'http://rubygems.org'
|
6
2
|
|
7
|
-
#
|
3
|
+
# Please see sadie.gemspec for dependency information.
|
8
4
|
gemspec
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# WARNING: THIS DOESN'T WORK YET!!!
|
2
|
+
|
3
|
+
Sadie::registerPrimerPlugin( { "match" => /\.dbi\.conx$/,
|
4
|
+
"accepts-block" => true } ) do |sadie, key_prefix, primer_file_filepath, block|
|
5
|
+
|
6
|
+
# build parameter hash
|
7
|
+
dbparams = Hash.new
|
8
|
+
inifile = Ini.new( primer_file_filepath )
|
9
|
+
inifile.each do | section, key_from_ini_file, value |
|
10
|
+
section.match(/^connection$/) \
|
11
|
+
or next
|
12
|
+
dbparams[key_from_ini_file] = value
|
13
|
+
end
|
14
|
+
|
15
|
+
# validate dbistr
|
16
|
+
dbparams.has_key( 'dbistr' ) \
|
17
|
+
or raise 'requried connection::dbistr was not defined'
|
18
|
+
|
19
|
+
# default user and pass to nil
|
20
|
+
user = dbparams.has_key('user') ? dbparams['user']: nil;
|
21
|
+
pass = dbparams.has_key('pass') ? dbparams['pass']: nil;
|
22
|
+
|
23
|
+
# call connect with block
|
24
|
+
require 'dbi'
|
25
|
+
DBI.connect( dbparams['dbistr'], user, pass, block )
|
26
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
Sadie::registerPrimerPlugin( { "match" => /\.ini$/,
|
2
|
+
"accepts-block" => false,
|
3
|
+
"prime-on-init" => true } ) do |sadie, key_prefix, primer_file_filepath|
|
4
|
+
|
5
|
+
require 'ini'
|
6
|
+
|
7
|
+
ini_file_basename = File.basename primer_file_filepath
|
8
|
+
ini_file_root = ini_file_basename.gsub( /\.ini$/, "" )
|
9
|
+
|
10
|
+
inifile = Ini.new( primer_file_filepath )
|
11
|
+
# puts "key_prefix: #{key_prefix}, primer_file_filepath: #{primer_file_filepath}"
|
12
|
+
inifile.each do | section, key_from_ini_file, value |
|
13
|
+
|
14
|
+
# compute key
|
15
|
+
# key_prefix = sadie.getCurrentPrimerKeyPrefix
|
16
|
+
key_to_set = key_prefix + "." + ini_file_root + "." +section + "." + key_from_ini_file
|
17
|
+
key_to_set = key_to_set.gsub( /^\.+/, "" )
|
18
|
+
|
19
|
+
sadie.set( key_to_set, value )
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# WARNING: THIS DOESN'T WORK YET!!!
|
2
|
+
|
3
|
+
Sadie::registerPrimerPlugin( { "match" => /\.sql$/,
|
4
|
+
"accepts-block" => true } ) do |sadie, key_prefix, primer_file_filepath, block|
|
5
|
+
|
6
|
+
# read query from file @filepath, ditch newlines
|
7
|
+
f = open( primer_file_filepath )
|
8
|
+
query = f.read
|
9
|
+
close( f )
|
10
|
+
query = query.gsub(/\n/,'')
|
11
|
+
|
12
|
+
# get the database and run query
|
13
|
+
db_key = key_prefix+".db.conx"
|
14
|
+
sadie.get( db_key ) do | dbh |
|
15
|
+
|
16
|
+
# run the query
|
17
|
+
dbh.select_all( query, block )
|
18
|
+
|
19
|
+
end
|
20
|
+
raise 'Sadie returned nil for key: #{db_key}'
|
21
|
+
end
|
data/lib/sadie/version.rb
CHANGED
data/lib/sadie.rb
CHANGED
@@ -9,7 +9,7 @@ Bundler.require(:default)
|
|
9
9
|
# ==Description: Sadie
|
10
10
|
# Sadie is a data framework intended to ease the pain of constructing, accessing, and
|
11
11
|
# managing the resources required by large stores of inter-related data. It supports
|
12
|
-
# sessions, lazy on-demand, one-time evaluation and file-based storage/retrieval
|
12
|
+
# sessions, lazy, on-demand, one-time evaluation and file-based storage/retrieval
|
13
13
|
# operations for resource-heavy data.
|
14
14
|
#
|
15
15
|
# For simplicity, it supports simple, ini-style data
|
@@ -19,47 +19,95 @@ Bundler.require(:default)
|
|
19
19
|
|
20
20
|
class Sadie
|
21
21
|
|
22
|
+
# ==method: Sadie::getSadieInstance
|
23
|
+
#
|
24
|
+
# returns a new Sadie instance. Options match those of Sadie's constructor method
|
25
|
+
def self.getSadieInstance( options )
|
26
|
+
Sadie.new(options)
|
27
|
+
end
|
28
|
+
|
29
|
+
# ==method: Sadie::setCurrentSadieInstance
|
30
|
+
#
|
31
|
+
# this is called just prior to calling a primer plugin to handle a primer to provide
|
32
|
+
# a current sadie instance for Sadie::getCurrentSadieInstance to return
|
33
|
+
def self.setCurrentSadieInstance ( instance )
|
34
|
+
@@current_sadie_instance = instance
|
35
|
+
end
|
36
|
+
|
37
|
+
# ==method: Sadie::setCurrentSadieInstance
|
38
|
+
#
|
39
|
+
# called by plugin handlers to get access to the current Sadie instance
|
40
|
+
def self.getCurrentSadieInstance
|
41
|
+
@@current_sadie_instance
|
42
|
+
end
|
43
|
+
|
44
|
+
# ==method: Sadie::Prime
|
45
|
+
#
|
46
|
+
# called my the .res files to register the keys the .res will prime for
|
47
|
+
#
|
48
|
+
# accepts as an argument a hash and a block. The hash must include the key:
|
49
|
+
# 'provides' and it must define an array
|
50
|
+
# of keys that the calling resource (.res) file will have provided after the block is
|
51
|
+
# evaluated
|
52
|
+
def self.prime ( primer_definition, &block )
|
53
|
+
current_sadie_instance = Sadie::getCurrentSadieInstance
|
54
|
+
current_sadie_instance.prime( primer_definition, &block )
|
55
|
+
end
|
56
|
+
|
57
|
+
# ==method: Sadie::registerPrimerPlugin
|
58
|
+
#
|
59
|
+
# this method is called in the .plugin.rb files to register new plugin types
|
60
|
+
#
|
61
|
+
def self.registerPrimerPlugin ( arghash, &block )
|
62
|
+
current_sadie_instance = Sadie::getCurrentSadieInstance
|
63
|
+
current_sadie_instance.registerPrimerPlugin( arghash, &block )
|
64
|
+
end
|
65
|
+
|
22
66
|
|
23
67
|
# ==method: constructor
|
24
68
|
# options can include any kay, value pairs but the following key values bear mention:
|
25
69
|
# REQUIRED
|
26
70
|
#
|
27
71
|
# sadie.sessions_dirpath
|
28
|
-
#
|
29
|
-
#
|
30
|
-
#
|
31
|
-
#
|
72
|
+
# or
|
73
|
+
# sadie.session_id
|
74
|
+
# or
|
75
|
+
# sadie.session_filepath <- this is probably a bad call, use with caution
|
32
76
|
#
|
33
77
|
# and
|
34
78
|
#
|
35
|
-
#
|
79
|
+
# sadie.primers_dirpath
|
80
|
+
#
|
81
|
+
# and
|
82
|
+
# sadie.primer_plugins_dirpath
|
36
83
|
def initialize( options )
|
37
84
|
|
38
|
-
#
|
39
|
-
|
40
|
-
|
41
|
-
@flag_primed = Hash.new
|
42
|
-
@flag_eachtimeprime = Hash.new
|
43
|
-
|
44
|
-
# init class
|
45
|
-
Sadie::_checkSanity
|
46
|
-
|
47
|
-
# init mid_primer_initialization if not already done
|
48
|
-
if ! defined? @@mid_primer_initialization
|
49
|
-
@@mid_primer_initialization = false
|
50
|
-
@@mid_primer_filepath = nil
|
51
|
-
@@mid_primer_toplevel_primer_dirpath = nil
|
52
|
-
end
|
85
|
+
# check instance sanity
|
86
|
+
_checkInstanceSanity
|
87
|
+
_checkClassSanity
|
53
88
|
|
54
89
|
# internalize defaults to shortterm
|
55
90
|
DEFAULTS.each do |key, value|
|
56
91
|
_set( key, value )
|
57
92
|
end
|
58
93
|
|
59
|
-
# internalize supplied defaults
|
94
|
+
# internalize supplied defaults, postponing a set of sadie.primers_dirpath
|
95
|
+
# until the end if one is supplied. The reason for this is that the setter
|
96
|
+
# attempts to read the plugins and if the primer plugin dirpath has not
|
97
|
+
# yet been set, then it'll choke if it processes the wrong one first
|
98
|
+
delay_set_primers_dirpath = nil
|
99
|
+
|
100
|
+
# iterate over constructor args, but do primers_dirpath last since it
|
101
|
+
# causes a call to initializePrimers
|
60
102
|
options.each do |key, value|
|
61
|
-
|
103
|
+
if ( key.eql? "sadie.primers_dirpath")
|
104
|
+
delay_set_primers_dirpath = value
|
105
|
+
else
|
106
|
+
set( key, value )
|
107
|
+
end
|
62
108
|
end
|
109
|
+
defined? delay_set_primers_dirpath \
|
110
|
+
and set( "sadie.primers_dirpath", delay_set_primers_dirpath )
|
63
111
|
|
64
112
|
# if a path to a session is given, init using session file
|
65
113
|
if defined? options[:sadie.session_filepath] && options[:sadie.session_filepath].match(/^[^\s]+$/)
|
@@ -78,23 +126,7 @@ class Sadie
|
|
78
126
|
|
79
127
|
end
|
80
128
|
|
81
|
-
|
82
|
-
#
|
83
|
-
# returns a new Sadie instance. Options match those of Sadie's constructor method
|
84
|
-
def self.getSadieInstance( options )
|
85
|
-
Sadie.new(options)
|
86
|
-
end
|
87
|
-
|
88
|
-
# ==method: Sadie::Prime
|
89
|
-
#
|
90
|
-
# called my the .res files to register the keys the .res will prime for
|
91
|
-
#
|
92
|
-
# accepts as an argument a hash and a block. The hash must include the key:
|
93
|
-
# 'provides' and it must define an array
|
94
|
-
# of keys that the calling resource (.res) file will have provided after the block is
|
95
|
-
# evaluated
|
96
|
-
def self.Prime ( primer_definition )
|
97
|
-
|
129
|
+
def prime ( primer_definition, &block )
|
98
130
|
# validate params
|
99
131
|
defined? primer_definition \
|
100
132
|
or raise "Prime called without parameters"
|
@@ -105,18 +137,17 @@ class Sadie
|
|
105
137
|
|
106
138
|
# if initializing primers, just remember how to get back to the primer later,
|
107
139
|
# otherwise, prime
|
108
|
-
if
|
140
|
+
if midPrimerInit?
|
109
141
|
|
110
142
|
# mid primer init, just memorize primer location
|
111
|
-
|
143
|
+
memorizePrimerLocation( @@mid_primer_filepath, primer_definition["provides"] )
|
112
144
|
else
|
113
145
|
|
114
146
|
# run code block with the current sadie instance
|
115
|
-
|
116
|
-
yield( current_sadie_instance )
|
147
|
+
block.call( self )
|
117
148
|
|
118
149
|
# loop thru all primer provides, ensuring each primed
|
119
|
-
current_primer_filepath =
|
150
|
+
current_primer_filepath = getCurrentPrimerFilepath
|
120
151
|
primer_definition["provides"].each do | key |
|
121
152
|
|
122
153
|
# skip blank lines
|
@@ -125,11 +156,77 @@ class Sadie
|
|
125
156
|
#puts "Prime> providing: #{key}"
|
126
157
|
|
127
158
|
# key primed or raise error
|
128
|
-
|
159
|
+
primed? key \
|
129
160
|
or raise "primer definition file: #{current_primer_filepath} was supposed to define #{key}, but did not"
|
130
161
|
end
|
131
162
|
end
|
163
|
+
|
132
164
|
end
|
165
|
+
|
166
|
+
def registerPrimerPlugin ( arghash, &block )
|
167
|
+
if midPluginInit?
|
168
|
+
|
169
|
+
# init mode, just store arghash info
|
170
|
+
accepts_block = arghash.has_key?( "accepts-block" ) && arghash["accepts-block"] ? true : false
|
171
|
+
prime_on_init = arghash.has_key?( "prime-on-init" ) && arghash["prime-on-init"] ? true : false
|
172
|
+
regPluginMatch( arghash["match"], @@mid_plugin_filepath, accepts_block, prime_on_init )
|
173
|
+
|
174
|
+
else
|
175
|
+
|
176
|
+
# prime mode
|
177
|
+
currentPrimerPluginPrimerOnInit? \
|
178
|
+
or setMidPrimerInit( @@current_primer_filepath )
|
179
|
+
key_prefix = getCurrentPrimerKeyPrefix
|
180
|
+
if currentPrimerPluginAcceptsBlock?
|
181
|
+
|
182
|
+
# call with block only if accepts block
|
183
|
+
yield( self, key_prefix, @@current_primer_filepath, block )
|
184
|
+
|
185
|
+
else
|
186
|
+
|
187
|
+
yield( self, key_prefix, @@current_primer_filepath )
|
188
|
+
|
189
|
+
end
|
190
|
+
currentPrimerPluginPrimerOnInit? \
|
191
|
+
or unsetMidPrimerInit
|
192
|
+
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
|
197
|
+
|
198
|
+
# # ==method: pathToKey
|
199
|
+
# #
|
200
|
+
# # returns a dot-separated version of the filepath such that
|
201
|
+
# # with parentify=1 returns dot path to directory file is in,
|
202
|
+
# # with parentify=2 returns dot path to directory above directory file is in, etc.
|
203
|
+
# def pathToKey( filepath, parentify=0 )
|
204
|
+
#
|
205
|
+
# # separate path into basename,dirname
|
206
|
+
# path_basename = File.basename( filepath )
|
207
|
+
# path_dirname = File.dirname( filepath )
|
208
|
+
#
|
209
|
+
# # create stack of dir components
|
210
|
+
# path_stack = Array.new
|
211
|
+
# temp_path_stack = path_dirname.split(/\//)
|
212
|
+
# temp_path_stack.each do |item|
|
213
|
+
# next if item.match(/^\s*$/)
|
214
|
+
# path_stack.push item
|
215
|
+
# end
|
216
|
+
#
|
217
|
+
# # lose the suffix on the basename
|
218
|
+
# root_path_basename = path_basename.gsub( /\.[^\.]*$/, "" )
|
219
|
+
# path_stack.push( root_path_basename )
|
220
|
+
# if parentify > 1
|
221
|
+
# parentify.times do |i|
|
222
|
+
# path_stack.pop
|
223
|
+
# end
|
224
|
+
# end
|
225
|
+
#
|
226
|
+
# path_stack.join( "," )
|
227
|
+
#
|
228
|
+
# end
|
229
|
+
|
133
230
|
|
134
231
|
# ==method: get
|
135
232
|
#
|
@@ -137,110 +234,70 @@ class Sadie
|
|
137
234
|
# completely behind-the-scenes as directed by the resource (.res) files
|
138
235
|
def get( k )
|
139
236
|
|
237
|
+
|
238
|
+
if ! isset?( k )
|
239
|
+
# prime if not yet primed
|
240
|
+
primed?( k ) or _prime( k )
|
241
|
+
end
|
242
|
+
|
243
|
+
return _recallExpensive( k ) if expensive?( k )
|
244
|
+
|
140
245
|
# if it's already set, return known answer
|
141
|
-
if
|
246
|
+
if isset?( k )
|
142
247
|
|
143
248
|
# _get the return value
|
144
249
|
return_value = _get( k )
|
145
250
|
|
146
251
|
# unset and unprime if destructOnGet?
|
147
|
-
|
148
|
-
|
149
|
-
unset( k )
|
150
|
-
unprime( k )
|
151
|
-
end
|
252
|
+
destroyOnGet?( k ) \
|
253
|
+
and destroy! k
|
152
254
|
|
153
255
|
return return_value
|
154
256
|
end
|
155
257
|
|
156
|
-
# prime if not yet primed
|
157
|
-
primed?( k ) \
|
158
|
-
or _prime( k )
|
159
|
-
|
160
|
-
# if not expensive, then return what's already known
|
161
|
-
expensive?( k ) \
|
162
|
-
and return _recallExpensive( k )
|
163
|
-
|
164
|
-
# _get the return value
|
165
|
-
return_value = _get( k )
|
166
|
-
|
167
|
-
# unset and unprime if destructOnGet?
|
168
|
-
if destructOnGet?( k )
|
169
|
-
# puts "destructing #{k}"
|
170
|
-
unset( k )
|
171
|
-
unprime( k )
|
172
|
-
end
|
173
|
-
|
174
|
-
return return_value
|
175
258
|
end
|
176
259
|
|
177
|
-
|
178
|
-
# ==method: setCheap
|
260
|
+
# ==method: isset?
|
179
261
|
#
|
180
|
-
#
|
181
|
-
|
182
|
-
|
183
|
-
expensive_filepath = _computeExpensiveFilepath( k )
|
184
|
-
serialized_value = Marshal::dump( v )
|
185
|
-
File.open(expensive_filepath, 'w') { |f|
|
186
|
-
f.write( serialized_value )
|
187
|
-
}
|
188
|
-
_expensive( k, true )
|
189
|
-
_primed( k, true )
|
262
|
+
# returns true if sadie has a value for the key
|
263
|
+
def isset?( key )
|
264
|
+
return @shortterm.has_key?( key )
|
190
265
|
end
|
191
266
|
|
192
|
-
# ==method:
|
267
|
+
# ==method: setDestroyOnGet
|
193
268
|
#
|
194
269
|
# key value will go away and key will be unprimed and unset after next get
|
195
270
|
#
|
196
271
|
# NOTE: this doesn't make sense with keys that were set via setExpensive
|
197
272
|
# so it can be set, but nothing's going to happen differently
|
198
|
-
def
|
199
|
-
# puts "setDestructOnGet( #{key}, #{turnon} )"
|
273
|
+
def setDestroyOnGet( key, turnon=true )
|
200
274
|
if ( turnon )
|
201
|
-
|
202
|
-
@flag_eachtimeprime["#{key}"] = true
|
275
|
+
@flag_destroyonget["#{key}"] = true
|
203
276
|
return true
|
204
277
|
end
|
205
|
-
@
|
206
|
-
and @
|
278
|
+
@flag_destroyonget.has_key?( key ) \
|
279
|
+
and @flag_destroyonget.delete( key )
|
280
|
+
end
|
281
|
+
|
282
|
+
# ==method: destroy!
|
283
|
+
#
|
284
|
+
# remove the key from sadie
|
285
|
+
def destroy! ( key )
|
286
|
+
unset( key )
|
287
|
+
primed?( key ) and unprime( key )
|
207
288
|
end
|
208
289
|
|
209
|
-
# ==method:
|
290
|
+
# ==method: destroyOnGet?
|
210
291
|
#
|
211
292
|
# returns true if the destructOnGet flag is set for the key
|
212
|
-
def
|
213
|
-
|
214
|
-
@flag_eachtimeprime.has_key?( key ) \
|
293
|
+
def destroyOnGet?( key )
|
294
|
+
@flag_destroyonget.has_key?( key ) \
|
215
295
|
or return _newline( false )
|
216
|
-
#
|
217
|
-
@flag_eachtimeprime["#{key}"] \
|
296
|
+
@flag_destroyonget["#{key}"] \
|
218
297
|
and return _newline( true )
|
219
|
-
# print " defined-but-false "
|
220
298
|
return _newline(false)
|
221
299
|
end
|
222
300
|
|
223
|
-
def _newline( rval=true )
|
224
|
-
#puts
|
225
|
-
return rval
|
226
|
-
end
|
227
|
-
|
228
|
-
# ==method: unset
|
229
|
-
# unsets the value of k. Note that this does not unprime, so
|
230
|
-
# get(key) will simply return nil. Run with unprime to have the
|
231
|
-
# primer run again
|
232
|
-
def unset( key )
|
233
|
-
_unset( key )
|
234
|
-
end
|
235
|
-
|
236
|
-
# ==method: unprime
|
237
|
-
# unprimes k. Note that this does not unset the value, so
|
238
|
-
# get(key) will continue to return whatever it otherwise would have.
|
239
|
-
# run unset as well to have the primer run again.
|
240
|
-
def unprime( key )
|
241
|
-
_primed( key, false )
|
242
|
-
end
|
243
|
-
|
244
301
|
# ==method: set
|
245
302
|
# alias for setCheap(k,v)
|
246
303
|
def set( k, v )
|
@@ -252,29 +309,67 @@ class Sadie
|
|
252
309
|
# the cheap setter. key, value pairs stored via this method are kept in memory
|
253
310
|
def setCheap( k, v )
|
254
311
|
|
312
|
+
# puts "setCheap( #{k}, #{v} )"
|
313
|
+
|
255
314
|
# set it, mark not expensive and primed
|
256
315
|
_set( k, v )
|
257
316
|
_expensive( k, false )
|
258
|
-
_primed( k, true )
|
259
317
|
|
260
318
|
# if we've reset the primers dirpath, init the primers
|
261
319
|
if k.eql?( "sadie.primers_dirpath" )
|
262
|
-
|
263
|
-
|
264
|
-
|
320
|
+
initializePrimers
|
321
|
+
end
|
322
|
+
|
323
|
+
_primed( k, true )
|
324
|
+
|
325
|
+
# if we've reset the primers dirpath, init the primers
|
326
|
+
if k.eql?( "sadie.primers_dirpath" )
|
327
|
+
Sadie::setCurrentSadieInstance( self )
|
265
328
|
end
|
266
329
|
|
267
330
|
end
|
268
331
|
|
332
|
+
def cheap?( k )
|
333
|
+
! expensive? ( k )
|
334
|
+
end
|
335
|
+
|
336
|
+
# ==method: setExpensive
|
337
|
+
#
|
338
|
+
# the expensive setter. key, value pairs stored via this method are not kept in memory
|
339
|
+
# but are stored to file and recalled as needed
|
340
|
+
def setExpensive(k,v)
|
341
|
+
expensive_filepath = _computeExpensiveFilepath( k )
|
342
|
+
serialized_value = Marshal::dump( v )
|
343
|
+
File.open(expensive_filepath, 'w') { |f|
|
344
|
+
f.write( serialized_value )
|
345
|
+
}
|
346
|
+
_expensive( k, true )
|
347
|
+
_primed( k, true )
|
348
|
+
end
|
349
|
+
|
350
|
+
# ==method: primed?
|
351
|
+
#
|
352
|
+
# INTERNAL: this method should only be called the the class method, Prime
|
353
|
+
#
|
354
|
+
def expensive?( k )
|
355
|
+
@flag_expensive.has_key?( k ) or return false;
|
356
|
+
@flag_expensive["#{k}"] \
|
357
|
+
and return true
|
358
|
+
return false
|
359
|
+
end
|
360
|
+
|
361
|
+
|
269
362
|
# ==method: save
|
270
363
|
#
|
271
364
|
# serialize to session file
|
272
365
|
def save
|
273
|
-
|
366
|
+
session_id = get("sadie.session_id")
|
367
|
+
session_filepath = File.expand_path( "session."+session_id, get( "sadie.sessions_dirpath" ) )
|
274
368
|
serialized_value = Marshal::dump( [ @shortterm, @flag_primed, @flag_expensive ] )
|
275
369
|
File.open(session_filepath, 'w') { |f|
|
276
370
|
f.write( serialized_value )
|
277
|
-
}
|
371
|
+
}
|
372
|
+
return session_id
|
278
373
|
end
|
279
374
|
|
280
375
|
# ==method: revert!
|
@@ -291,6 +386,18 @@ class Sadie
|
|
291
386
|
_initializeWithSessionId( get( "sadie.session_id" ) )
|
292
387
|
end
|
293
388
|
|
389
|
+
|
390
|
+
|
391
|
+
private
|
392
|
+
|
393
|
+
# ==method: unprime
|
394
|
+
# unprimes k. Note that this does not unset the value, so
|
395
|
+
# get(key) will continue to return whatever it otherwise would have.
|
396
|
+
# run unset as well to have the primer run again.
|
397
|
+
def unprime( key )
|
398
|
+
_primed( key, false )
|
399
|
+
end
|
400
|
+
|
294
401
|
# ==method: primed?
|
295
402
|
#
|
296
403
|
# INTERNAL: this method should only be called the the class method, Prime
|
@@ -303,122 +410,297 @@ class Sadie
|
|
303
410
|
return false
|
304
411
|
end
|
305
412
|
|
306
|
-
#
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
def expensive?( k )
|
311
|
-
@flag_expensive.has_key?( k ) or return false;
|
312
|
-
@flag_expensive["#{k}"] \
|
313
|
-
and return true
|
314
|
-
return false
|
413
|
+
# direct access getter for shortterm memory
|
414
|
+
def _get( key )
|
415
|
+
value = @shortterm["#{key}"]
|
416
|
+
return value
|
315
417
|
end
|
316
418
|
|
317
419
|
|
318
420
|
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
def _prime ( k )
|
323
|
-
# puts "_prime( #{k} )"
|
324
|
-
# fetch primers dirpath and validate the primer hash
|
325
|
-
primer_dirpath = _get("sadie.primers_dirpath")
|
326
|
-
@@primer_hash.has_key?(primer_dirpath) \
|
327
|
-
or @@primer_hash[primer_dirpath] = Hash.new
|
421
|
+
def primerPluginRegistered?( filename )
|
328
422
|
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
423
|
+
@@primer_plugin_lookup.each do | plugin_array |
|
424
|
+
re, path,accepts_block = plugin_array
|
425
|
+
re.match( filename ) \
|
426
|
+
and return true
|
427
|
+
end
|
428
|
+
return false;
|
429
|
+
end
|
430
|
+
|
431
|
+
def primeWithPlugin( key_prefix, filepath )
|
432
|
+
|
433
|
+
# when this primes, the block run of registerPrimerPlugin needs
|
434
|
+
# to know whether or not it accepts block
|
435
|
+
@@primer_plugin_lookup.each do | plugin_array |
|
436
|
+
|
437
|
+
# we just need to match the basename
|
438
|
+
filename = File.basename( filepath )
|
439
|
+
|
440
|
+
regexp, plugin_filepath, accepts_block, prime_on_init = plugin_array
|
441
|
+
|
442
|
+
if regexp.match( filename )
|
443
|
+
|
444
|
+
currentPrimerPluginAcceptsBlock( accepts_block )
|
445
|
+
currentPrimerPluginPrimeOnInit( prime_on_init )
|
446
|
+
|
447
|
+
plugin_filename = File.basename( plugin_filepath )
|
448
|
+
|
449
|
+
load( plugin_filepath )
|
450
|
+
|
451
|
+
return
|
452
|
+
end
|
337
453
|
end
|
338
|
-
return true
|
339
|
-
|
340
454
|
end
|
341
455
|
|
342
|
-
def
|
343
|
-
@@
|
456
|
+
def currentPrimerPluginAcceptsBlock( accepts )
|
457
|
+
@@primer_plugin_accepts_block = accepts
|
344
458
|
end
|
345
459
|
|
346
|
-
def
|
347
|
-
@@
|
460
|
+
def currentPrimerPluginAcceptsBlock?
|
461
|
+
@@primer_plugin_accepts_block
|
348
462
|
end
|
349
463
|
|
350
|
-
def
|
351
|
-
@@
|
464
|
+
def currentPrimerPluginPrimeOnInit( prime_on_init )
|
465
|
+
@@primer_plugin_prime_on_init = prime_on_init
|
352
466
|
end
|
353
467
|
|
354
|
-
def
|
355
|
-
@@
|
468
|
+
def currentPrimerPluginPrimerOnInit?
|
469
|
+
@@primer_plugin_prime_on_init
|
470
|
+
end
|
471
|
+
|
472
|
+
def setMidPluginInit( filepath )
|
473
|
+
@@mid_plugin_initialization = true
|
474
|
+
@@mid_plugin_filepath = filepath
|
356
475
|
end
|
357
476
|
|
477
|
+
def unsetMidPluginInit
|
478
|
+
@@mid_plugin_initialization = false
|
479
|
+
end
|
480
|
+
|
481
|
+
def midPluginInit?
|
482
|
+
@@mid_plugin_initialization
|
483
|
+
end
|
358
484
|
|
359
|
-
def
|
485
|
+
def regPluginMatch ( regexp, filepath, accepts_block, prime_on_init )
|
486
|
+
@@primer_plugin_lookup.push( [ regexp, filepath, accepts_block, prime_on_init ] )
|
487
|
+
end
|
488
|
+
|
489
|
+
def primerPluginsInitialized?
|
490
|
+
@@primer_plugins_initialized
|
491
|
+
end
|
492
|
+
|
493
|
+
# == initializePrimerPlugins
|
494
|
+
#
|
495
|
+
# register all the primer plugins
|
496
|
+
#
|
497
|
+
# called by initializePrimers so it's not necessary to call this separate from that
|
498
|
+
def initializePrimerPlugins
|
360
499
|
|
361
|
-
|
362
|
-
|
363
|
-
sadie_instance = Sadie::_getCurrentSadieInstance
|
364
|
-
current_dirpath = sadie_instance.get( "sadie.primers_dirpath" ) \
|
365
|
-
or raise "sadie.primers_dirpath not set"
|
366
|
-
end
|
500
|
+
plugins_dirpath = get( "sadie.primer_plugins_dirpath" ) \
|
501
|
+
or raise 'sadie.primer_plugins_dirpath not set'
|
367
502
|
|
503
|
+
puts "Initializing primer plugins..."
|
368
504
|
|
505
|
+
# load the plugins
|
506
|
+
Dir.foreach( plugins_dirpath ) do |filename|
|
507
|
+
next if ! filename.match( /\.plugin\.rb$/ )
|
508
|
+
|
509
|
+
filepath = File.expand_path( filename, plugins_dirpath )
|
369
510
|
|
370
|
-
|
371
|
-
|
511
|
+
puts "initializing primer plugin with file: #{filename}"
|
512
|
+
|
513
|
+
setMidPluginInit( filepath )
|
514
|
+
load( filepath )
|
515
|
+
unsetMidPluginInit
|
516
|
+
end
|
517
|
+
@@primer_plugins_initialized = true
|
518
|
+
end
|
519
|
+
|
520
|
+
def setMidPrimerInit ( filepath )
|
521
|
+
@@mid_primer_initialization = true
|
522
|
+
@@mid_primer_filepath = filepath
|
523
|
+
end
|
524
|
+
|
525
|
+
def unsetMidPrimerInit
|
526
|
+
@@mid_primer_initialization = false
|
527
|
+
end
|
528
|
+
|
529
|
+
def midPrimerInit?
|
530
|
+
@@mid_primer_initialization \
|
531
|
+
and return true;
|
532
|
+
return false;
|
533
|
+
end
|
534
|
+
|
535
|
+
|
536
|
+
|
537
|
+
def primersInitialized? ( toplevel_dirpath )
|
538
|
+
@@flag_primed.has_key?( toplevel_dirpath ) \
|
539
|
+
or return false;
|
540
|
+
return @@flag_primed[toplevel_dirpath]
|
541
|
+
end
|
542
|
+
|
543
|
+
def initializePrimers
|
544
|
+
|
545
|
+
Sadie::setCurrentSadieInstance( self )
|
546
|
+
|
547
|
+
# make sure primer plugins have been initialized
|
548
|
+
primerPluginsInitialized? \
|
549
|
+
or initializePrimerPlugins
|
550
|
+
|
551
|
+
|
552
|
+
primers_dirpath = get( "sadie.primers_dirpath" ) \
|
553
|
+
or raise "sadie.primers_dirpath not set"
|
554
|
+
|
555
|
+
return true if primersInitialized? primers_dirpath
|
556
|
+
|
557
|
+
puts "Initializing primers..."
|
558
|
+
initializePrimerDirectory( "", primers_dirpath )
|
559
|
+
|
560
|
+
|
561
|
+
@@flag_primed[primers_dirpath] = true
|
562
|
+
end
|
563
|
+
|
564
|
+
def initializePrimerDirectory( key_prefix, current_dirpath )
|
565
|
+
puts "initializing primer directory: #{current_dirpath}"
|
372
566
|
Dir.foreach( current_dirpath ) do |filename|
|
373
567
|
|
568
|
+
# skip the dit dirs
|
569
|
+
next if filename.eql?(".") || filename.eql?("..")
|
570
|
+
|
374
571
|
filepath = File.expand_path( filename, current_dirpath )
|
375
572
|
|
376
|
-
if File.directory?
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
or Sadie::_init_primers( key_prefix + "." + filename, filepath )
|
573
|
+
if File.directory? filepath
|
574
|
+
new_key_prefix = key_prefix + '.' + filename
|
575
|
+
new_key_prefix = new_key_prefix.gsub(/^\.+/,"")
|
576
|
+
initializePrimerDirectory( new_key_prefix, filepath )
|
381
577
|
else
|
382
|
-
|
383
|
-
# proc known filetypes
|
384
|
-
if matches = filename.match( /^(.*)\.ini$/ )
|
385
|
-
prefix = key_prefix + "." + matches[1]
|
386
|
-
prefix.gsub( /^\.+/, "" )
|
387
|
-
|
388
|
-
Sadie::_init_primers_proc_ini_file( prefix, filepath )
|
389
|
-
elsif filename.match( /\.res$/ ) || filename.match( /\.res.rb$/ )
|
390
|
-
Sadie::_init_primers_proc_res_file( filepath )
|
391
|
-
end
|
578
|
+
initializePrimerFile( key_prefix, filepath )
|
392
579
|
end
|
393
580
|
end
|
394
581
|
end
|
395
582
|
|
396
|
-
def
|
397
|
-
|
398
|
-
|
583
|
+
def initializePrimerFile( key_prefix, filepath )
|
584
|
+
|
585
|
+
|
586
|
+
basename = File.basename( filepath )
|
587
|
+
if primerPluginRegistered? basename
|
588
|
+
setCurrentPrimerFilepath filepath
|
399
589
|
|
400
|
-
|
401
|
-
key_to_set = key_prefix + "." + section + "." + key_from_ini_file
|
402
|
-
key_to_set = key_to_set.gsub( /^\.+/, "" )
|
403
|
-
#puts "key_to_set: #{key_to_set}"
|
590
|
+
setCurrentPrimerKeyPrefix key_prefix
|
404
591
|
|
405
|
-
|
406
|
-
|
407
|
-
|
592
|
+
basename = File.basename( filepath )
|
593
|
+
primeWithPlugin( key_prefix, filepath )
|
594
|
+
end
|
595
|
+
end
|
596
|
+
|
597
|
+
|
598
|
+
|
599
|
+
def setCurrentPrimerKeyPrefix ( prefix )
|
600
|
+
@@current_primer_keyprefix = prefix
|
601
|
+
end
|
602
|
+
|
603
|
+
def getCurrentPrimerKeyPrefix
|
604
|
+
@@current_primer_keyprefix
|
605
|
+
end
|
606
|
+
|
607
|
+
def setCurrentPrimerFilepath ( filepath )
|
608
|
+
@@current_primer_filepath = filepath
|
609
|
+
end
|
610
|
+
|
611
|
+
def getCurrentPrimerFilepath
|
612
|
+
@@current_primer_filepath
|
613
|
+
end
|
614
|
+
|
615
|
+
|
616
|
+
|
617
|
+
# ==memorizePrimerLocation
|
618
|
+
#
|
619
|
+
# internal, ignore the man behind the curtain
|
620
|
+
def memorizePrimerLocation( filepath, primer_provides )
|
621
|
+
|
622
|
+
# validate primer hash
|
623
|
+
#primer_dirpath = @@mid_primer_toplevel_primer_dirpath
|
624
|
+
primer_dirpath = _get("sadie.primers_dirpath")
|
625
|
+
@@primer_hash.has_key?( primer_dirpath ) \
|
626
|
+
or @@primer_hash["#{primer_dirpath}"] = Hash.new
|
627
|
+
|
628
|
+
# interate over provides setting primer providers for each
|
629
|
+
primer_provides.each do | key |
|
630
|
+
setPrimerProvider( key, filepath )
|
408
631
|
end
|
409
632
|
end
|
410
633
|
|
411
|
-
|
634
|
+
|
635
|
+
# ==setPrimerProvider
|
636
|
+
#
|
637
|
+
# internal, ignore the man behind the curtain
|
638
|
+
def setPrimerProvider( primer_name, primer_filepath )
|
639
|
+
|
640
|
+
primer_dirpath = _get( "sadie.primers_dirpath" )
|
641
|
+
@@primer_hash.has_key?( primer_dirpath ) \
|
642
|
+
or @@primer_hash[primer_dirpath] = Hash.new
|
643
|
+
|
644
|
+
@@primer_hash["#{primer_dirpath}"]["#{primer_name}"] = primer_filepath
|
645
|
+
|
646
|
+
end
|
647
|
+
|
648
|
+
def getPrimerProvider( key )
|
412
649
|
|
413
|
-
#
|
650
|
+
# fetch primers dirpath and validate the primer hash
|
651
|
+
primer_dirpath = _get( "sadie.primers_dirpath" )
|
652
|
+
@@primer_hash.has_key?( primer_dirpath ) \
|
653
|
+
or @@primer_hash[primer_dirpath] = Hash.new
|
414
654
|
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
Sadie::_unsetMidPrimerInit
|
655
|
+
primers = @@primer_hash[primer_dirpath]
|
656
|
+
primers.has_key?( key ) \
|
657
|
+
or return nil # primer not defined
|
419
658
|
|
659
|
+
return primers[key]
|
420
660
|
end
|
421
661
|
|
662
|
+
|
663
|
+
|
664
|
+
def _primed ( k, is_primed )
|
665
|
+
defined? k \
|
666
|
+
or raise '_primed> reqd parameter, k, was undefined'
|
667
|
+
k.is_a?( String ) \
|
668
|
+
or raise '_primed> reqd parameter, k, was non-string'
|
669
|
+
if ( is_primed )
|
670
|
+
@flag_primed[k] = true
|
671
|
+
return true
|
672
|
+
end
|
673
|
+
@flag_primed.has_key?( k ) \
|
674
|
+
or return true
|
675
|
+
@flag_primed.delete( k )
|
676
|
+
end
|
677
|
+
|
678
|
+
def _prime ( k )
|
679
|
+
|
680
|
+
provider = getPrimerProvider( k ) \
|
681
|
+
or return true;
|
682
|
+
|
683
|
+
setCurrentPrimerFilepath(provider)
|
684
|
+
Sadie::setCurrentSadieInstance( self )
|
685
|
+
load provider
|
686
|
+
true
|
687
|
+
|
688
|
+
end
|
689
|
+
|
690
|
+
|
691
|
+
def _newline( rval=true )
|
692
|
+
#puts
|
693
|
+
return rval
|
694
|
+
end
|
695
|
+
|
696
|
+
# ==method: unset
|
697
|
+
# unsets the value of k. Note that this does not unprime, so
|
698
|
+
# get(key) will simply return nil. Run with unprime to have the
|
699
|
+
# primer run again
|
700
|
+
def unset( key )
|
701
|
+
_unset( key )
|
702
|
+
end
|
703
|
+
|
422
704
|
def _recallExpensive( k )
|
423
705
|
expensive_filepath = _computeExpensiveFilepath( k )
|
424
706
|
File.exists? expensive_filepath \
|
@@ -434,14 +716,6 @@ class Sadie
|
|
434
716
|
File.expand_path("session."+session_id+".exp."+k, _get( "sadie.sessions_dirpath" ) )
|
435
717
|
end
|
436
718
|
|
437
|
-
def _primed( k, isprimed )
|
438
|
-
if isprimed
|
439
|
-
@flag_primed["#{k}"] = true
|
440
|
-
return
|
441
|
-
end
|
442
|
-
@flag_primed.delete( k )
|
443
|
-
end
|
444
|
-
|
445
719
|
def _expensive( k, isexpensive )
|
446
720
|
if isexpensive
|
447
721
|
@flag_expensive["#{k}"] = true
|
@@ -450,13 +724,6 @@ class Sadie
|
|
450
724
|
@flag_expensive.delete( k )
|
451
725
|
end
|
452
726
|
|
453
|
-
# direct access getter for shortterm memory
|
454
|
-
def _get( key )
|
455
|
-
value = @shortterm["#{key}"]
|
456
|
-
#puts "_get(#{key})> #{value}"
|
457
|
-
return value
|
458
|
-
end
|
459
|
-
|
460
727
|
# direct access setter for shortterm memory
|
461
728
|
def _set( key, value )
|
462
729
|
|
@@ -469,9 +736,6 @@ class Sadie
|
|
469
736
|
and @shortterm.delete( key )
|
470
737
|
end
|
471
738
|
|
472
|
-
def _isset?( key )
|
473
|
-
return @shortterm.has_key?( key )
|
474
|
-
end
|
475
739
|
|
476
740
|
# init given path to session file
|
477
741
|
def _initializeWithSessionFilePath(session_filepath)
|
@@ -515,43 +779,49 @@ class Sadie
|
|
515
779
|
return value
|
516
780
|
end
|
517
781
|
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
782
|
+
# ==method: checkInstanceSanity
|
783
|
+
#
|
784
|
+
# verifies that needed instance variables are defined
|
785
|
+
def _checkInstanceSanity
|
786
|
+
defined? @shortterm \
|
787
|
+
or @shortterm = Hash.new
|
788
|
+
defined? @flag_expensive \
|
789
|
+
or @flag_expensive = Hash.new
|
790
|
+
defined? @flag_destroyonget \
|
791
|
+
or @flag_destroyonget = Hash.new
|
792
|
+
defined? @flag_primed \
|
793
|
+
or @flag_primed = Hash.new
|
794
|
+
|
529
795
|
end
|
530
796
|
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
797
|
+
# ==method: checkClassSanity
|
798
|
+
#
|
799
|
+
# verifies that needed class variables are defined
|
800
|
+
def _checkClassSanity
|
801
|
+
defined? @@flag_primed \
|
802
|
+
or @@flag_primed = Hash.new
|
803
|
+
|
804
|
+
# init primer plugin vars
|
805
|
+
if ( ! defined? @@primer_plugin_lookup )
|
806
|
+
@@mid_plugin_initialization = false
|
807
|
+
@@primer_plugin_lookup = Array.new
|
808
|
+
@@primer_plugins_initialized = false
|
537
809
|
end
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
def self._checkSanity
|
550
|
-
if ! defined? @@primer_hash
|
551
|
-
@@primer_hash = Hash.new
|
810
|
+
|
811
|
+
# init primer vars
|
812
|
+
defined? @@primer_hash \
|
813
|
+
or @@primer_hash = Hash.new
|
814
|
+
defined? @flag_primed \
|
815
|
+
or @flag_primed = Hash.new
|
816
|
+
if ! defined? @@mid_primer_initialization
|
817
|
+
@@mid_primer_initialization = false
|
818
|
+
@@mid_primer_filepath = nil
|
819
|
+
# @@mid_primer_toplevel_primer_dirpath = nil
|
552
820
|
end
|
553
821
|
|
554
822
|
end
|
823
|
+
|
824
|
+
|
555
825
|
end
|
556
826
|
|
557
827
|
require "sadie/version"
|
data/sadie.gemspec
CHANGED
data/test/tc_sadie_toplevel.rb
CHANGED
@@ -8,7 +8,8 @@ class TestSadieToplevel < Test::Unit::TestCase
|
|
8
8
|
def test_simple
|
9
9
|
Dir.mktmpdir("sadie_testdir") do | dir |
|
10
10
|
sadie = Sadie::getSadieInstance( { "sadie.primers_dirpath" => "test/test_primers",
|
11
|
-
"sadie.sessions_dirpath" => dir
|
11
|
+
"sadie.sessions_dirpath" => dir,
|
12
|
+
"sadie.primer_plugins_dirpath" => "lib/sadie/primer_plugins" } )
|
12
13
|
|
13
14
|
# test top-level ini
|
14
15
|
assert_equal( sadie.get( "toplevel.somegroup.somekey" ), "someval" )
|
data/test/tc_sadie_twodeep.rb
CHANGED
@@ -8,7 +8,8 @@ class TestSadieTwoDeep < Test::Unit::TestCase
|
|
8
8
|
def test_simple
|
9
9
|
Dir.mktmpdir("sadie_testdir") do | dir |
|
10
10
|
sadie = Sadie::getSadieInstance( { "sadie.primers_dirpath" => "test/test_primers",
|
11
|
-
"sadie.sessions_dirpath" => dir
|
11
|
+
"sadie.sessions_dirpath" => dir,
|
12
|
+
"sadie.primer_plugins_dirpath" => "lib/sadie/primer_plugins" } )
|
12
13
|
|
13
14
|
# test two-deep ini
|
14
15
|
assert_equal( sadie.get( "two.deep.conf.section.thiskey" ), "thisval" )
|
@@ -0,0 +1 @@
|
|
1
|
+
*.kate-swp
|
@@ -1,6 +1,4 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
Sadie::Prime( "provides" => %w{ onedeep.multiresult.oneprime
|
1
|
+
Sadie::prime( "provides" => %w{ onedeep.multiresult.oneprime
|
4
2
|
onedeep.multiresult.twoprime } ) do |sadie|
|
5
3
|
sadie.set( "onedeep.multiresult.oneprime", "primedthem" )
|
6
4
|
sadie.set( "onedeep.multiresult.twoprime", "primedthem" )
|
@@ -1,11 +1,9 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
Sadie::Prime( "provides" => %w{ toplevel_destructonget.oneprime
|
1
|
+
Sadie::prime( "provides" => %w{ toplevel_destructonget.oneprime
|
4
2
|
toplevel_destructonget.twoprime } ) do |sadie|
|
5
3
|
puts "running destructonget primer..."
|
6
4
|
timeobj = Time.now
|
7
5
|
timeinsecs = timeobj.to_f
|
8
6
|
sadie.set( "toplevel_destructonget.oneprime", "primedthem - #{timeinsecs}" )
|
9
7
|
sadie.set( "toplevel_destructonget.twoprime", "primedthem" )
|
10
|
-
sadie.
|
8
|
+
sadie.setDestroyOnGet("toplevel_destructonget.oneprime")
|
11
9
|
end
|
@@ -1,7 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
Sadie::Prime( "provides" => %w{ toplevel_double.oneprime
|
4
|
-
toplevel_double.twoprime } ) do |sadie|
|
1
|
+
Sadie::prime( "provides" => %w{ toplevel_double.oneprime
|
2
|
+
toplevel_double.twoprime } ) do |sadie|
|
5
3
|
sadie.set( "toplevel_double.oneprime", "primedthem" )
|
6
4
|
sadie.set( "toplevel_double.twoprime", "primedthem" )
|
7
5
|
end
|
@@ -1,7 +1,8 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
Sadie::Prime( { "provides" => %w{ two.deep.two_results.firstkey \
|
1
|
+
Sadie::prime( { "provides" => %w{ two.deep.two_results.firstkey \
|
4
2
|
two.deep.two_results.secondkey } } ) do |sadie|
|
3
|
+
|
4
|
+
#puts "priming two_results.res"
|
5
|
+
|
5
6
|
sadie.set( "two.deep.two_results.firstkey", "primedthem" )
|
6
7
|
sadie.set( "two.deep.two_results.secondkey", "primedthem" )
|
7
8
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sadie
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 8
|
10
|
+
version: 0.0.8
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Fred McDavid
|
@@ -15,9 +15,22 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-01-
|
19
|
-
dependencies:
|
20
|
-
|
18
|
+
date: 2012-01-24 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: ini
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 3
|
29
|
+
segments:
|
30
|
+
- 0
|
31
|
+
version: "0"
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
21
34
|
description: Sadie is a data framework intended to ease the pain of managing related data.
|
22
35
|
email:
|
23
36
|
- fred@landmetrics.com
|
@@ -38,6 +51,10 @@ files:
|
|
38
51
|
- lib/.gitignore
|
39
52
|
- lib/sadie.rb
|
40
53
|
- lib/sadie/defaults.rb
|
54
|
+
- lib/sadie/primer_plugins/DatabaseConnection.plugin.rb
|
55
|
+
- lib/sadie/primer_plugins/IniFile.plugin.rb
|
56
|
+
- lib/sadie/primer_plugins/Resource.plugin.rb
|
57
|
+
- lib/sadie/primer_plugins/SQLQuery.plugin.rb
|
41
58
|
- lib/sadie/version.rb
|
42
59
|
- rdoc/classes/Sadie.html
|
43
60
|
- rdoc/created.rid
|
@@ -53,7 +70,7 @@ files:
|
|
53
70
|
- sadie.gemspec
|
54
71
|
- test/tc_sadie_toplevel.rb
|
55
72
|
- test/tc_sadie_twodeep.rb
|
56
|
-
- test/test_primers/.
|
73
|
+
- test/test_primers/.gitignore
|
57
74
|
- test/test_primers/onedeep/multiresult.res
|
58
75
|
- test/test_primers/toplevel.ini
|
59
76
|
- test/test_primers/toplevel_destructonget.res.rb
|
Binary file
|