sadie 0.0.8 → 0.0.9
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/sadie/primer_plugins/DatabaseConnection.plugin.rb +64 -19
- data/lib/sadie/primer_plugins/IniFile.plugin.rb +50 -11
- data/lib/sadie/primer_plugins/Resource.plugin.rb +1 -1
- data/lib/sadie/primer_plugins/SQLQueryTo2DArray.plugin.rb +36 -0
- data/lib/sadie/primer_plugins/TemplateTextFile.plugin.rb +13 -0
- data/lib/sadie/version.rb +1 -1
- data/lib/sadie.rb +161 -70
- data/sadie.gemspec +5 -2
- data/test/README +9 -0
- data/test/tc_sadie_toplevel.rb +6 -2
- data/test/tc_sadie_twodeep.rb +17 -0
- data/test/test_primers/two/deep/test.dbi.conx +4 -0
- data/test/test_primers/two/deep/test_template.txt.tmpl +10 -0
- data/test/test_primers/two/deep/testquery.test.sql +1 -0
- metadata +39 -6
- data/lib/sadie/primer_plugins/SQLQuery.plugin.rb +0 -21
@@ -1,26 +1,71 @@
|
|
1
1
|
# WARNING: THIS DOESN'T WORK YET!!!
|
2
2
|
|
3
3
|
Sadie::registerPrimerPlugin( { "match" => /\.dbi\.conx$/,
|
4
|
-
"accepts-block" =>
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
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
|
4
|
+
"accepts-block" => false,
|
5
|
+
"prime-on-init" => false } ) do |sadie, key_prefix, primer_file_filepath|
|
6
|
+
|
7
|
+
# determine key
|
8
|
+
sadie_key = key_prefix+'.'+File.basename( primer_file_filepath )
|
14
9
|
|
15
|
-
# validate dbistr
|
16
|
-
dbparams.has_key( 'dbistr' ) \
|
17
|
-
or raise 'requried connection::dbistr was not defined'
|
18
10
|
|
19
|
-
|
20
|
-
|
21
|
-
|
11
|
+
Sadie::prime( { "provides" => [ sadie_key ] }) do |sadie|
|
12
|
+
|
13
|
+
if inihash = Sadie::iniFileToHash( primer_file_filepath )
|
14
|
+
dbparams = Hash.new
|
15
|
+
|
16
|
+
inihash.each do |section, section_hash|
|
17
|
+
section.match(/^connection$/) \
|
18
|
+
or next
|
19
|
+
section_hash.each do |key, value|
|
20
|
+
dbparams[key] = value
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
if ! dbparams.empty?
|
25
|
+
# validate dbistr
|
26
|
+
dbparams.has_key?( 'dbistr' ) \
|
27
|
+
or raise 'requried connection::dbistr was not defined'
|
28
|
+
|
29
|
+
# default user and pass to nil
|
30
|
+
user = dbparams.has_key?('user') ? dbparams['user']: nil;
|
31
|
+
pass = dbparams.has_key?('pass') ? dbparams['pass']: nil;
|
32
|
+
|
33
|
+
# call connect with block
|
34
|
+
require 'rubygems'
|
35
|
+
require 'mysql'
|
36
|
+
require 'dbi'
|
37
|
+
|
38
|
+
dbh = DBI.connect( dbparams['dbistr'], user, pass )
|
39
|
+
|
40
|
+
# determine key
|
41
|
+
#sadie_key = key_prefix+'.'+File.basename( primer_file_filepath )
|
42
|
+
|
43
|
+
# puts "installing db connection: #{sadie_key}"
|
44
|
+
|
45
|
+
sadie.set( sadie_key, dbh )
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
22
50
|
|
23
|
-
|
24
|
-
|
25
|
-
|
51
|
+
# # build parameter hash
|
52
|
+
# dbparams = Hash.new
|
53
|
+
# inifile = Ini.new( primer_file_filepath )
|
54
|
+
# inifile.each do | section, key_from_ini_file, value |
|
55
|
+
# section.match(/^connection$/) \
|
56
|
+
# or next
|
57
|
+
# dbparams[key_from_ini_file] = value
|
58
|
+
# end
|
59
|
+
#
|
60
|
+
# # validate dbistr
|
61
|
+
# dbparams.has_key?( 'dbistr' ) \
|
62
|
+
# or raise 'requried connection::dbistr was not defined'
|
63
|
+
#
|
64
|
+
# # default user and pass to nil
|
65
|
+
# user = dbparams.has_key?('user') ? dbparams['user']: nil;
|
66
|
+
# pass = dbparams.has_key?('pass') ? dbparams['pass']: nil;
|
67
|
+
#
|
68
|
+
# # call connect with block
|
69
|
+
# require 'dbi'
|
70
|
+
# DBI.connect( dbparams['dbistr'], user, pass, block )
|
26
71
|
end
|
@@ -2,20 +2,59 @@ Sadie::registerPrimerPlugin( { "match" => /\.ini$/,
|
|
2
2
|
"accepts-block" => false,
|
3
3
|
"prime-on-init" => true } ) do |sadie, key_prefix, primer_file_filepath|
|
4
4
|
|
5
|
-
require 'ini'
|
6
|
-
|
7
5
|
ini_file_basename = File.basename primer_file_filepath
|
8
6
|
ini_file_root = ini_file_basename.gsub( /\.ini$/, "" )
|
9
7
|
|
10
|
-
|
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( /^\.+/, "" )
|
8
|
+
if inihash = Sadie::iniFileToHash( primer_file_filepath )
|
18
9
|
|
19
|
-
|
10
|
+
inihash.each do |section, section_hash|
|
11
|
+
|
12
|
+
section_hash.each do |key, value|
|
13
|
+
|
14
|
+
key_to_set = key_prefix + "." + ini_file_root + "." + section + "." + key
|
15
|
+
key_to_set = key_to_set.gsub(/^\./,"")
|
16
|
+
sadie.set( key_to_set, value )
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
20
|
end
|
21
|
+
|
22
|
+
# section = nil
|
23
|
+
# File.open( primer_file_filepath, "r" ).each do |f|
|
24
|
+
# f.each_line do |line|
|
25
|
+
# next if line.match(/^;/) # skip comments
|
26
|
+
# if matches = line.match(/\[([^\]]+)\]/)
|
27
|
+
# section = matches[1]
|
28
|
+
# elsif matches = line.match(/^\s*([^\s\=]+)\s*\=\s*([^\s]+)\s*$/)
|
29
|
+
# key = matches[1]
|
30
|
+
# value = matches[2]
|
31
|
+
# if qmatches = value.match(/[\'\"](.*)[\'\"]/)
|
32
|
+
# newvalue = qmatches[1]
|
33
|
+
# value = newvalue
|
34
|
+
# end
|
35
|
+
# if defined? section
|
36
|
+
# key_to_set = key_prefix + "." + ini_file_root + "." +section + "." + key
|
37
|
+
# sadie.set( key_to_set, value )
|
38
|
+
# end
|
39
|
+
# end
|
40
|
+
# end
|
41
|
+
# end
|
42
|
+
|
43
|
+
# require 'rubygems'
|
44
|
+
# require 'ini'
|
45
|
+
#
|
46
|
+
# ini_file_basename = File.basename primer_file_filepath
|
47
|
+
# ini_file_root = ini_file_basename.gsub( /\.ini$/, "" )
|
48
|
+
#
|
49
|
+
# inifile = Ini.new( primer_file_filepath )
|
50
|
+
# # puts "key_prefix: #{key_prefix}, primer_file_filepath: #{primer_file_filepath}"
|
51
|
+
# inifile.each do | section, key_from_ini_file, value |
|
52
|
+
#
|
53
|
+
# # compute key
|
54
|
+
# # key_prefix = sadie.getCurrentPrimerKeyPrefix
|
55
|
+
# key_to_set = key_prefix + "." + ini_file_root + "." +section + "." + key_from_ini_file
|
56
|
+
# key_to_set = key_to_set.gsub( /^\.+/, "" )
|
57
|
+
#
|
58
|
+
# sadie.set( key_to_set, value )
|
59
|
+
# end
|
21
60
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
Sadie::registerPrimerPlugin( { "match" => /\.sql$/,
|
2
|
+
"accepts-block" => false,
|
3
|
+
"prime-on-init" => false } ) do |sadie, key_prefix, primer_file_filepath|
|
4
|
+
primer_file_basename = File.basename( primer_file_filepath )
|
5
|
+
sadie_key = key_prefix + '.' + primer_file_basename
|
6
|
+
sadie_key = sadie_key.gsub(/^\./,"")
|
7
|
+
|
8
|
+
Sadie::prime( { "provides" => [ sadie_key ] }) do |sadie|
|
9
|
+
|
10
|
+
if ( matches = primer_file_basename.match( /^(.*)\.([^\.]+)\.sql$/ ) )
|
11
|
+
dbi_sadie_key = key_prefix + '.' + matches[2] + ".dbi.conx"
|
12
|
+
# puts "dbi_sadie_key: #{dbi_sadie_key}, connecting..."
|
13
|
+
dbconx = sadie.get( dbi_sadie_key )
|
14
|
+
# puts "dbconx: #{dbconx}"
|
15
|
+
if ( dbconx = sadie.get( dbi_sadie_key ) )
|
16
|
+
# puts " connected."
|
17
|
+
if sql_query = Sadie::templatedFileToString( primer_file_filepath )
|
18
|
+
|
19
|
+
sth = dbconx.prepare(sql_query)
|
20
|
+
sth.execute
|
21
|
+
|
22
|
+
result = Array.new
|
23
|
+
while row = sth.fetch
|
24
|
+
result.push row.to_a
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
sadie.setExpensive( sadie_key, result )
|
29
|
+
|
30
|
+
# Close the statement handle when done
|
31
|
+
sth.finish
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
Sadie::registerPrimerPlugin( { "match" => /\.tmpl$/,
|
2
|
+
"accepts-block" => false,
|
3
|
+
"prime-on-init" => false } ) do |sadie, key_prefix, primer_file_filepath|
|
4
|
+
primer_file_basename = File.basename( primer_file_filepath )
|
5
|
+
sadie_key = key_prefix + '.' + primer_file_basename
|
6
|
+
sadie_key = sadie_key.gsub(/^\./,"")
|
7
|
+
|
8
|
+
Sadie::prime( { "provides" => [ sadie_key ] }) do |sadie|
|
9
|
+
|
10
|
+
sadie.setExpensive( sadie_key, Sadie::templatedFileToString( primer_file_filepath ) )
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
data/lib/sadie/version.rb
CHANGED
data/lib/sadie.rb
CHANGED
@@ -3,8 +3,7 @@ require 'rubygems'
|
|
3
3
|
require "bundler/setup"
|
4
4
|
require 'bundler'
|
5
5
|
Bundler.require(:default)
|
6
|
-
|
7
|
-
|
6
|
+
require 'erb'
|
8
7
|
|
9
8
|
# ==Description: Sadie
|
10
9
|
# Sadie is a data framework intended to ease the pain of constructing, accessing, and
|
@@ -17,6 +16,11 @@ Bundler.require(:default)
|
|
17
16
|
# supports on-demand, one-time evaluation of "primers" which may define, or prime,
|
18
17
|
# multiple key, value pairs in a single run.
|
19
18
|
|
19
|
+
def S( key )
|
20
|
+
instance = Sadie::getCurrentSadieInstance
|
21
|
+
return instance.get( key )
|
22
|
+
end
|
23
|
+
|
20
24
|
class Sadie
|
21
25
|
|
22
26
|
# ==method: Sadie::getSadieInstance
|
@@ -62,6 +66,44 @@ class Sadie
|
|
62
66
|
current_sadie_instance = Sadie::getCurrentSadieInstance
|
63
67
|
current_sadie_instance.registerPrimerPlugin( arghash, &block )
|
64
68
|
end
|
69
|
+
|
70
|
+
# ==method: Sadie::iniFileToHash
|
71
|
+
#
|
72
|
+
# utility class method. accepts a filepath. digests inin file and returns hash of hashes.
|
73
|
+
#
|
74
|
+
def self.iniFileToHash ( filepath )
|
75
|
+
section = nil
|
76
|
+
ret = Hash.new
|
77
|
+
File.open( filepath, "r" ).each do |f|
|
78
|
+
f.each_line do |line|
|
79
|
+
next if line.match(/^;/) # skip comments
|
80
|
+
if matches = line.match(/\[([^\]]+)\]/)
|
81
|
+
section = matches[1]
|
82
|
+
ret[section] = Hash.new
|
83
|
+
elsif matches = line.match(/^\s*([^\s\=]+)\s*\=\s*([^\s]+)\s*$/)
|
84
|
+
key = matches[1]
|
85
|
+
value = matches[2]
|
86
|
+
|
87
|
+
# strip quotes
|
88
|
+
if qmatches = value.match(/[\'\"](.*)[\'\"]/)
|
89
|
+
value = qmatches[1]
|
90
|
+
end
|
91
|
+
|
92
|
+
if defined? section
|
93
|
+
ret[section][key] = value
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
ret.empty? and return nil
|
99
|
+
return ret
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.templatedFileToString( filepath )
|
103
|
+
f = open( filepath )
|
104
|
+
template = ERB.new( f.read )
|
105
|
+
template.result
|
106
|
+
end
|
65
107
|
|
66
108
|
|
67
109
|
# ==method: constructor
|
@@ -110,20 +152,31 @@ class Sadie
|
|
110
152
|
and set( "sadie.primers_dirpath", delay_set_primers_dirpath )
|
111
153
|
|
112
154
|
# if a path to a session is given, init using session file
|
113
|
-
if
|
114
|
-
set( "sadie.session_filepath", options[
|
155
|
+
if options.has_key?( "sadie.session_filepath" )
|
156
|
+
set( "sadie.session_filepath", options["sadie.session_filepath"] )
|
115
157
|
_initializeWithSessionFilePath( get("sadie.session_filepath") )
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
# determine session id, init from session if provided as arg
|
120
|
-
if defined?options[:sadie.session_id] && options[:sadie.session_id].match(/^[^\s]+$/)
|
121
|
-
set( "sadie.session_id", options[:sadie.session_id] )
|
158
|
+
elsif options.has_key?( "sadie.session_id" )
|
159
|
+
set( "sadie.session_id", options["sadie.session_id"] )
|
122
160
|
_initializeWithSessionId( get( "sadie.session_id" ) )
|
123
161
|
else
|
124
162
|
set( "sadie.session_id", _generateNewSessionId )
|
125
163
|
end
|
126
164
|
|
165
|
+
# if defined? options["sadie.session_filepath"] \
|
166
|
+
# && options["sadie.session_filepath"].match(/^[^\s]+$/)
|
167
|
+
# set( "sadie.session_filepath", options["sadie.session_filepath"] )
|
168
|
+
# _initializeWithSessionFilePath( get("sadie.session_filepath") )
|
169
|
+
# return
|
170
|
+
# end
|
171
|
+
#
|
172
|
+
# # determine session id, init from session if provided as arg
|
173
|
+
# if defined?options["sadie.session_id"] && options["sadie.session_id"].match(/^[^\s]+$/)
|
174
|
+
# set( "sadie.session_id", options["sadie.session_id"] )
|
175
|
+
# _initializeWithSessionId( get( "sadie.session_id" ) )
|
176
|
+
# else
|
177
|
+
# set( "sadie.session_id", _generateNewSessionId )
|
178
|
+
# end
|
179
|
+
|
127
180
|
end
|
128
181
|
|
129
182
|
def prime ( primer_definition, &block )
|
@@ -140,7 +193,7 @@ class Sadie
|
|
140
193
|
if midPrimerInit?
|
141
194
|
|
142
195
|
# mid primer init, just memorize primer location
|
143
|
-
memorizePrimerLocation( @@mid_primer_filepath,
|
196
|
+
memorizePrimerLocation( @@mid_primer_filepath, getCurrentPrimerPluginFilepath, primer_definition["provides"] )
|
144
197
|
else
|
145
198
|
|
146
199
|
# run code block with the current sadie instance
|
@@ -164,31 +217,42 @@ class Sadie
|
|
164
217
|
end
|
165
218
|
|
166
219
|
def registerPrimerPlugin ( arghash, &block )
|
220
|
+
|
221
|
+
# if mid plugin init is set, we're registering the plugin
|
222
|
+
# init mode, just store arghash info
|
223
|
+
accepts_block = arghash.has_key?( "accepts-block" ) && arghash["accepts-block"] ? true : false
|
224
|
+
prime_on_init = arghash.has_key?( "prime-on-init" ) && arghash["prime-on-init"] ? true : false
|
225
|
+
|
226
|
+
|
227
|
+
|
228
|
+
|
229
|
+
|
230
|
+
# if mid plugin init, register the plugin params with the match
|
167
231
|
if midPluginInit?
|
168
232
|
|
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
233
|
regPluginMatch( arghash["match"], @@mid_plugin_filepath, accepts_block, prime_on_init )
|
173
234
|
|
235
|
+
# midplugininit returned false, we're actually in the process of either initializing
|
236
|
+
# a primer or actually priming
|
174
237
|
else
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
else
|
238
|
+
yield( self, getCurrentPrimerKeyPrefix, @@current_primer_filepath ) \
|
239
|
+
# unless midPrimerInit?
|
240
|
+
# if registering the prime mode, skips block exec
|
241
|
+
#
|
242
|
+
# if currentPrimerPluginAcceptsBlock?
|
243
|
+
#
|
244
|
+
# # call with block only if accepts block
|
245
|
+
# yield( self, getCurrentPrimerKeyPrefix, @@current_primer_filepath, &block )
|
246
|
+
#
|
247
|
+
# else
|
186
248
|
|
187
|
-
|
249
|
+
# yield( self, getCurrentPrimerKeyPrefix, @@current_primer_filepath ) \
|
250
|
+
# if prime_on_init or
|
188
251
|
|
189
|
-
|
190
|
-
|
191
|
-
|
252
|
+
# end
|
253
|
+
|
254
|
+
# prime_on_init \
|
255
|
+
# or unsetMidPrimerInit
|
192
256
|
|
193
257
|
end
|
194
258
|
end
|
@@ -338,6 +402,7 @@ class Sadie
|
|
338
402
|
# the expensive setter. key, value pairs stored via this method are not kept in memory
|
339
403
|
# but are stored to file and recalled as needed
|
340
404
|
def setExpensive(k,v)
|
405
|
+
# puts "setting expensive, key: #{k}"
|
341
406
|
expensive_filepath = _computeExpensiveFilepath( k )
|
342
407
|
serialized_value = Marshal::dump( v )
|
343
408
|
File.open(expensive_filepath, 'w') { |f|
|
@@ -428,31 +493,6 @@ class Sadie
|
|
428
493
|
return false;
|
429
494
|
end
|
430
495
|
|
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
|
453
|
-
end
|
454
|
-
end
|
455
|
-
|
456
496
|
def currentPrimerPluginAcceptsBlock( accepts )
|
457
497
|
@@primer_plugin_accepts_block = accepts
|
458
498
|
end
|
@@ -465,7 +505,7 @@ class Sadie
|
|
465
505
|
@@primer_plugin_prime_on_init = prime_on_init
|
466
506
|
end
|
467
507
|
|
468
|
-
def
|
508
|
+
def currentPrimerPluginPrimeOnInit?
|
469
509
|
@@primer_plugin_prime_on_init
|
470
510
|
end
|
471
511
|
|
@@ -514,6 +554,7 @@ class Sadie
|
|
514
554
|
load( filepath )
|
515
555
|
unsetMidPluginInit
|
516
556
|
end
|
557
|
+
puts "...finished initializing primer plugins"
|
517
558
|
@@primer_plugins_initialized = true
|
518
559
|
end
|
519
560
|
|
@@ -556,7 +597,7 @@ class Sadie
|
|
556
597
|
|
557
598
|
puts "Initializing primers..."
|
558
599
|
initializePrimerDirectory( "", primers_dirpath )
|
559
|
-
|
600
|
+
puts "...finished initializing primers."
|
560
601
|
|
561
602
|
@@flag_primed[primers_dirpath] = true
|
562
603
|
end
|
@@ -590,11 +631,49 @@ class Sadie
|
|
590
631
|
setCurrentPrimerKeyPrefix key_prefix
|
591
632
|
|
592
633
|
basename = File.basename( filepath )
|
593
|
-
|
634
|
+
initializePrimerWithPlugin( key_prefix, filepath )
|
635
|
+
|
636
|
+
|
594
637
|
end
|
595
638
|
end
|
596
639
|
|
640
|
+
def initializePrimerWithPlugin( key_prefix, filepath )
|
641
|
+
|
642
|
+
@@primer_plugin_lookup.each do | plugin_array |
|
643
|
+
|
644
|
+
# we just need to match the basename
|
645
|
+
filename = File.basename( filepath )
|
646
|
+
|
647
|
+
regexp, plugin_filepath, accepts_block, prime_on_init = plugin_array
|
648
|
+
|
649
|
+
if regexp.match( filename )
|
650
|
+
|
651
|
+
# currentPrimerPluginAcceptsBlock( accepts_block )
|
652
|
+
# currentPrimerPluginPrimeOnInit( prime_on_init )
|
653
|
+
setCurrentPrimerPluginFilepath( plugin_filepath )
|
654
|
+
prime_on_init \
|
655
|
+
or setMidPrimerInit( filepath )
|
656
|
+
|
657
|
+
plugin_filename = File.basename( plugin_filepath )
|
658
|
+
|
659
|
+
load( plugin_filepath )
|
660
|
+
|
661
|
+
prime_on_init \
|
662
|
+
or unsetMidPrimerInit
|
663
|
+
|
664
|
+
|
665
|
+
return
|
666
|
+
end
|
667
|
+
end
|
668
|
+
end
|
597
669
|
|
670
|
+
def setCurrentPrimerPluginFilepath( filepath )
|
671
|
+
@@current_primer_plugin_filepath = filepath
|
672
|
+
end
|
673
|
+
|
674
|
+
def getCurrentPrimerPluginFilepath
|
675
|
+
@@current_primer_plugin_filepath
|
676
|
+
end
|
598
677
|
|
599
678
|
def setCurrentPrimerKeyPrefix ( prefix )
|
600
679
|
@@current_primer_keyprefix = prefix
|
@@ -617,7 +696,7 @@ class Sadie
|
|
617
696
|
# ==memorizePrimerLocation
|
618
697
|
#
|
619
698
|
# internal, ignore the man behind the curtain
|
620
|
-
def memorizePrimerLocation( filepath, primer_provides )
|
699
|
+
def memorizePrimerLocation( filepath, plugin_filepath, primer_provides )
|
621
700
|
|
622
701
|
# validate primer hash
|
623
702
|
#primer_dirpath = @@mid_primer_toplevel_primer_dirpath
|
@@ -627,7 +706,7 @@ class Sadie
|
|
627
706
|
|
628
707
|
# interate over provides setting primer providers for each
|
629
708
|
primer_provides.each do | key |
|
630
|
-
setPrimerProvider( key, filepath )
|
709
|
+
setPrimerProvider( key, filepath, plugin_filepath, getCurrentPrimerKeyPrefix )
|
631
710
|
end
|
632
711
|
end
|
633
712
|
|
@@ -635,13 +714,13 @@ class Sadie
|
|
635
714
|
# ==setPrimerProvider
|
636
715
|
#
|
637
716
|
# internal, ignore the man behind the curtain
|
638
|
-
def setPrimerProvider( primer_name, primer_filepath )
|
717
|
+
def setPrimerProvider( primer_name, primer_filepath, primer_plugin_filepath, key_prefix )
|
639
718
|
|
640
719
|
primer_dirpath = _get( "sadie.primers_dirpath" )
|
641
720
|
@@primer_hash.has_key?( primer_dirpath ) \
|
642
721
|
or @@primer_hash[primer_dirpath] = Hash.new
|
643
722
|
|
644
|
-
@@primer_hash["#{primer_dirpath}"]["#{primer_name}"] = primer_filepath
|
723
|
+
@@primer_hash["#{primer_dirpath}"]["#{primer_name}"] = [ primer_filepath, primer_plugin_filepath, key_prefix ]
|
645
724
|
|
646
725
|
end
|
647
726
|
|
@@ -677,13 +756,17 @@ class Sadie
|
|
677
756
|
|
678
757
|
def _prime ( k )
|
679
758
|
|
680
|
-
provider
|
681
|
-
|
759
|
+
if provider = getPrimerProvider( k )
|
760
|
+
primer_filepath, plugin_filepath, key_prefix = provider
|
682
761
|
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
762
|
+
setCurrentPrimerFilepath(primer_filepath)
|
763
|
+
setCurrentPrimerKeyPrefix( key_prefix )
|
764
|
+
Sadie::setCurrentSadieInstance( self )
|
765
|
+
|
766
|
+
# puts "_prime( #{k} ) loading #{provider}"
|
767
|
+
|
768
|
+
load plugin_filepath
|
769
|
+
end
|
687
770
|
|
688
771
|
end
|
689
772
|
|
@@ -738,7 +821,15 @@ class Sadie
|
|
738
821
|
|
739
822
|
|
740
823
|
# init given path to session file
|
741
|
-
def _initializeWithSessionFilePath(session_filepath)
|
824
|
+
def _initializeWithSessionFilePath( session_filepath )
|
825
|
+
|
826
|
+
puts "session_filepath: #{session_filepath}"
|
827
|
+
|
828
|
+
defined?( session_filepath ) \
|
829
|
+
or raise "session_filepath was undefined"
|
830
|
+
|
831
|
+
/^\s*$/.match("#{session_filepath}") \
|
832
|
+
and raise "session_filepath was empty string"
|
742
833
|
|
743
834
|
# bail on non-existant file
|
744
835
|
File.exist?( session_filepath ) \
|
@@ -766,8 +857,8 @@ class Sadie
|
|
766
857
|
|
767
858
|
# init given session id
|
768
859
|
def _initializeWithSessionId(session_id)
|
769
|
-
session_filepath = File.expand_path( "session."+session_id,
|
770
|
-
_initializeWithSessionFilePath(session_filepath)
|
860
|
+
session_filepath = File.expand_path( "session."+session_id, _get( "sadie.sessions_dirpath" ) )
|
861
|
+
_initializeWithSessionFilePath( session_filepath )
|
771
862
|
end
|
772
863
|
|
773
864
|
# gen new session id
|
data/sadie.gemspec
CHANGED
@@ -22,6 +22,9 @@ Gem::Specification.new do |s|
|
|
22
22
|
# s.add_development_dependency "rspec"
|
23
23
|
# s.add_runtime_dependency "rest-client"
|
24
24
|
|
25
|
-
s.add_runtime_dependency "ini"
|
26
|
-
|
25
|
+
#s.add_runtime_dependency "ini"
|
26
|
+
s.add_runtime_dependency "dbi"
|
27
|
+
s.add_runtime_dependency "mysql"
|
28
|
+
s.add_runtime_dependency "dbd-mysql"
|
29
|
+
|
27
30
|
end
|
data/test/README
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
These tests depend on a mysql database created as follows on the local machine:
|
2
|
+
|
3
|
+
create database test
|
4
|
+
grant all on test.* to test@localhost identified by 'test'
|
5
|
+
CREATE TABLE `test` (
|
6
|
+
`col1` int(8) DEFAULT NULL,
|
7
|
+
`col2` varchar(256) DEFAULT NULL
|
8
|
+
)
|
9
|
+
INSERT INTO `test` VALUES (1,'testing123'),(2,'testing456');
|
data/test/tc_sadie_toplevel.rb
CHANGED
@@ -1,4 +1,8 @@
|
|
1
|
-
|
1
|
+
#$LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
|
2
|
+
#$LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
|
3
|
+
#$:.unshift(File.expand_path('./lib', ENV['rvm_path']))
|
4
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
5
|
+
$:.unshift ENV["GEM_HOME"]
|
2
6
|
|
3
7
|
require "test/unit"
|
4
8
|
require "sadie"
|
@@ -22,7 +26,7 @@ class TestSadieToplevel < Test::Unit::TestCase
|
|
22
26
|
dog1a = sadie.get( "toplevel_destructonget.oneprime" )
|
23
27
|
dog2a = sadie.get( "toplevel_destructonget.twoprime" )
|
24
28
|
dog2b = sadie.get( "toplevel_destructonget.twoprime" )
|
25
|
-
sleep(
|
29
|
+
sleep( 0.01 )
|
26
30
|
dog1b = sadie.get( "toplevel_destructonget.oneprime" )
|
27
31
|
assert_equal( dog2a, dog2b )
|
28
32
|
assert_not_equal( dog1a, dog1b )
|
data/test/tc_sadie_twodeep.rb
CHANGED
@@ -20,6 +20,23 @@ class TestSadieTwoDeep < Test::Unit::TestCase
|
|
20
20
|
|
21
21
|
# test two-deep expensive
|
22
22
|
assert_equal( sadie.get( "expensive.oneprime" ), "primedit" )
|
23
|
+
|
24
|
+
# test db connection
|
25
|
+
dbconx = sadie.get( "two.deep.test.dbi.conx" )
|
26
|
+
assert_not_nil( dbconx )
|
27
|
+
|
28
|
+
# test sql22darray
|
29
|
+
tablearray = sadie.get( "two.deep.testquery.test.sql" )
|
30
|
+
assert_not_nil( tablearray )
|
31
|
+
assert_equal( tablearray[0][0], 1 )
|
32
|
+
assert_equal( tablearray[1][1], "testing456" )
|
33
|
+
|
34
|
+
# test templating
|
35
|
+
template_text = sadie.get( "two.deep.test_template.txt.tmpl" )
|
36
|
+
template_text = template_text.gsub(/\s+/," ").gsub(/^\s*/,"").gsub(/\s*$/,"")
|
37
|
+
# puts "template text\n#{template_text}"
|
38
|
+
assert( (template_text.match(/later\s+gator/)), "incorrect match on template text" )
|
39
|
+
assert( (template_text.match(/test\/test\_primers/)), "incorrect match on template text" )
|
23
40
|
end
|
24
41
|
end
|
25
42
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
select * from test
|
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: 13
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 9
|
10
|
+
version: 0.0.9
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Fred McDavid
|
@@ -15,10 +15,10 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-01-
|
18
|
+
date: 2012-01-25 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
|
-
name:
|
21
|
+
name: dbi
|
22
22
|
prerelease: false
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
24
|
none: false
|
@@ -31,6 +31,34 @@ dependencies:
|
|
31
31
|
version: "0"
|
32
32
|
type: :runtime
|
33
33
|
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: mysql
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
hash: 3
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
version: "0"
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: dbd-mysql
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
hash: 3
|
57
|
+
segments:
|
58
|
+
- 0
|
59
|
+
version: "0"
|
60
|
+
type: :runtime
|
61
|
+
version_requirements: *id003
|
34
62
|
description: Sadie is a data framework intended to ease the pain of managing related data.
|
35
63
|
email:
|
36
64
|
- fred@landmetrics.com
|
@@ -54,7 +82,8 @@ files:
|
|
54
82
|
- lib/sadie/primer_plugins/DatabaseConnection.plugin.rb
|
55
83
|
- lib/sadie/primer_plugins/IniFile.plugin.rb
|
56
84
|
- lib/sadie/primer_plugins/Resource.plugin.rb
|
57
|
-
- lib/sadie/primer_plugins/
|
85
|
+
- lib/sadie/primer_plugins/SQLQueryTo2DArray.plugin.rb
|
86
|
+
- lib/sadie/primer_plugins/TemplateTextFile.plugin.rb
|
58
87
|
- lib/sadie/version.rb
|
59
88
|
- rdoc/classes/Sadie.html
|
60
89
|
- rdoc/created.rid
|
@@ -68,6 +97,7 @@ files:
|
|
68
97
|
- rdoc/index.html
|
69
98
|
- rdoc/rdoc-style.css
|
70
99
|
- sadie.gemspec
|
100
|
+
- test/README
|
71
101
|
- test/tc_sadie_toplevel.rb
|
72
102
|
- test/tc_sadie_twodeep.rb
|
73
103
|
- test/test_primers/.gitignore
|
@@ -78,6 +108,9 @@ files:
|
|
78
108
|
- test/test_primers/toplevel_single.res.rb
|
79
109
|
- test/test_primers/two/deep/conf.ini
|
80
110
|
- test/test_primers/two/deep/expensive.res
|
111
|
+
- test/test_primers/two/deep/test.dbi.conx
|
112
|
+
- test/test_primers/two/deep/test_template.txt.tmpl
|
113
|
+
- test/test_primers/two/deep/testquery.test.sql
|
81
114
|
- test/test_primers/two/deep/two_results.res
|
82
115
|
homepage: http://www.landmetrics.com/Sadie
|
83
116
|
licenses: []
|
@@ -1,21 +0,0 @@
|
|
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
|