pod4 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.hgignore +18 -0
- data/.hgtags +19 -0
- data/.rspec +4 -0
- data/.ruby-version +1 -0
- data/Gemfile +3 -0
- data/LICENSE.md +21 -0
- data/README.md +556 -0
- data/Rakefile +30 -0
- data/lib/pod4/alert.rb +87 -0
- data/lib/pod4/basic_model.rb +137 -0
- data/lib/pod4/errors.rb +80 -0
- data/lib/pod4/interface.rb +110 -0
- data/lib/pod4/metaxing.rb +66 -0
- data/lib/pod4/model.rb +347 -0
- data/lib/pod4/nebulous_interface.rb +408 -0
- data/lib/pod4/null_interface.rb +148 -0
- data/lib/pod4/param.rb +29 -0
- data/lib/pod4/pg_interface.rb +460 -0
- data/lib/pod4/sequel_interface.rb +303 -0
- data/lib/pod4/tds_interface.rb +394 -0
- data/lib/pod4/version.rb +3 -0
- data/lib/pod4.rb +54 -0
- data/md/fixme.md +32 -0
- data/md/roadmap.md +69 -0
- data/pod4.gemspec +49 -0
- data/spec/README.md +19 -0
- data/spec/alert_spec.rb +173 -0
- data/spec/basic_model_spec.rb +220 -0
- data/spec/doc_no_pending.rb +5 -0
- data/spec/fixtures/database.rb +13 -0
- data/spec/model_spec.rb +760 -0
- data/spec/nebulous_interface_spec.rb +286 -0
- data/spec/null_interface_spec.rb +153 -0
- data/spec/param_spec.rb +89 -0
- data/spec/pg_interface_spec.rb +452 -0
- data/spec/pod4_spec.rb +88 -0
- data/spec/sequel_interface_spec.rb +466 -0
- data/spec/shared_examples_for_interface.rb +160 -0
- data/spec/spec_helper.rb +25 -0
- data/spec/tds_interface_spec.rb +494 -0
- data/tags +106 -0
- metadata +316 -0
@@ -0,0 +1,494 @@
|
|
1
|
+
require 'pod4/tds_interface'
|
2
|
+
|
3
|
+
require 'date'
|
4
|
+
|
5
|
+
require_relative 'shared_examples_for_interface'
|
6
|
+
require_relative 'fixtures/database'
|
7
|
+
|
8
|
+
|
9
|
+
class TestTdsInterface < TdsInterface
|
10
|
+
set_db :pod4_test
|
11
|
+
set_table :customer
|
12
|
+
set_id_fld :id
|
13
|
+
end
|
14
|
+
|
15
|
+
class SchemaTdsInterface < TdsInterface
|
16
|
+
set_db :pod4_test
|
17
|
+
set_schema :public
|
18
|
+
set_table :customer
|
19
|
+
set_id_fld :id
|
20
|
+
end
|
21
|
+
|
22
|
+
class BadTdsInterface1 < TdsInterface
|
23
|
+
set_db :pod4_test
|
24
|
+
set_table :customer
|
25
|
+
end
|
26
|
+
|
27
|
+
class BadTdsInterface2 < TdsInterface
|
28
|
+
set_db :pod4_test
|
29
|
+
set_id_fld :id
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
describe TestTdsInterface do
|
34
|
+
|
35
|
+
def db_setup(connect)
|
36
|
+
client = TinyTds::Client.new(connect)
|
37
|
+
client.execute(%Q|use [pod4_test];|).do
|
38
|
+
|
39
|
+
# Our SQL Server does not support DROP TABLE IF EXISTS !
|
40
|
+
# This is apparently an SQL-agnostic way of doing it:
|
41
|
+
client.execute(%Q|
|
42
|
+
if exists (select * from INFORMATION_SCHEMA.TABLES
|
43
|
+
where TABLE_NAME = 'customer'
|
44
|
+
AND TABLE_SCHEMA = 'dbo' )
|
45
|
+
drop table dbo.customer;| ).do
|
46
|
+
|
47
|
+
client.execute(%Q|
|
48
|
+
create table dbo.customer (
|
49
|
+
id int identity(1,1) not null,
|
50
|
+
name nvarchar(max),
|
51
|
+
level real null,
|
52
|
+
day date null,
|
53
|
+
timestamp datetime null,
|
54
|
+
price money null,
|
55
|
+
qty numeric(5,2) null );| ).do
|
56
|
+
|
57
|
+
ensure
|
58
|
+
client.close if client
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
def fill_data(ifce)
|
63
|
+
@data.each{|r| ifce.create(r) }
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
before(:all) do
|
68
|
+
@connect_hash = DB[:tds]
|
69
|
+
db_setup(@connect_hash)
|
70
|
+
|
71
|
+
@data = []
|
72
|
+
@data << { name: 'Barney',
|
73
|
+
level: 1.23,
|
74
|
+
day: Date.parse("2016-01-01"),
|
75
|
+
timestamp: Time.parse('2015-01-01 12:11'),
|
76
|
+
price: BigDecimal.new("1.24"),
|
77
|
+
qty: BigDecimal.new("1.25") }
|
78
|
+
|
79
|
+
@data << { name: 'Fred',
|
80
|
+
level: 2.34,
|
81
|
+
day: Date.parse("2016-02-02"),
|
82
|
+
timestamp: Time.parse('2015-01-02 12:22'),
|
83
|
+
price: BigDecimal.new("2.35"),
|
84
|
+
qty: BigDecimal.new("2.36") }
|
85
|
+
|
86
|
+
@data << { name: 'Betty',
|
87
|
+
level: 3.45,
|
88
|
+
day: Date.parse("2016-03-03"),
|
89
|
+
timestamp: Time.parse('2015-01-03 12:33'),
|
90
|
+
price: BigDecimal.new("3.46"),
|
91
|
+
qty: BigDecimal.new("3.47") }
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
|
96
|
+
before do
|
97
|
+
# TRUNCATE TABLE also resets the identity counter
|
98
|
+
interface.execute(%Q|truncate table customer;|)
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
let(:interface) do
|
103
|
+
TestTdsInterface.new(@connect_hash)
|
104
|
+
end
|
105
|
+
|
106
|
+
#####
|
107
|
+
|
108
|
+
|
109
|
+
it_behaves_like 'an interface' do
|
110
|
+
|
111
|
+
let(:interface) do
|
112
|
+
TestTdsInterface.new(@connect_hash)
|
113
|
+
end
|
114
|
+
|
115
|
+
let(:record) { {name: 'Barney'} }
|
116
|
+
|
117
|
+
end
|
118
|
+
##
|
119
|
+
|
120
|
+
|
121
|
+
describe 'TdsInterface.set_db' do
|
122
|
+
it 'takes one argument' do
|
123
|
+
expect( TdsInterface ).to respond_to(:set_db).with(1).argument
|
124
|
+
end
|
125
|
+
end
|
126
|
+
##
|
127
|
+
|
128
|
+
|
129
|
+
describe 'TdsInterface.db' do
|
130
|
+
it 'returns the table' do
|
131
|
+
expect( TestTdsInterface.db ).to eq :pod4_test
|
132
|
+
end
|
133
|
+
end
|
134
|
+
##
|
135
|
+
|
136
|
+
|
137
|
+
describe 'TdsInterface.set_schema' do
|
138
|
+
it 'takes one argument' do
|
139
|
+
expect( TdsInterface ).to respond_to(:set_schema).with(1).argument
|
140
|
+
end
|
141
|
+
end
|
142
|
+
##
|
143
|
+
|
144
|
+
|
145
|
+
describe 'TdsInterface.schema' do
|
146
|
+
it 'returns the schema' do
|
147
|
+
expect( SchemaTdsInterface.schema ).to eq :public
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'is optional' do
|
151
|
+
expect{ TestTdsInterface.schema }.not_to raise_exception
|
152
|
+
expect( TestTdsInterface.schema ).to eq nil
|
153
|
+
end
|
154
|
+
end
|
155
|
+
##
|
156
|
+
|
157
|
+
|
158
|
+
describe 'TdsInterface.set_table' do
|
159
|
+
it 'takes one argument' do
|
160
|
+
expect( TdsInterface ).to respond_to(:set_table).with(1).argument
|
161
|
+
end
|
162
|
+
end
|
163
|
+
##
|
164
|
+
|
165
|
+
|
166
|
+
describe 'TdsInterface.table' do
|
167
|
+
it 'returns the table' do
|
168
|
+
expect( TestTdsInterface.table ).to eq :customer
|
169
|
+
end
|
170
|
+
end
|
171
|
+
##
|
172
|
+
|
173
|
+
|
174
|
+
describe 'TdsInterface.set_id_fld' do
|
175
|
+
it 'takes one argument' do
|
176
|
+
expect( TdsInterface ).to respond_to(:set_id_fld).with(1).argument
|
177
|
+
end
|
178
|
+
end
|
179
|
+
##
|
180
|
+
|
181
|
+
|
182
|
+
describe 'TdsInterface.id_fld' do
|
183
|
+
it 'returns the ID field name' do
|
184
|
+
expect( TestTdsInterface.id_fld ).to eq :id
|
185
|
+
end
|
186
|
+
end
|
187
|
+
##
|
188
|
+
|
189
|
+
|
190
|
+
describe '#new' do
|
191
|
+
|
192
|
+
it 'requires a TinyTds connection string' do
|
193
|
+
expect{ TestTdsInterface.new }.to raise_exception ArgumentError
|
194
|
+
expect{ TestTdsInterface.new(nil) }.to raise_exception ArgumentError
|
195
|
+
expect{ TestTdsInterface.new('foo') }.to raise_exception ArgumentError
|
196
|
+
|
197
|
+
expect{ TestTdsInterface.new(@connect_hash) }.not_to raise_exception
|
198
|
+
end
|
199
|
+
|
200
|
+
it 'requires the table and id field to be defined in the class' do
|
201
|
+
expect{ TdsInterface.new(@connect_hash) }.to raise_exception Pod4Error
|
202
|
+
|
203
|
+
expect{ BadTdsInterface1.new(@connect_hash) }.
|
204
|
+
to raise_exception Pod4Error
|
205
|
+
|
206
|
+
expect{ BadTdsInterface2.new(@connect_hash) }.
|
207
|
+
to raise_exception Pod4Error
|
208
|
+
|
209
|
+
end
|
210
|
+
|
211
|
+
end
|
212
|
+
##
|
213
|
+
|
214
|
+
|
215
|
+
describe '#quoted_table' do
|
216
|
+
|
217
|
+
it 'returns just the table when the schema is not set' do
|
218
|
+
expect( interface.quoted_table ).to eq( %Q|[customer]| )
|
219
|
+
end
|
220
|
+
|
221
|
+
it 'returns the schema plus table when the schema is set' do
|
222
|
+
ifce = SchemaTdsInterface.new(@connect_hash)
|
223
|
+
expect( ifce.quoted_table ).to eq( %|[public].[customer]| )
|
224
|
+
end
|
225
|
+
|
226
|
+
end
|
227
|
+
##
|
228
|
+
|
229
|
+
|
230
|
+
describe '#create' do
|
231
|
+
|
232
|
+
let(:hash) { {name: 'Bam-Bam', price: 4.44} }
|
233
|
+
let(:ot) { Octothorpe.new(name: 'Wilma', price: 5.55) }
|
234
|
+
|
235
|
+
it 'raises a Pod4::DatabaseError if anything goes wrong' do
|
236
|
+
expect{ interface.create(one: 'two') }.to raise_exception DatabaseError
|
237
|
+
end
|
238
|
+
|
239
|
+
it 'creates the record when given a hash' do
|
240
|
+
# kinda impossible to seperate these two tests
|
241
|
+
id = interface.create(hash)
|
242
|
+
|
243
|
+
expect{ interface.read(id) }.not_to raise_exception
|
244
|
+
expect( interface.read(id).to_h ).to include hash
|
245
|
+
end
|
246
|
+
|
247
|
+
it 'creates the record when given an Octothorpe' do
|
248
|
+
id = interface.create(ot)
|
249
|
+
|
250
|
+
expect{ interface.read(id) }.not_to raise_exception
|
251
|
+
expect( interface.read(id).to_h ).to include ot.to_h
|
252
|
+
end
|
253
|
+
|
254
|
+
it 'shouldnt have a problem with record values of nil' do
|
255
|
+
hash2 = {name: 'Ranger', price: nil}
|
256
|
+
expect{ interface.create(hash2) }.not_to raise_exception
|
257
|
+
id = interface.create(hash2)
|
258
|
+
expect( interface.read(id).to_h ).to include(hash2)
|
259
|
+
end
|
260
|
+
|
261
|
+
end
|
262
|
+
##
|
263
|
+
|
264
|
+
|
265
|
+
describe '#read' do
|
266
|
+
before { fill_data(interface) }
|
267
|
+
|
268
|
+
it 'returns the record for the id as an Octothorpe' do
|
269
|
+
rec = interface.read(2)
|
270
|
+
expect( rec ).to be_a_kind_of Octothorpe
|
271
|
+
expect( rec.>>.name ).to eq 'Fred'
|
272
|
+
end
|
273
|
+
|
274
|
+
it 'raises a Pod4::CantContinue if anything goes wrong with the ID' do
|
275
|
+
expect{ interface.read(:foo) }.to raise_exception CantContinue
|
276
|
+
end
|
277
|
+
|
278
|
+
it 'returns an empty Octothorpe if no record matches the ID' do
|
279
|
+
expect{ interface.read(99) }.not_to raise_exception
|
280
|
+
expect( interface.read(99) ).to be_a_kind_of Octothorpe
|
281
|
+
expect( interface.read(99) ).to be_empty
|
282
|
+
end
|
283
|
+
|
284
|
+
it 'returns real fields as Float' do
|
285
|
+
level = interface.read(1).>>.level
|
286
|
+
|
287
|
+
expect( level ).to be_a_kind_of Float
|
288
|
+
expect( level ).to be_within(0.001).of( @data.first[:level] )
|
289
|
+
end
|
290
|
+
|
291
|
+
it 'returns date fields as Date' do
|
292
|
+
pending "not supported by TinyTds ¬_¬ "
|
293
|
+
date = interface.read(1).>>.day
|
294
|
+
|
295
|
+
expect( date ).to be_a_kind_of Date
|
296
|
+
expect( date ).to eq @data.first[:day]
|
297
|
+
end
|
298
|
+
|
299
|
+
it 'returns datetime fields as Time' do
|
300
|
+
timestamp = interface.read(1).>>.timestamp
|
301
|
+
|
302
|
+
expect( timestamp ).to be_a_kind_of Time
|
303
|
+
expect( timestamp ).to eq @data.first[:timestamp]
|
304
|
+
end
|
305
|
+
|
306
|
+
it 'returns numeric fields as BigDecimal' do
|
307
|
+
qty = interface.read(1).>>.qty
|
308
|
+
|
309
|
+
expect( qty ).to be_a_kind_of BigDecimal
|
310
|
+
expect( qty ).to eq @data.first[:qty]
|
311
|
+
end
|
312
|
+
|
313
|
+
it 'returns money fields as BigDecimal' do
|
314
|
+
price = interface.read(1).>>.price
|
315
|
+
|
316
|
+
expect( price ).to be_a_kind_of BigDecimal
|
317
|
+
expect( price ).to eq @data.first[:price]
|
318
|
+
end
|
319
|
+
|
320
|
+
end
|
321
|
+
##
|
322
|
+
|
323
|
+
|
324
|
+
describe '#list' do
|
325
|
+
before { fill_data(interface) }
|
326
|
+
|
327
|
+
it 'has an optional selection parameter, a hash' do
|
328
|
+
# Actually it does not have to be a hash, but FTTB we only support that.
|
329
|
+
expect{ interface.list(name: 'Barney') }.not_to raise_exception
|
330
|
+
end
|
331
|
+
|
332
|
+
it 'returns an array of Octothorpes that match the records' do
|
333
|
+
list = interface.list
|
334
|
+
|
335
|
+
expect( list.first ).to be_a_kind_of Octothorpe
|
336
|
+
expect( list.map{|x| x.>>.name} ).to match_array @data.map{|y| y[:name]}
|
337
|
+
end
|
338
|
+
|
339
|
+
it 'returns a subset of records based on the selection parameter' do
|
340
|
+
expect( interface.list(name: 'Fred').size ).to eq 1
|
341
|
+
|
342
|
+
expect( interface.list(name: 'Betty').first.to_h ).
|
343
|
+
to include(name: 'Betty', price: 3.46)
|
344
|
+
|
345
|
+
end
|
346
|
+
|
347
|
+
it 'returns an empty Array if nothing matches' do
|
348
|
+
expect( interface.list(name: 'Yogi') ).to eq([])
|
349
|
+
end
|
350
|
+
|
351
|
+
it 'raises DatabaseError if the selection criteria is nonsensical' do
|
352
|
+
expect{ interface.list('foo') }.to raise_exception Pod4::DatabaseError
|
353
|
+
end
|
354
|
+
|
355
|
+
end
|
356
|
+
##
|
357
|
+
|
358
|
+
|
359
|
+
describe '#update' do
|
360
|
+
before { fill_data(interface) }
|
361
|
+
|
362
|
+
let(:id) { interface.list.first[:id] }
|
363
|
+
|
364
|
+
def float_price(row)
|
365
|
+
row[:price] = row[:price].to_f
|
366
|
+
row
|
367
|
+
end
|
368
|
+
|
369
|
+
it 'updates the record at ID with record parameter' do
|
370
|
+
record = {name: 'Booboo', price: 99.99}
|
371
|
+
interface.update(id, record)
|
372
|
+
|
373
|
+
# It so happens that TinyTds returns money as BigDecimal --
|
374
|
+
# this is a really good thing, even though it screws with our test.
|
375
|
+
expect( float_price( interface.read(id).to_h ) ).to include(record)
|
376
|
+
end
|
377
|
+
|
378
|
+
it 'raises a CantContinue if anything weird happens with the ID' do
|
379
|
+
expect{ interface.update(99, name: 'Booboo') }.
|
380
|
+
to raise_exception CantContinue
|
381
|
+
|
382
|
+
end
|
383
|
+
|
384
|
+
it 'raises a DatabaseError if anything weird happens with the record' do
|
385
|
+
expect{ interface.update(id, smarts: 'more') }.
|
386
|
+
to raise_exception DatabaseError
|
387
|
+
|
388
|
+
end
|
389
|
+
|
390
|
+
it 'shouldnt have a problem with record values of nil' do
|
391
|
+
record = {name: 'Ranger', price: nil}
|
392
|
+
expect{ interface.update(id, record) }.not_to raise_exception
|
393
|
+
expect( interface.read(id).to_h ).to include(record)
|
394
|
+
end
|
395
|
+
|
396
|
+
end
|
397
|
+
##
|
398
|
+
|
399
|
+
|
400
|
+
describe '#delete' do
|
401
|
+
|
402
|
+
def list_contains(id)
|
403
|
+
interface.list.find {|x| x[interface.id_fld] == id }
|
404
|
+
end
|
405
|
+
|
406
|
+
let(:id) { interface.list.first[:id] }
|
407
|
+
|
408
|
+
before { fill_data(interface) }
|
409
|
+
|
410
|
+
it 'raises CantContinue if anything hinky happens with the ID' do
|
411
|
+
expect{ interface.delete(:foo) }.to raise_exception CantContinue
|
412
|
+
expect{ interface.delete(99) }.to raise_exception CantContinue
|
413
|
+
end
|
414
|
+
|
415
|
+
it 'makes the record at ID go away' do
|
416
|
+
expect( list_contains(id) ).to be_truthy
|
417
|
+
interface.delete(id)
|
418
|
+
expect( list_contains(id) ).to be_falsy
|
419
|
+
end
|
420
|
+
|
421
|
+
end
|
422
|
+
##
|
423
|
+
|
424
|
+
|
425
|
+
describe '#execute' do
|
426
|
+
|
427
|
+
let(:sql) { 'delete from customer where price < 2.0;' }
|
428
|
+
|
429
|
+
before { fill_data(interface) }
|
430
|
+
|
431
|
+
it 'requires an SQL string' do
|
432
|
+
expect{ interface.execute }.to raise_exception ArgumentError
|
433
|
+
expect{ interface.execute(nil) }.to raise_exception ArgumentError
|
434
|
+
expect{ interface.execute(14) }.to raise_exception ArgumentError
|
435
|
+
end
|
436
|
+
|
437
|
+
it 'raises some sort of Pod4 error if it runs into problems' do
|
438
|
+
expect{ interface.execute('delete from not_a_table') }.
|
439
|
+
to raise_exception Pod4Error
|
440
|
+
|
441
|
+
end
|
442
|
+
|
443
|
+
it 'executes the string' do
|
444
|
+
expect{ interface.execute(sql) }.not_to raise_exception
|
445
|
+
expect( interface.list.size ).to eq(@data.size - 1)
|
446
|
+
expect( interface.list.map{|r| r[:name] } ).not_to include 'Barney'
|
447
|
+
end
|
448
|
+
|
449
|
+
end
|
450
|
+
##
|
451
|
+
|
452
|
+
|
453
|
+
describe '#select' do
|
454
|
+
|
455
|
+
before { fill_data(interface) }
|
456
|
+
|
457
|
+
it 'requires an SQL string' do
|
458
|
+
expect{ interface.select }.to raise_exception ArgumentError
|
459
|
+
expect{ interface.select(nil) }.to raise_exception ArgumentError
|
460
|
+
expect{ interface.select(14) }.to raise_exception ArgumentError
|
461
|
+
end
|
462
|
+
|
463
|
+
it 'raises some sort of Pod4 error if it runs into problems' do
|
464
|
+
expect{ interface.select('select * from not_a_table') }.
|
465
|
+
to raise_exception Pod4Error
|
466
|
+
|
467
|
+
end
|
468
|
+
|
469
|
+
it 'returns the result of the sql' do
|
470
|
+
sql1 = 'select name from customer where price < 2.0;'
|
471
|
+
sql2 = 'select name from customer where price < 0.0;'
|
472
|
+
|
473
|
+
expect{ interface.select(sql1) }.not_to raise_exception
|
474
|
+
expect( interface.select(sql1) ).to eq( [{name: 'Barney'}] )
|
475
|
+
expect( interface.select(sql2) ).to eq( [] )
|
476
|
+
end
|
477
|
+
|
478
|
+
it 'works if you pass a non-select' do
|
479
|
+
# By which I mean: still executes the SQL; returns []
|
480
|
+
sql = 'delete from customer where price < 2.0;'
|
481
|
+
ret = interface.select(sql)
|
482
|
+
|
483
|
+
expect( interface.list.size ).to eq(@data.size - 1)
|
484
|
+
expect( interface.list.map{|r| r[:name] } ).not_to include 'Barney'
|
485
|
+
expect( ret ).to eq( [] )
|
486
|
+
end
|
487
|
+
|
488
|
+
|
489
|
+
end
|
490
|
+
##
|
491
|
+
|
492
|
+
|
493
|
+
end
|
494
|
+
|
data/tags
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
|
2
|
+
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
|
3
|
+
<=> lib/pod4/alert.rb /^ def <=>(other)$/;" f class:Pod4.Alert
|
4
|
+
ACTIONS lib/pod4/interface.rb /^ ACTIONS = [ :list, :create, :read, :update, :delete ]$/;" C class:Pod4.Interface
|
5
|
+
ALERTTYPES lib/pod4/alert.rb /^ ALERTTYPES = [:error, :warning, :info, :success]$/;" C class:Pod4.Alert
|
6
|
+
Alert lib/pod4/alert.rb /^ class Alert$/;" c class:Pod4
|
7
|
+
DatabaseError lib/pod4/errors.rb /^ class DatabaseError < Pod4Error; end$/;" c class:Pod4 inherits:Pod4Error
|
8
|
+
DocNoPending spec/doc_no_pending.rb /^class DocNoPending < RSpec::Core:;FOrmatters::DocumentationFormatter$/;" c
|
9
|
+
Interface lib/pod4/interface.rb /^ class Interface$/;" c class:Pod4
|
10
|
+
Model lib/pod4/model.rb /^ class Model$/;" c class:Pod4
|
11
|
+
NebulousInterface lib/pod4/nebulous_interface.rb /^ class NebulousInterface < Interface$/;" c class:Pod4 inherits:Interface
|
12
|
+
NotImplemented lib/pod4/errors.rb /^ class NotImplemented < Error; end$/;" c class:Pod4 inherits:Error
|
13
|
+
Param lib/pod4/param.rb /^ module Param$/;" m class:Pod4
|
14
|
+
Pod4 lib/pod4.rb /^module Pod4$/;" m
|
15
|
+
Pod4 lib/pod4/alert.rb /^module Pod4$/;" m
|
16
|
+
Pod4 lib/pod4/errors.rb /^module Pod4$/;" m
|
17
|
+
Pod4 lib/pod4/interface.rb /^module Pod4$/;" m
|
18
|
+
Pod4 lib/pod4/model.rb /^module Pod4$/;" m
|
19
|
+
Pod4 lib/pod4/nebulous_interface.rb /^module Pod4$/;" m
|
20
|
+
Pod4 lib/pod4/param.rb /^module Pod4$/;" m
|
21
|
+
Pod4 lib/pod4/sequel_interface.rb /^module Pod4$/;" m
|
22
|
+
Pod4 lib/pod4/version.rb /^module Pod4 $/;" m
|
23
|
+
Pod4Error lib/pod4/errors.rb /^ class Pod4Error < StandardError$/;" c class:Pod4 inherits:StandardError
|
24
|
+
STATII lib/pod4/model.rb /^ STATII = %i|error warning okay empty|$/;" C class:Pod4.Model
|
25
|
+
SequelInterface lib/pod4/sequel_interface.rb /^ class SequelInterface < Interface$/;" c class:Pod4 inherits:Interface
|
26
|
+
VERSION lib/pod4/version.rb /^ VERSION = 0.1$/;" C class:Pod4
|
27
|
+
ValidationError lib/pod4/errors.rb /^ class ValidationError < Pod4Error$/;" c class:Pod4 inherits:Pod4Error
|
28
|
+
["@id_fld", 26] lib/pod4/sequel_interface.rb /^ attr_reader :table, @id_fld$/;" F class:Pod4.SequelInterface
|
29
|
+
add_alert lib/pod4/model.rb /^ def add_alert(type, field=nil, message)$/;" f class:Pod4.Model
|
30
|
+
alerts lib/pod4/model.rb /^ attr_reader :id, :alerts, :model_status$/;" f class:Pod4.Model
|
31
|
+
attr_columns lib/pod4/model.rb /^ def attr_columns(*cols)$/;" F class:Pod4.Model
|
32
|
+
bootstrap_class lib/pod4/alert.rb /^ def bootstrap_class$/;" f class:Pod4.Alert
|
33
|
+
clearing_cache lib/pod4/nebulous_interface.rb /^ def clearing_cache$/;" f class:Pod4.NebulousInterface
|
34
|
+
columns lib/pod4/model.rb /^ def columns $/;" F class:Pod4.Model
|
35
|
+
columns lib/pod4/model.rb /^ def columns; self.class.columns; end$/;" f class:Pod4.Model
|
36
|
+
create lib/pod4/interface.rb /^ def create(record)$/;" f class:Pod4.Interface
|
37
|
+
create lib/pod4/model.rb /^ def create$/;" f class:Pod4.Model
|
38
|
+
create lib/pod4/nebulous_interface.rb /^ def create(record)$/;" f class:Pod4.NebulousInterface
|
39
|
+
create lib/pod4/sequel_interface.rb /^ def create(record)$/;" f class:Pod4.SequelInterface
|
40
|
+
delete lib/pod4/interface.rb /^ def delete(id)$/;" f class:Pod4.Interface
|
41
|
+
delete lib/pod4/model.rb /^ def delete$/;" f class:Pod4.Model
|
42
|
+
delete lib/pod4/nebulous_interface.rb /^ def delete(id)$/;" f class:Pod4.NebulousInterface
|
43
|
+
delete lib/pod4/sequel_interface.rb /^ def delete(id)$/;" f class:Pod4.SequelInterface
|
44
|
+
example_pending spec/doc_no_pending.rb /^ def example_pending(notifications); end$/;" f class:DocNoPending
|
45
|
+
exception lib/pod4/alert.rb /^ attr_reader :type, :exception$/;" f class:Pod4.Alert
|
46
|
+
execute lib/pod4/sequel_interface.rb /^ def execute(sql)$/;" f class:Pod4.SequelInterface
|
47
|
+
field lib/pod4/alert.rb /^ attr_accessor :field, :message$/;" f class:Pod4.Alert
|
48
|
+
field lib/pod4/errors.rb /^ attr_reader :field$/;" f class:Pod4.ValidationError
|
49
|
+
field= lib/pod4/alert.rb /^ attr_accessor :field, :message$/;" f class:Pod4.Alert
|
50
|
+
from_alert lib/pod4/errors.rb /^ def self.from_alert(alert)$/;" F class:Pod4.ValidationError
|
51
|
+
from_error lib/pod4/errors.rb /^ def self.from_error(error)$/;" F class:Pod4.Pod4Error
|
52
|
+
from_error lib/pod4/errors.rb /^ def self.from_error(error, field=nil)$/;" F class:Pod4.ValidationError
|
53
|
+
get lib/pod4/param.rb /^ def get(p); params[p.to_sym]; end$/;" f class:Pod4.Param
|
54
|
+
get_all lib/pod4/param.rb /^ def get_all; Octothorpe.new(params); end$/;" f class:Pod4.Param
|
55
|
+
handle_error lib/pod4/nebulous_interface.rb /^ def handle_error(err)$/;" f class:Pod4.NebulousInterface
|
56
|
+
handle_error lib/pod4/sequel_interface.rb /^ def handle_error(err)$/;" f class:Pod4.SequelInterface
|
57
|
+
id lib/pod4/model.rb /^ attr_reader :id, :alerts, :model_status$/;" f class:Pod4.Model
|
58
|
+
initialize lib/pod4/alert.rb /^ def initialize(type, field=nil, message)$/;" f class:Pod4.Alert
|
59
|
+
initialize lib/pod4/errors.rb /^ def initialize(message, field=nil)$/;" f class:Pod4.ValidationError
|
60
|
+
initialize lib/pod4/errors.rb /^ def initialize(message=nil); super; end$/;" f class:Pod4.Pod4Error
|
61
|
+
initialize lib/pod4/interface.rb /^ def initialize$/;" f class:Pod4.Interface
|
62
|
+
initialize lib/pod4/model.rb /^ def initialize(id=nil)$/;" f class:Pod4.Model
|
63
|
+
initialize lib/pod4/nebulous_interface.rb /^ def initialize(paramHash)$/;" f class:Pod4.NebulousInterface
|
64
|
+
initialize lib/pod4/sequel_interface.rb /^ def initialize(db)$/;" f class:Pod4.SequelInterface
|
65
|
+
interface lib/pod4/model.rb /^ def interface$/;" F class:Pod4.Model
|
66
|
+
interface lib/pod4/model.rb /^ def interface; self.class.interface; end$/;" f class:Pod4.Model
|
67
|
+
list lib/pod4/interface.rb /^ def list(selection=nil)$/;" f class:Pod4.Interface
|
68
|
+
list lib/pod4/model.rb /^ def list(params=nil)$/;" F class:Pod4.Model
|
69
|
+
list lib/pod4/nebulous_interface.rb /^ def list(selection=nil)$/;" f class:Pod4.NebulousInterface
|
70
|
+
list lib/pod4/sequel_interface.rb /^ def list(selection=nil)$/;" f class:Pod4.SequelInterface
|
71
|
+
logger lib/pod4.rb /^ def self.logger$/;" F class:Pod4
|
72
|
+
message lib/pod4/alert.rb /^ attr_accessor :field, :message$/;" f class:Pod4.Alert
|
73
|
+
message= lib/pod4/alert.rb /^ attr_accessor :field, :message$/;" f class:Pod4.Alert
|
74
|
+
model_status lib/pod4/model.rb /^ attr_reader :id, :alerts, :model_status$/;" f class:Pod4.Model
|
75
|
+
or_die lib/pod4/model.rb /^ alias :or_die :throw_exceptions$/;" a class:Pod4.Model
|
76
|
+
param_string lib/pod4/nebulous_interface.rb /^ def param_string(params)$/;" f class:Pod4.NebulousInterface
|
77
|
+
params lib/pod4/param.rb /^ def params; @params ||= {}; end$/;" f class:Pod4.Param
|
78
|
+
read lib/pod4/interface.rb /^ def read(id)$/;" f class:Pod4.Interface
|
79
|
+
read lib/pod4/model.rb /^ def read$/;" f class:Pod4.Model
|
80
|
+
read lib/pod4/nebulous_interface.rb /^ def read(id)$/;" f class:Pod4.NebulousInterface
|
81
|
+
read lib/pod4/sequel_interface.rb /^ def read(id)$/;" f class:Pod4.SequelInterface
|
82
|
+
response lib/pod4/nebulous_interface.rb /^ attr_reader :response$/;" f class:Pod4.NebulousInterface
|
83
|
+
select lib/pod4/sequel_interface.rb /^ def select(sql)$/;" f class:Pod4.SequelInterface
|
84
|
+
send_message lib/pod4/nebulous_interface.rb /^ def send_message(verb, paramStr, with_cache=true)$/;" f class:Pod4.NebulousInterface
|
85
|
+
set lib/pod4/model.rb /^ def set(ot)$/;" f class:Pod4.Model
|
86
|
+
set lib/pod4/param.rb /^ def set(p,v); params[p.to_sym] = v; end$/;" f class:Pod4.Param
|
87
|
+
set_id_fld lib/pod4/sequel_interface.rb /^ def set_id_fld(idFld); @id_fld = idFld; end$/;" F class:Pod4.SequelInterface
|
88
|
+
set_interface lib/pod4/model.rb /^ def set_interface(interface)$/;" F class:Pod4.Model
|
89
|
+
set_logger lib/pod4.rb /^ def self.set_logger(lg)$/;" F class:Pod4
|
90
|
+
set_status lib/pod4/nebulous_interface.rb /^ def set_status$/;" f class:Pod4.NebulousInterface
|
91
|
+
set_table lib/pod4/sequel_interface.rb /^ def set_table(table); @table = table; end$/;" F class:Pod4.SequelInterface
|
92
|
+
set_target lib/pod4/nebulous_interface.rb /^ def set_target(target); @target = target; end$/;" F class:Pod4.NebulousInterface
|
93
|
+
set_verb lib/pod4/nebulous_interface.rb /^ def set_verb(action, verb)$/;" F class:Pod4.NebulousInterface
|
94
|
+
status lib/pod4/nebulous_interface.rb /^ attr_reader :status$/;" f class:Pod4.NebulousInterface
|
95
|
+
table lib/pod4/sequel_interface.rb /^ attr_reader :table, @id_fld$/;" F class:Pod4.SequelInterface
|
96
|
+
target lib/pod4/nebulous_interface.rb /^ attr_reader :target, :verbs$/;" F class:Pod4.NebulousInterface
|
97
|
+
throw_exceptions lib/pod4/model.rb /^ def throw_exceptions$/;" f class:Pod4.Model
|
98
|
+
to_ot lib/pod4/model.rb /^ def to_ot$/;" f class:Pod4.Model
|
99
|
+
type lib/pod4/alert.rb /^ attr_reader :type, :exception$/;" f class:Pod4.Alert
|
100
|
+
update lib/pod4/interface.rb /^ def update(id, record)$/;" f class:Pod4.Interface
|
101
|
+
update lib/pod4/model.rb /^ def update$/;" f class:Pod4.Model
|
102
|
+
update lib/pod4/nebulous_interface.rb /^ def update(id, record)$/;" f class:Pod4.NebulousInterface
|
103
|
+
update lib/pod4/sequel_interface.rb /^ def update(id, record)$/;" f class:Pod4.SequelInterface
|
104
|
+
validate lib/pod4/model.rb /^ def validate$/;" f class:Pod4.Model
|
105
|
+
verb_for lib/pod4/nebulous_interface.rb /^ def verb_for(action)$/;" f class:Pod4.NebulousInterface
|
106
|
+
verbs lib/pod4/nebulous_interface.rb /^ attr_reader :target, :verbs$/;" F class:Pod4.NebulousInterface
|