alf 0.15.0 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,482 +1,19 @@
1
- # 0.13.0 / FIX ME
2
-
3
- * Ruby 1.8.x is no longer supported. Please upgrade.
4
-
5
- ## Enhancements of the shell interface
6
-
7
- * When used in shell, the default database is set to the current folder instead of the embedded suppliers and parts example database. This saves you from having to use 'alf --db=.' everytime you want to use .csv or .rash files as base relations. An --examples option allows easily setting the embedded database as default one.
8
-
9
- * When used in shell, the default rendering format is set to --text if the standard output is detected to be a tty. This saves you from having to use 'alf ... | alf show' too many times. The behavior of alf in shell, 'alf show' in particular, might be broken for you (see below). Thanks go to @eregontp for this suggestion!
10
-
11
- * Added --json output format.
12
-
13
- ## Enhancements of the ruby interface
14
-
15
- * Added Alf.connect for connecting to databases in the easiest possible way:
16
-
17
- Alf.connect("somewhere/to/a/folder") do |conn| ... end
18
- Alf.connect("database.sqlite3") do |conn| ... end
19
- Alf.connect("postgres://user:password@host/database") ...
20
- Alf.connect(adapter: "sqlite", database: "test.sqlite3") ...
21
-
22
- * Evaluation of queries are now sent to a connection specifically:
23
-
24
- Alf.connect(...) do |conn|
25
- conn.query{ (restrict :suppliers, ->{ status > 10 } )}
26
- end
27
-
28
- * Alf::Relation now respond to aggregation functions with an object-oriented syntax:
29
-
30
- Relation(...).sum{ qty }
31
-
32
- * Alf::Relation(...) (aliased as Alf.relation) now recognize IO objects and Path.like instances and load them with available readers in the easiest possible way:
33
-
34
- Alf::Relation("path/to/a/suppliers.csv")
35
- # => Alf::Relation[...]
36
-
37
- * Alf::Relation(...) ensures that attribute names are Symbols and symbolize them if needed.
38
-
39
- * Added Relation#tuple_extract, aliased as Relation#tuple! that returns the only tuple of the relation, or raises a NoSuchTupleError if no tuple or more than one.
40
-
41
- * Added Alf::Tuple(...) that behaves similarly to Alf::Relation(...) but for tuples.
42
-
43
- * Added Alf.reader as a convenient shortcut for Alf::Reader.reader.
44
-
45
- Alf.reader("path/to/a/suppliers.csv")
46
- # => #<Alf::CSV::Reader:0x007fd554058440 ...>
47
-
48
- * Added Alf::Reader#path that always returns a Path instance, unless the reader operates on an IO/StringIO. Use Alf::Reader#input to get the source passed at construction.
49
-
50
- * All queries as well as tuple expressions (in restrictions, extensions, summarizations, etc.) are now evaluated in a cleaner and extended scope through a BasicObject extended with all database helpers. This has multiple advantages and one drawback:
51
- * It allows you to have all database helpers available in those expressions.
52
- * You no longer have to worry about name clashes with Kernel's methods.
53
- * Kernel's functions are no longer accessible whithout prefixing with ::Kernel.
54
-
55
- * In sync with the previous point, Relation (the class), DUM and DEE are now defined globally (unless you define `ALF_NO_CORE_EXTENSIONS` before loading Alf). Those constants can thus be safely used in query expressions without experiencing a NameError.
56
-
57
- * Added a JSON renderer.
58
-
59
- ## Bug fixes
60
-
61
- * The Aggregator class, Summarization type and Summarize operator have been made thread-safe through #happens that now takes a TupleScope instead of a tuple.
62
-
63
- * Sequel::Connection#relvar correctly raises a NoSuchRelvarError if no table can be found.
64
-
65
- ## Broken stuff
66
-
67
- * The `heading` operator has been renamed `infer-heading` (Heading -> InferHeading accordingly).
68
-
69
- * `Alf.lispy` has been removed from the public API. Please use `connect` instead:
70
-
71
- Alf.lipsy(db_params).query{ ... }
72
-
73
- becomes:
74
-
75
- Alf.connect(db_params) do |conn|
76
- conn.query{ ... }
77
- end
78
-
79
- * The Environment concept as been removed and replaced by Connection. That also means that `environment` readers and writers here have been replaced according to cases. Also, the --env option has been renamed to --db in the shell command. This is a major incompatible change of Alf internals that might break existing code that extends Alf::Environment, Alf::Reader or any subclass.
80
-
81
- * Connection#dataset has been replaced to Connection#relvar and now serves relation variables instead of pure iterators.
82
-
83
- * You now have to explicitely use 'alf show --text > ...' or 'alf --text ... > ' if you don't want ruby hashes to be outputted to output files. This is a consequence of tty detection that ensures a better shell experience.
84
-
85
- * Kernel's functions are no longer accessible in tuple expressions that are executed within a BasicObject's scope.
86
-
87
- * The syntax (Relation :relvar_name) is no longer supported as it does not denote a relation literal at all.
88
-
89
- * `Iterator#to_rel` has been removed. Use `Iterator#to_relation` instead.
90
-
91
- * Renderers are no longer able to coerce their input from a Symbol.
92
-
93
- * Renderer.renderers and Renderer.each_renderer have been removed. Use Renderer.all and Renderer.each instead, respectively.
94
-
95
- * Reader.readers has been removed. Use Reader.all or Reader.each instead.
96
-
97
- * Aggregator.aggregators has been removed. Use Aggregator.all or Aggregator.each instead.
98
-
99
- * TupleExpression#call and TupleExpression#[] have been removed.
100
-
101
- * TuplePredicate has been replaced by Predicate. The latter is no longer a subclass of TupleExpression.
102
-
103
- ## Bug fixes
104
-
105
- * The backports gem is no longer required on ruby =1.9
106
-
107
- # 0.12.2 / 2012-06-12
108
-
109
- * Bumped and weakened backports dependency to '~> 2.6'
110
-
111
- # 0.12.1 / 2012-03-13
112
-
113
- ## Enhancements
114
-
115
- * Add `Alf::Relation()`, with the same semantics as the main `Relation()` function
116
- added in 0.12.0.
117
-
118
- ## Bugfixes
119
-
120
- * Ensure that `Relation()` reads a reader/operator only once.
121
- * The Sequel environment now correctly uses the jdbc driver when attempting to connect
122
- to a sqlite database/file.
123
-
124
- # 0.12.0 / 2012-02-09
125
-
126
- * Add a Relation() toplevel method that mimics Array(), Integer(), and so on.
127
- That method uses Tools::ToRelation which is a set of Myrrha coercion rules.
128
- The Relation() method helps building relation "literals" (say) for common
129
- cases, such as the following:
130
-
131
- Relation(:name => "Alf")
132
- # => (Relation (Tuple :name => "Alf"))
133
-
134
- Relation([{:name => "Alf"}, {:name => "Myrrha"}])
135
- # => (Relation (Tuple :name => "Alf"), (Tuple :name => "Myrrha"))
136
-
137
- Relation(:name => ["Alf", "Myrrha"])
138
- # => (Relation (Tuple :name => "Alf"), (Tuple :name => "Myrrha"))
139
-
140
- # 0.11.1 / 2012-01-25
141
-
142
- ## Bugfixes
143
-
144
- * Fix Aggregator.stddev and Lispy.stddev that were missing
145
-
146
- # 0.11.0 / 2012-01-25
147
-
148
- ## Broken APIs (private sections only)
149
-
150
- * All pipe() methods have been removed and replaced by arguments taken at
151
- construction time. This affects the implementation of operators and may
152
- require changes to contributed readers and renderers.
153
- * Alf::Operator::Base -> Alf::Operator::InstanceMethods
154
- * Alf::Reader::Base -> Alf::Reader::InstanceMethods
155
- * Alf::Rendered::Base -> Alf::Rendered::InstanceMethods
156
- * Alf::Environment::Base -> Alf::Environment::InstanceMethods
157
- * Alf::Aggregator::Base -> Alf::Aggregator::InstanceMethods
158
- * Alf::Buffer has been removed as well as the Sorted specialization.
159
- * Alf::Environment::Explicit has been removed as well as associated tools.
160
- * Ordering#order_of has been removed
161
- * Ordering#order_by has been removed
162
- * Alf::Tools.coerce now raise a Alf::CoercionError instead of a Myrrha::Error
163
- in case of coercion failure
164
-
165
- ## On the development side
166
-
167
- * Bumped ruby.noe to 1.7.0
168
- * Bumped rspec to 2.8.0
169
- * Bumped sequel to 3.30.0
170
-
171
- # 0.10.1 / 2011-08-31
172
-
173
- ## Miscellaneous enhancements
174
-
175
- * Added Variance and Stddev aggregation operators; they are available under
176
- Aggregator.variance{} and Aggregator.stddev{}, respectively
177
- * Added a --pretty option to 'alf', whose semantics is delegated to the output
178
- renderer. Same option is available on 'alf show'.
179
- * 'alf show' now accepts an optional ordering argument. This avoids explicitely
180
- including non-relational sort invocations in your pipe (sorting should be
181
- seen as a displaying issue)
182
- * Added an options hash to text renderer, :float_format among others
183
- * Added a --ff option to 'alf show', for float format in text rendering
184
-
185
- ## Bugfixes
186
-
187
- * Alf::Environment::(Folder/Explicit)#dataset now correctly raises a
188
- NoSuchDatasetError when the dataset cannot be found, as required by the
189
- specification.
190
- * Alf::Reader.reader now correctly returns a Rash reader when invoked on a
191
- StringIO
192
-
193
- # 0.10.0 / 2011-08-15
194
-
195
- ## New recognized data sources
196
-
197
- * Alf now provides an Environment implementation on top of a SQL database.
198
- This means that SQL tables can now be used as data-sources. This feature
199
- relies on the sequel gem ('gem install sequel' is required), that drives
200
- recognized SQL servers. Then (don't forget that ALF_OPTS also exists):
201
-
202
- % alf --env=postgres://user:password@host/database show table
203
-
204
- * Alf now recognizes and allows manipulating .csv files as first-class data
205
- sources. CSV output is also supported of course. Under ruby <= 1.9, the
206
- fastercsv gem is required ('gem install fastercsv' is required). Then:
207
-
208
- % alf restrict suppliers.csv -- "city == 'Paris'" (input)
209
- % alf show suppliers --csv (output)
210
-
211
- * Alf now recognizes and allows manipulating .log files as first-class data
212
- sources. This feature relies on request-log-analyzer gem that provides the
213
- parsers that Alf uses, and the log formats it recognizes
214
- ('gem install request-log-analyzer' is required). See examples/logs.
215
-
216
- ## New operators and enhancements
217
-
218
- * A GENERATOR operator is introduced. It allows generating a relation with one
219
- auto-number attribute, up to a given size.
220
-
221
- * A COERCE operator is introduced. It provides a quick way to obtain type-safe
222
- relations from type-unsafe sources like .csv files. For example:
223
-
224
- % alf coerce mydirtyfile.csv -- name String price Float at Time
225
-
226
- The coerce operator is of course available in Ruby as well:
227
-
228
- (coerce "mydirtyfile.csv", :name => String, :price => Float, :at => Time)
229
-
230
- * The DEFAULTS (non-relational) operator now accepts default values as tuple
231
- expressions. When used in shell, provided default values are now evaluated
232
- that way. This allows specifying default values as being computed on the
233
- current tuple.
234
-
235
- * Aggregations in the Lispy DSL must not be prefixed by Agg:: anymore.
236
-
237
- ## Miscellaneous enhancements
238
-
239
- * Added 'alf --input-reader' to specify $stdin format (csv, rash, etc.)
240
- * Added 'alf -Ipath' that mimics ruby's -I (add path to $LOAD_PATH before run)
241
- * Lispy#run supports command arguments to be passed as a string
242
- * Lispy#run supports piped commands, with '|' as in shell
243
-
244
- ## Hurting changes to Lispy DSL (and therefore to Relation)
245
-
246
- * The attribute-name syntax of aggregation operators has been removed. The Agg::
247
- prefix must not be specified anymore.
248
-
249
- Agg::sum(:qty) # !! error !!
250
- Agg::sum{ qty } # !! error !!
251
- sum{ qty } # simply, and only!
252
-
253
- * The group aggregation operator has been removed. It will probably be replaced
254
- in a future version. In the meantime, the GROUP relational operator allows
255
- obtaining similar results.
256
-
257
- * Lispy syntax of CLIP has changed (when used with --allbut option)
258
-
259
- (clip :suppliers, [:name, :city], true) (before)
260
- (clip :suppliers, [:name, :city], :allbut => true) (after)
261
-
262
- * Lispy syntax of DEFAULTS has changed (when used with --strict option)
263
-
264
- (defaults :suppliers, {:country => 'Belgium'}, true) (before)
265
- (defaults :suppliers, {:country => 'Belgium'}, :strict => true) (after)
266
-
267
- * Lispy syntax of GROUP has changed (when used with --allbut option)
268
-
269
- (group :supplies, [:sid], :supplying, true) (before)
270
- (group :supplies, [:sid], :supplying, :allbut => true) (after)
271
-
272
- * Lispy syntax of PROJECT has changed (when used with --allbut option)
273
-
274
- (project :suppliers, [:name, :city], true) (before)
275
- (project :suppliers, [:name, :city], :allbut => true) (after)
276
-
277
- * Lispy syntax of SUMMARIZE has changed (when used with --allbut option)
278
-
279
- (summarize :supplies, [:qty, :pid], {...}, true) (before)
280
- (summarize :supplies, [:qty, :pid], {...}, :allbut => true) (after)
281
-
282
- ## Hurting changes in shell
283
-
284
- * The attribute-name syntax of aggregation operators has been removed
285
-
286
- sum(:qty) # !! error !!
287
- sum{ qty } # works
288
-
289
- * Shell syntax of GROUP has changed (option separator before introduced name)
290
-
291
- % alf --text group supplies -- pid qty supplying (before)
292
- % alf --text group supplies -- pid qty -- supplying (after)
293
-
294
- * Shell syntax of WRAP has changed (option separator before introduced name)
295
-
296
- % alf --text wrap suppliers -- city status loc_and_status (before)
297
- % alf --text wrap suppliers -- city status -- loc_and_status (after)
298
-
299
- * Shell syntax of QUOTA has changed (--by and --order become pure arguments)
300
-
301
- % alf quota supplies --by=sid --order=qty -- position count sum_qty "sum{ qty }" (before)
302
- % alf quota supplies -- sid -- qty -- position count sum_qty "sum{ qty }" (after)
303
-
304
- * Shell syntax of RANK has changed (--order becomes a pure argument)
305
-
306
- % alf rank parts --order=weight,desc,pid,asc -- position (before)
307
- % alf rank parts -- weight desc pid asc -- position (after)
308
-
309
- * Shell syntax of SUMMARIZE has changed (--by becomes a pure argument)
310
-
311
- % alf summarize supplies --by=sid -- total_qty "sum{ qty }" (before)
312
- % alf summarize supplies -- sid -- total_qty "sum{ qty }" (after)
313
-
314
- ## Bug fixes
315
-
316
- * [In shell] Options are now correctly parsed in presence of option separators.
317
- That is, every argument after a '--' separator is considered a non-option
318
- argument.
319
-
320
- # 0.9.3 / 2011-07-23
321
-
322
- ## New operators (available both in shell and in Lispy DSL)
323
-
324
- * Added MATCHING and NOT MATCHING operators. These operators are useful
325
- shortcuts for the following expressions.
326
-
327
- (matching l, r) := (project (join l, r), [l's attributes])
328
- (not_matching l, r) := (minus l, (matching l, r))
329
-
330
- For example:
331
-
332
- # Give suppliers who supply at least one part
333
- (matching suppliers, supplies)
334
-
335
- # Give suppliers who don't supply any part
336
- (not_matching suppliers, supplies)
337
-
338
- * Added RANK operator, which is useful for for computing quota queries as
339
- illustrated below. See 'alf help rank' for details.
340
-
341
- # Give the three heaviest parts
342
- (restrict (rank :parts, [[:weight, :desc]], :pos), lambda{ pos < 3 })
343
-
344
- ## Enhancements when using Alf in shell
345
-
346
- * added 'alf -r', that mimics 'ruby -r' (require library before run)
347
-
348
- * When alf is invoked in shell (and only in this case), ALF_OPTS is used as
349
- global options to apply as if they were specified inline:
350
-
351
- % export ALF_OPTS="--env=. --yaml"
352
- % alf show suppliers
353
-
354
- is the same as
355
-
356
- % alf --env=. --yaml show suppliers
357
-
358
- * 'alf --help' now distinguishes experimental operators (quota in particular)
359
- from those coming from the (much more stable) **Tutorial D** specification. The
360
- former should be used with care as their specification may change at any
361
- time.
362
-
363
- ## Enhancements when using Alf in Ruby
364
-
365
- * Alf.lispy now accepts any argument recognized by Environment.autodetect; it
366
- obtains its working Environment that way. Among others:
367
-
368
- Alf.lispy(Alf::Environment.folder("path/to/an/existing/folder"))
369
-
370
- is the same as:
371
-
372
- Alf.lispy("path/to/an/existing/folder")
373
-
374
- * Added Relation::DUM and Relation::DEE constants (relations of empty heading
375
- with no and one tuple, respectively). They are also available as DUM and DEE
376
- in Lispy functional expressions.
377
-
378
- * Added a Heading abstraction, as a set of attribute (name, type) pairs.
379
-
380
- ## Internal enhancements (extension points)
381
-
382
- * The Reader and Renderer classes accept a Hash of options as third
383
- constructor argument. These options can be used by extension points.
384
-
385
- * The Environment class now provides a class-based registering mechanism 'ala'
386
- Reader and Renderer. This allows auto-detecting the target environment when
387
- --env=... is used in shell. See Environment.autodetect and
388
- Environment#recognizes? for contributing to this extension point.
389
-
390
- * Internals now rely on Myrrha for code generation. This means that all
391
- datatypes can now be safely used in relations and dumped to .rash files in
392
- particular.
393
-
394
- ## Bug fixes
395
-
396
- * Added Relation#allbut, forgotten in two previous releases
397
- * Fixed (join xxx, DEE) and (join xxx, DUM)
398
- * Fixed scoping bug when using attributes named :path, :expr or :block in
399
- Lispy compiled expressions (coming from .alf files)
400
- * Fixed 'alf --yaml show suppliers' that renderer a --text table instead of
401
- a yaml output
402
- * Fixed bugs when using Date and Time attributes with .rash files
403
- * Fixed bugs when using Date and Time attributes in restrict expressions
404
- compiled from the commandline
405
- * Fixed a few bugs when using attribute names that are ruby keywords
406
- (restrict & extend)
407
-
408
- # 0.9.2 / 2011.07.13
409
-
410
- # Bug fixes
411
-
412
- * Fixed the "alf show" command (undefined method `chain')
413
-
414
- # 0.9.1 / 2011.07.13
415
-
416
- ## Enhancements (public APIs)
417
-
418
- * Added the in-memory Alf::Relation data structure and associated tooling.
419
- This allows using Alf in a object-oriented usual way, in addition to the
420
- functional DSL:
421
-
422
- Alf.lispy.evaluate {
423
- (join (restrict :suppliers, lambda{ status > 10 }), :cities)
424
- }
425
-
426
- is equivalent to
427
-
428
- suppliers, cities = [...], [...]
429
- suppliers.restrict(lambda{ status > 10 }).join(cities)
430
-
431
- see README about how to obtain suppliers and cities relations in the first
432
- place.
433
-
434
- * Summarize now accepts a --allbut option, to specify 'by' attributes from an
435
- exclusion perspective
436
-
437
- * .alf files are now evaluated in such a way that backtraces are "traceability
438
- friendly"
439
-
440
- ## Non backward-compatible changes to public APIs
441
-
442
- * Lispy#with has been removed because not being stable enough. The clean way
443
- of reusing sub-queries is as follows (non purely functional, so far)
444
-
445
- kept_suppliers = (restrict :suppliers, lambda{ status > 10 })
446
- with_countries = (join kept_suppliers, :cities)
447
- supplying = (join with_countries, :supplies)
448
- (summarize supplying,
449
- [:country],
450
- :which => Agg::group(:pid),
451
- :total => Agg::sum{ qty })
452
-
453
- * As a consequence, named data sources (Symbols, like :suppliers above) are
454
- now resolved at compile time, which is less powerful, yet much simpler and
455
- sound.
456
-
457
- * Nest and Unnest have been renamed to Wrap and Unwrap respectively. This is
458
- to better conform to **Tutorial D**'s terminology.
459
-
460
- * Lispy#chain was kept public in 0.9.0 by error and has been entirely removed
461
- from the DSL.
462
-
463
- ## Enhancements (internals)
464
-
465
- * Reader.reader delegates to Reader.coerce when its first argument is not
466
- a String. This allows calling Reader.reader(args.first || $stdin) in quickl
467
- commands for example.
468
-
469
- * Operator, Operator::Relational and Operator::NonRelational have a .each
470
- class method that yields operator classes
471
-
472
- ## Bug fixes
473
-
474
- * Fixed a bug that led to an Nil error when using unary operators on $stdin
475
- * Fixed a bug when summarizing or sorting on Symbol attributes with ruby 1.8
476
- * Fixed numerous crashes under rubinius
477
-
478
- # 0.9.0 / 2011.06.19
479
-
480
- ## Enhancements
481
-
482
- * Birthday!
1
+ # 0.16.0 - 2014-02-18
2
+
3
+ * Fixed SQL compilation when projecting over set operators (minus, union,
4
+ intersection)
5
+ * Fixed SQL compilation of join with DEE/DUM.
6
+ * Removed `is_table_dee` attribute when projecting all attributes away from
7
+ a SQL data source.
8
+ * Fixed compilation of shortcut operators involving complex expressions.
9
+ * Fixed Tuple() that now accepts no arg and returns an empty tuple.
10
+ * Fixed "comparison failure" errors in the presence of `nil`. You should NOT
11
+ use `nil`, but robustness is probably necessary anyway.
12
+ * Added the ability to load a .rash file through Path#load. Result is an array
13
+ of hashes.
14
+ * Fixed default signature of Hierarchize.
15
+ * Added a basic `image` operator as a shortcut expression.
16
+
17
+ # 0.15.0 - 2013-11-01
18
+
19
+ New birthday.
data/Gemfile CHANGED
@@ -7,6 +7,7 @@ group :runtime do
7
7
  gem "alf-shell", path: "./alf-shell"
8
8
  gem "alf-sequel", path: "./alf-sequel"
9
9
  gem "alf-rack", path: "./alf-rack"
10
+ gem "alf-repl", path: "./alf-repl"
10
11
  end
11
12
 
12
13
  group :test do
@@ -15,9 +16,18 @@ group :test do
15
16
  gem "sqlite3", "~> 1.3", :platforms => ['mri', 'rbx']
16
17
  gem "jdbc-sqlite3", "~> 3.7", :platforms => ['jruby']
17
18
  gem "pg", "~> 0.14", :platforms => ['mri', 'rbx']
19
+ gem "highline", "~> 1.6"
18
20
  end
19
21
 
20
22
  group :release do
21
23
  gem "rake", "~> 10.1"
22
24
  gem "rspec", "~> 2.14"
23
25
  end
26
+
27
+ group :devel do
28
+ gem "rack", "~> 1.5"
29
+ gem "rack-robustness", "~> 1.1"
30
+ gem "sinatra", "~> 1.4"
31
+ gem "wlang", "~> 2.2"
32
+ gem "sprockets", "~> 2.10"
33
+ end
@@ -1,17 +1,18 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- alf (0.15.0)
5
- alf-core (~> 0.15.0)
6
- alf-rack (~> 0.15.0)
7
- alf-sequel (~> 0.15.0)
8
- alf-shell (~> 0.15.0)
9
- alf-sql (~> 0.15.0)
4
+ alf (0.16.0)
5
+ alf-core (~> 0.16.0)
6
+ alf-rack (~> 0.16.0)
7
+ alf-repl (~> 0.16.0)
8
+ alf-sequel (~> 0.16.0)
9
+ alf-shell (~> 0.16.0)
10
+ alf-sql (~> 0.16.0)
10
11
 
11
12
  PATH
12
13
  remote: ./alf-core
13
14
  specs:
14
- alf-core (0.15.0)
15
+ alf-core (0.16.0)
15
16
  domain (~> 1.0)
16
17
  myrrha (~> 3.0)
17
18
  path (~> 1.3)
@@ -20,39 +21,57 @@ PATH
20
21
  PATH
21
22
  remote: ./alf-rack
22
23
  specs:
23
- alf-rack (0.15.0)
24
- alf-core (~> 0.15.0)
24
+ alf-rack (0.16.0)
25
+ alf-core (= 0.16.0)
25
26
  rack (~> 1.5)
26
27
  rack-accept (~> 0.4.5)
27
28
  ruby_cop (~> 1.0)
28
29
 
30
+ PATH
31
+ remote: ./alf-repl
32
+ specs:
33
+ alf-repl (0.16.0)
34
+ alf-core (= 0.16.0)
35
+ alf-rack (= 0.16.0)
36
+ rack (~> 1.5)
37
+ rack-robustness (~> 1.1)
38
+ sinatra (~> 1.4)
39
+ sprockets (~> 2.10)
40
+ wlang (~> 2.2)
41
+
29
42
  PATH
30
43
  remote: ./alf-sequel
31
44
  specs:
32
- alf-sequel (0.15.0)
33
- alf-core (~> 0.15.0)
34
- alf-sql (~> 0.15.0)
45
+ alf-sequel (0.16.0)
46
+ alf-core (= 0.16.0)
47
+ alf-sql (= 0.16.0)
35
48
  sequel (~> 4.2)
36
49
 
37
50
  PATH
38
51
  remote: ./alf-shell
39
52
  specs:
40
- alf-shell (0.15.0)
41
- alf-core (~> 0.15.0)
53
+ alf-shell (0.16.0)
54
+ alf-core (= 0.16.0)
55
+ highline (~> 1.6)
42
56
  quickl (~> 0.4.3)
43
57
 
44
58
  PATH
45
59
  remote: ./alf-sql
46
60
  specs:
47
- alf-sql (0.15.0)
48
- alf-core (~> 0.15.0)
61
+ alf-sql (0.16.0)
62
+ alf-core (= 0.16.0)
49
63
  sexpr (~> 0.6.0)
50
64
 
51
65
  GEM
52
66
  remote: http://rubygems.org/
53
67
  specs:
68
+ backports (2.8.2)
69
+ citrus (2.4.1)
54
70
  diff-lcs (1.2.4)
55
71
  domain (1.0.0)
72
+ highline (1.6.20)
73
+ hike (1.2.3)
74
+ multi_json (1.8.2)
56
75
  myrrha (3.0.0)
57
76
  domain (~> 1.0)
58
77
  path (1.3.3)
@@ -61,6 +80,9 @@ GEM
61
80
  rack (1.5.2)
62
81
  rack-accept (0.4.5)
63
82
  rack (>= 0.4)
83
+ rack-protection (1.5.1)
84
+ rack
85
+ rack-robustness (1.1.0)
64
86
  rake (10.1.0)
65
87
  rspec (2.14.1)
66
88
  rspec-core (~> 2.14.0)
@@ -71,9 +93,26 @@ GEM
71
93
  diff-lcs (>= 1.1.3, < 2.0)
72
94
  rspec-mocks (2.14.4)
73
95
  ruby_cop (1.0.5)
74
- sequel (4.3.0)
96
+ sequel (4.4.0)
75
97
  sexpr (0.6.0)
98
+ sinatra (1.4.4)
99
+ rack (~> 1.4)
100
+ rack-protection (~> 1.4)
101
+ tilt (~> 1.3, >= 1.3.4)
102
+ sprockets (2.10.0)
103
+ hike (~> 1.2)
104
+ multi_json (~> 1.0)
105
+ rack (~> 1.0)
106
+ tilt (~> 1.1, != 1.3.0)
76
107
  sqlite3 (1.3.8)
108
+ temple (0.6.7)
109
+ tilt (1.4.1)
110
+ wlang (2.2.3)
111
+ backports (~> 2.6)
112
+ citrus (~> 2.4.1)
113
+ path (~> 1.3)
114
+ quickl (~> 0.4.3)
115
+ temple (~> 0.6)
77
116
 
78
117
  PLATFORMS
79
118
  ruby
@@ -82,11 +121,18 @@ DEPENDENCIES
82
121
  alf!
83
122
  alf-core!
84
123
  alf-rack!
124
+ alf-repl!
85
125
  alf-sequel!
86
126
  alf-shell!
87
127
  alf-sql!
128
+ highline (~> 1.6)
88
129
  jdbc-sqlite3 (~> 3.7)
89
130
  pg (~> 0.14)
131
+ rack (~> 1.5)
132
+ rack-robustness (~> 1.1)
90
133
  rake (~> 10.1)
91
134
  rspec (~> 2.14)
135
+ sinatra (~> 1.4)
136
+ sprockets (~> 2.10)
92
137
  sqlite3 (~> 1.3)
138
+ wlang (~> 2.2)
data/Rakefile CHANGED
@@ -7,6 +7,7 @@ SUB_MODULES = %w[
7
7
  sequel
8
8
  shell
9
9
  rack
10
+ repl
10
11
  doc
11
12
  rest
12
13
  ]
@@ -125,11 +125,12 @@ Gem::Specification.new do |s|
125
125
  #
126
126
  s.add_development_dependency("rake", "~> 10.1")
127
127
  s.add_development_dependency("rspec", "~> 2.14")
128
- s.add_dependency("alf-core", "~> 0.15.0")
129
- s.add_dependency("alf-sql", "~> 0.15.0")
130
- s.add_dependency("alf-sequel", "~> 0.15.0")
131
- s.add_dependency("alf-shell", "~> 0.15.0")
132
- s.add_dependency("alf-rack", "~> 0.15.0")
128
+ s.add_dependency("alf-core", "~> 0.16.0")
129
+ s.add_dependency("alf-sql", "~> 0.16.0")
130
+ s.add_dependency("alf-sequel", "~> 0.16.0")
131
+ s.add_dependency("alf-shell", "~> 0.16.0")
132
+ s.add_dependency("alf-rack", "~> 0.16.0")
133
+ s.add_dependency("alf-repl", "~> 0.16.0")
133
134
 
134
135
  # The version of ruby required by this gem
135
136
  #
@@ -4,19 +4,23 @@ template-info:
4
4
  manifest:
5
5
  Gemfile:
6
6
  safe-override: false
7
+ Gemfile.ci:
8
+ safe-override: false
7
9
  tasks/spec_test.rake:
8
10
  ignore: true
9
11
  spec/spec_helper.rb:
10
12
  ignore: true
11
13
  spec/test___lower__.rb:
12
14
  ignore: true
15
+ Rakefile:
16
+ safe-override: false
13
17
  variables:
14
18
  lower:
15
19
  alf
16
20
  upper:
17
21
  Alf
18
22
  version:
19
- 0.15.0
23
+ 0.16.0
20
24
  summary: |-
21
25
  Relational Algebra at your fingertips
22
26
  description: |-
@@ -29,10 +33,11 @@ variables:
29
33
  - http://rubygems.org/gems/alf
30
34
  - http://rubydoc.info/gems/alf
31
35
  dependencies:
32
- - {name: alf-core, version: "~> 0.15.0", groups: [runtime]}
33
- - {name: alf-sql, version: "~> 0.15.0", groups: [runtime]}
34
- - {name: alf-sequel, version: "~> 0.15.0", groups: [runtime]}
35
- - {name: alf-shell, version: "~> 0.15.0", groups: [runtime]}
36
- - {name: alf-rack, version: "~> 0.15.0", groups: [runtime]}
36
+ - {name: alf-core, version: "~> 0.16.0", groups: [runtime]}
37
+ - {name: alf-sql, version: "~> 0.16.0", groups: [runtime]}
38
+ - {name: alf-sequel, version: "~> 0.16.0", groups: [runtime]}
39
+ - {name: alf-shell, version: "~> 0.16.0", groups: [runtime]}
40
+ - {name: alf-rack, version: "~> 0.16.0", groups: [runtime]}
41
+ - {name: alf-repl, version: "~> 0.16.0", groups: [runtime]}
37
42
  - {name: rake, version: "~> 10.1", groups: [test, release]}
38
43
  - {name: rspec, version: "~> 2.14", groups: [test, release]}
@@ -2,3 +2,5 @@ require "alf-core"
2
2
  require "alf-sql"
3
3
  require "alf-sequel"
4
4
  require "alf-shell"
5
+ require "alf-rack"
6
+ require "alf-repl"
@@ -2,7 +2,7 @@ module Alf
2
2
  module Version
3
3
 
4
4
  MAJOR = 0
5
- MINOR = 15
5
+ MINOR = 16
6
6
  TINY = 0
7
7
 
8
8
  def self.to_s
@@ -0,0 +1,19 @@
1
+ require 'test_helpers'
2
+ describe Alf, "the ability to define shortcut operators" do
3
+
4
+ class MyShortcutOperator
5
+ include Alf::Algebra::Shortcut
6
+ include Alf::Algebra::Unary
7
+
8
+ def expand
9
+ allbut(rename(operand, foo: :bar), [:bar])
10
+ end
11
+ end
12
+
13
+ it 'works as expected' do
14
+ input = Relation(foo: 12, baz: 13)
15
+ expected = Relation(baz: 13)
16
+ input.my_shortcut_operator.should eq(expected)
17
+ end
18
+
19
+ end
@@ -9,4 +9,13 @@ describe Alf, "query" do
9
9
  subject.heading.should eq(Heading(sid: String, name: String, status: Integer, city: String))
10
10
  end
11
11
 
12
+ it 'should have all tuples of exact same class' do
13
+ clazz = nil
14
+ subject.each do |tuple|
15
+ clazz ||= tuple.class
16
+ tuple.class.object_id.should eq(clazz.object_id)
17
+ end
18
+ clazz.should_not be_nil
19
+ end
20
+
12
21
  end
@@ -0,0 +1,10 @@
1
+ require 'test_helpers'
2
+ describe Alf, "Tuple" do
3
+
4
+ it 'supports no attribute at all' do
5
+ lambda{
6
+ Tuple()
7
+ }.should_not raise_error
8
+ end
9
+
10
+ end
@@ -0,0 +1 @@
1
+ {sid: "S1", name: "Smith"}
@@ -0,0 +1,12 @@
1
+ require 'test_helpers'
2
+ describe Path, "the .rash registered loader" do
3
+
4
+ let(:expected){
5
+ [{sid: "S1", name: "Smith"}]
6
+ }
7
+
8
+ subject{ (Path.dir/"suppliers.rash").load }
9
+
10
+ it{ should eq(expected) }
11
+
12
+ end
@@ -0,0 +1,33 @@
1
+ require 'test_helpers'
2
+ module Alf
3
+ module Algebra
4
+ describe Image do
5
+
6
+ context 'on sap' do
7
+
8
+ subject{
9
+ db.connect do |c|
10
+ c.query{ image(suppliers, supplies, :supplying) }
11
+ end
12
+ }
13
+
14
+ it{ should be_a(Relation) }
15
+
16
+ it 'should have all suppliers' do
17
+ subject.size.should eq(5)
18
+ end
19
+
20
+ it 'should have the supplying attr' do
21
+ subject.each do |tuple|
22
+ tuple.supplying.should be_a(Relation)
23
+ if tuple.sid == 'S5'
24
+ tuple.supplying.should be_empty
25
+ end
26
+ end
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -7,3 +7,10 @@
7
7
  in Paris and in London, the minus simply returns the left operand. In
8
8
  contrast, if we project first then the city information is lost and we
9
9
  could restrict the left operand through common names, which is wrong.
10
+ - alf: |-
11
+ project(minus(suppliers, suppliers_in_paris), [])
12
+ optimized: |-
13
+ project(minus(suppliers, suppliers_in_paris), [])
14
+ comment: |-
15
+ This is NOT minus(project, project), cfr. counterexample provided by Kim
16
+ Mens project/master thesis at UCL.
@@ -0,0 +1,12 @@
1
+ require 'test_helpers'
2
+ describe Alf do
3
+
4
+ it 'should allow joining with an empty projection' do
5
+ db.connect do |conn|
6
+ rel = conn.query{ join(suppliers, project(suppliers, [])) }
7
+ exp = conn.query{ suppliers }
8
+ rel.should eq(exp)
9
+ end
10
+ end
11
+
12
+ end
@@ -0,0 +1,12 @@
1
+ require 'test_helpers'
2
+ describe Alf do
3
+
4
+ it 'should support projecting over no attribute' do
5
+ db.connect do |conn|
6
+ rel = conn.query{ project(suppliers, []) }
7
+ exp = Relation::DEE
8
+ rel.should eq(exp)
9
+ end
10
+ end
11
+
12
+ end
@@ -205,3 +205,22 @@
205
205
  # joining from Relation::DEE
206
206
  - alf: |-
207
207
  join(Relation::DEE, suppliers)
208
+ # joining with Relation::DEE
209
+ - alf: |-
210
+ join(suppliers, Relation::DEE)
211
+ # joining with Relation::DEE-like
212
+ - alf: |-
213
+ join(suppliers, project(suppliers, []))
214
+ sql: |-
215
+ SELECT t1.sid, t1.name, t1.status, t1.city
216
+ FROM suppliers AS t1 WHERE EXISTS(
217
+ SELECT * FROM suppliers AS t2
218
+ )
219
+ # joining from Relation::DEE-like
220
+ - alf: |-
221
+ join(project(suppliers, []), suppliers)
222
+ sql: |-
223
+ SELECT t2.sid, t2.name, t2.status, t2.city
224
+ FROM suppliers AS t2 WHERE EXISTS(
225
+ SELECT * FROM suppliers AS t1
226
+ )
@@ -46,3 +46,21 @@
46
46
  WHERE EXISTS(
47
47
  SELECT TRUE AS is_table_dee
48
48
  WHERE EXISTS(SELECT * FROM suppliers AS t1))
49
+ # projection of minus
50
+ - alf: |-
51
+ project(minus(suppliers, suppliers_in_london), [:sid])
52
+ sql: |-
53
+ WITH t3 AS (
54
+ (SELECT t1.sid, t1.name, t1.status, t1.city FROM suppliers AS t1)
55
+ EXCEPT
56
+ (SELECT t2.sid, t2.name, t2.status, t2.city FROM suppliers AS t2 WHERE t2.city = 'London')
57
+ ) SELECT t3.sid FROM t3 AS t3
58
+ # empty projection of of minus
59
+ - alf: |-
60
+ project(minus(suppliers, suppliers_in_london), [])
61
+ sql: |-
62
+ WITH t3 AS (
63
+ (SELECT t1.sid, t1.name, t1.status, t1.city FROM suppliers AS t1)
64
+ EXCEPT
65
+ (SELECT t2.sid, t2.name, t2.status, t2.city FROM suppliers AS t2 WHERE t2.city = 'London')
66
+ ) SELECT TRUE AS is_table_dee WHERE EXISTS(SELECT * FROM t3 AS t3)
@@ -0,0 +1,14 @@
1
+ require 'test_helpers'
2
+ describe Alf, "resulting type on coerce" do
3
+
4
+ it 'should use the coerced info' do
5
+ db.connect do |conn|
6
+ rel = conn.query{
7
+ project(coerce(suppliers, status: Integer), [:status])
8
+ }
9
+ exp = Relation[status: Integer]
10
+ rel.class.should eq(exp)
11
+ end
12
+ end
13
+
14
+ end
@@ -47,4 +47,25 @@ namespace :mod do
47
47
  end
48
48
  end
49
49
 
50
+ desc "Display 'git status' on each sub-module"
51
+ task :status do
52
+ in_each_sub_module("git status") do |sub|
53
+ system "git status"
54
+ end
55
+ end
56
+
57
+ desc "Run 'git reset --hard' on each sub-module"
58
+ task :'reset-hard' do
59
+ in_each_sub_module("git reset --hard") do |sub|
60
+ system "git reset --hard"
61
+ end
62
+ end
63
+
64
+ desc "Display 'git diff' on each sub-module"
65
+ task :diff do
66
+ in_each_sub_module("git diff") do |sub|
67
+ system "git diff"
68
+ end
69
+ end
70
+
50
71
  end
@@ -1,7 +1,51 @@
1
1
  namespace :release do
2
2
 
3
+ desc "Bump the version number"
4
+ task :bump, :to do |t, args|
5
+ require 'path'
6
+ raise "Missing version number" unless to = args[:to]
7
+ in_each_sub_module("bump to #{to}") do |sub|
8
+ noespec = Path("alf-#{sub}.noespec")
9
+ content = noespec.read.gsub(/^ version:\n (.*?)\n/){|x|
10
+ " version:\n #{to}\n"
11
+ }
12
+ noespec.write(content)
13
+ system("noe go -s")
14
+ system("git commit -a -m 'Bump version to #{to}'")
15
+ end
16
+ end
17
+
18
+ desc "Set the CHANGELOG 'FIX ME' to the current date"
19
+ task :stamp do
20
+ require 'time'
21
+ require 'path'
22
+ require 'alf/version'
23
+ date = Time.now.strftime("%Y-%m-%d")
24
+ version = Alf::VERSION
25
+ cmd = "git commit -a -m 'Releasing #{version}'"
26
+ doit = ->{
27
+ clog = Path('CHANGELOG.md')
28
+ clog.write clog.read.gsub(/FIX ME/, date)
29
+ system(cmd)
30
+ }
31
+ in_each_sub_module("stamping CHANGELOG in") do |sub|
32
+ doit()
33
+ end
34
+ doit()
35
+ end
36
+
37
+ desc "Tag the version and push everything"
38
+ task :tag => :stamp do
39
+ require 'alf/version'
40
+ version = Alf::VERSION
41
+ cmd = "git tag v#{version} && git push origin master --tags"
42
+ in_each_sub_module("'git tag and push' in") do |sub|
43
+ system(cmd)
44
+ end
45
+ end
46
+
3
47
  desc "Create all gems, including in sub-modules"
4
- task :gem do
48
+ task :gem => :doc do
5
49
  cmd = "rm -rf pkg && rake gem"
6
50
  in_each_sub_module("'rake gem' in") do |sub|
7
51
  system(cmd)
@@ -22,7 +66,7 @@ namespace :release do
22
66
  task :go => :gem do
23
67
  require 'alf/version'
24
68
  version = Alf::VERSION
25
- cmd = "gem push pkg/*.gem && git tag v#{version} && git push origin --tags"
69
+ cmd = "gem push pkg/*.gem"
26
70
  in_each_sub_module("'gem push & git tag' in") do |sub|
27
71
  system(cmd)
28
72
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alf
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.0
4
+ version: 0.16.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-10-31 00:00:00.000000000 Z
12
+ date: 2014-02-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -50,7 +50,7 @@ dependencies:
50
50
  requirements:
51
51
  - - ~>
52
52
  - !ruby/object:Gem::Version
53
- version: 0.15.0
53
+ version: 0.16.0
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
@@ -58,7 +58,7 @@ dependencies:
58
58
  requirements:
59
59
  - - ~>
60
60
  - !ruby/object:Gem::Version
61
- version: 0.15.0
61
+ version: 0.16.0
62
62
  - !ruby/object:Gem::Dependency
63
63
  name: alf-sql
64
64
  requirement: !ruby/object:Gem::Requirement
@@ -66,7 +66,7 @@ dependencies:
66
66
  requirements:
67
67
  - - ~>
68
68
  - !ruby/object:Gem::Version
69
- version: 0.15.0
69
+ version: 0.16.0
70
70
  type: :runtime
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
@@ -74,7 +74,7 @@ dependencies:
74
74
  requirements:
75
75
  - - ~>
76
76
  - !ruby/object:Gem::Version
77
- version: 0.15.0
77
+ version: 0.16.0
78
78
  - !ruby/object:Gem::Dependency
79
79
  name: alf-sequel
80
80
  requirement: !ruby/object:Gem::Requirement
@@ -82,7 +82,7 @@ dependencies:
82
82
  requirements:
83
83
  - - ~>
84
84
  - !ruby/object:Gem::Version
85
- version: 0.15.0
85
+ version: 0.16.0
86
86
  type: :runtime
87
87
  prerelease: false
88
88
  version_requirements: !ruby/object:Gem::Requirement
@@ -90,7 +90,7 @@ dependencies:
90
90
  requirements:
91
91
  - - ~>
92
92
  - !ruby/object:Gem::Version
93
- version: 0.15.0
93
+ version: 0.16.0
94
94
  - !ruby/object:Gem::Dependency
95
95
  name: alf-shell
96
96
  requirement: !ruby/object:Gem::Requirement
@@ -98,7 +98,7 @@ dependencies:
98
98
  requirements:
99
99
  - - ~>
100
100
  - !ruby/object:Gem::Version
101
- version: 0.15.0
101
+ version: 0.16.0
102
102
  type: :runtime
103
103
  prerelease: false
104
104
  version_requirements: !ruby/object:Gem::Requirement
@@ -106,7 +106,7 @@ dependencies:
106
106
  requirements:
107
107
  - - ~>
108
108
  - !ruby/object:Gem::Version
109
- version: 0.15.0
109
+ version: 0.16.0
110
110
  - !ruby/object:Gem::Dependency
111
111
  name: alf-rack
112
112
  requirement: !ruby/object:Gem::Requirement
@@ -114,7 +114,7 @@ dependencies:
114
114
  requirements:
115
115
  - - ~>
116
116
  - !ruby/object:Gem::Version
117
- version: 0.15.0
117
+ version: 0.16.0
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
@@ -122,7 +122,23 @@ dependencies:
122
122
  requirements:
123
123
  - - ~>
124
124
  - !ruby/object:Gem::Version
125
- version: 0.15.0
125
+ version: 0.16.0
126
+ - !ruby/object:Gem::Dependency
127
+ name: alf-repl
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ~>
132
+ - !ruby/object:Gem::Version
133
+ version: 0.16.0
134
+ type: :runtime
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ~>
140
+ - !ruby/object:Gem::Version
141
+ version: 0.16.0
126
142
  description: Alf brings a beautiful yet powerful relational algebra to the Shell and
127
143
  to Ruby.
128
144
  email:
@@ -146,11 +162,16 @@ files:
146
162
  - Manifest.txt
147
163
  - Rakefile
148
164
  - README.md
165
+ - spec/dd-operators/test_shortcut_operator.rb
149
166
  - spec/facade/test_query.rb
167
+ - spec/facade/test_tuple.rb
168
+ - spec/io/suppliers.rash
169
+ - spec/io/test_rash_loader.rb
150
170
  - spec/key-inference/queries.yml
151
171
  - spec/key-inference/test_all.rb
152
172
  - spec/migrations/test_folder_migration.rb
153
173
  - spec/migrations/test_sequel_migration.rb
174
+ - spec/operators/test_image.rb
154
175
  - spec/operators/ungroup/grouped.json
155
176
  - spec/operators/ungroup/test_on_json_content.rb
156
177
  - spec/operators/unwrap/test_on_json_content.rb
@@ -176,6 +197,8 @@ files:
176
197
  - spec/optimizer/restrict/sort.yml
177
198
  - spec/optimizer/restrict/union.yml
178
199
  - spec/optimizer/test_all.rb
200
+ - spec/regression/test_0001.rb
201
+ - spec/regression/test_0002.rb
179
202
  - spec/sql/helpers.rb
180
203
  - spec/sql/queries/01-leaf-operand.yml
181
204
  - spec/sql/queries/02-clip.yml
@@ -197,6 +220,7 @@ files:
197
220
  - spec/sql/test_sql_compiler.rb
198
221
  - spec/test_alf.rb
199
222
  - spec/test_helpers.rb
223
+ - spec/typing/test_typing_on_coerce.rb
200
224
  - tasks/doc.rake
201
225
  - tasks/fixtures.rake
202
226
  - tasks/gem.rake
@@ -217,7 +241,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
217
241
  version: '0'
218
242
  segments:
219
243
  - 0
220
- hash: 825147625363283130
244
+ hash: -1931769678054539313
221
245
  required_rubygems_version: !ruby/object:Gem::Requirement
222
246
  none: false
223
247
  requirements:
@@ -226,7 +250,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
226
250
  version: '0'
227
251
  segments:
228
252
  - 0
229
- hash: 825147625363283130
253
+ hash: -1931769678054539313
230
254
  requirements: []
231
255
  rubyforge_project:
232
256
  rubygems_version: 1.8.25
@@ -234,11 +258,16 @@ signing_key:
234
258
  specification_version: 3
235
259
  summary: Relational Algebra at your fingertips
236
260
  test_files:
261
+ - spec/dd-operators/test_shortcut_operator.rb
237
262
  - spec/facade/test_query.rb
263
+ - spec/facade/test_tuple.rb
264
+ - spec/io/suppliers.rash
265
+ - spec/io/test_rash_loader.rb
238
266
  - spec/key-inference/queries.yml
239
267
  - spec/key-inference/test_all.rb
240
268
  - spec/migrations/test_folder_migration.rb
241
269
  - spec/migrations/test_sequel_migration.rb
270
+ - spec/operators/test_image.rb
242
271
  - spec/operators/ungroup/grouped.json
243
272
  - spec/operators/ungroup/test_on_json_content.rb
244
273
  - spec/operators/unwrap/test_on_json_content.rb
@@ -264,6 +293,8 @@ test_files:
264
293
  - spec/optimizer/restrict/sort.yml
265
294
  - spec/optimizer/restrict/union.yml
266
295
  - spec/optimizer/test_all.rb
296
+ - spec/regression/test_0001.rb
297
+ - spec/regression/test_0002.rb
267
298
  - spec/sql/helpers.rb
268
299
  - spec/sql/queries/01-leaf-operand.yml
269
300
  - spec/sql/queries/02-clip.yml
@@ -285,3 +316,4 @@ test_files:
285
316
  - spec/sql/test_sql_compiler.rb
286
317
  - spec/test_alf.rb
287
318
  - spec/test_helpers.rb
319
+ - spec/typing/test_typing_on_coerce.rb