rhubarb 0.2.1 → 0.2.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.
- data/CHANGES +9 -1
- data/Rakefile +13 -13
- data/TODO +4 -0
- data/VERSION +1 -1
- data/lib/rhubarb/classmixins.rb +11 -3
- data/lib/rhubarb/persisting.rb +11 -1
- data/lib/rhubarb/util.rb +8 -0
- data/{ruby-rhubarb.spec → ruby-rhubarb.spec.in} +2 -2
- data/test/helper.rb +2 -0
- data/test/test_rhubarb.rb +48 -2
- metadata +3 -3
data/CHANGES
CHANGED
@@ -1,4 +1,12 @@
|
|
1
|
-
version 0.2.
|
1
|
+
version 0.2.2
|
2
|
+
|
3
|
+
* explicit support for :blob-typed columns (blob values will be
|
4
|
+
appropriately stored in create statements and attribute assignments).
|
5
|
+
Note that it is still not possible to search for rows based on the
|
6
|
+
value in a blob-valued column.
|
7
|
+
* equality and hash methods (both based on class and row identity).
|
8
|
+
|
9
|
+
version 0.2.1 (97339238fbca0116b686f64343d479d15af8a03f)
|
2
10
|
|
3
11
|
* Code cleanups
|
4
12
|
|
data/Rakefile
CHANGED
@@ -41,13 +41,12 @@ def pkg_version
|
|
41
41
|
return version.chomp
|
42
42
|
end
|
43
43
|
|
44
|
-
def
|
45
|
-
|
46
|
-
return version.chomp
|
44
|
+
def name
|
45
|
+
return 'rhubarb'
|
47
46
|
end
|
48
47
|
|
49
48
|
def pkg_name
|
50
|
-
return
|
49
|
+
return "ruby-" + name()
|
51
50
|
end
|
52
51
|
|
53
52
|
def pkg_spec
|
@@ -71,15 +70,18 @@ def rpm_dirs
|
|
71
70
|
end
|
72
71
|
|
73
72
|
desc "create RPMs"
|
74
|
-
task :rpms => [:build, :tarball] do
|
75
|
-
require 'fileutils'
|
73
|
+
task :rpms => [:build, :tarball, :gen_spec] do
|
76
74
|
FileUtils.cp pkg_spec(), 'SPECS'
|
77
75
|
sh "rpmbuild --define=\"_topdir \${PWD}\" -ba SPECS/#{pkg_spec}"
|
78
76
|
end
|
79
77
|
|
78
|
+
desc "Generate the specfile"
|
79
|
+
task :gen_spec do
|
80
|
+
sh "cat #{pkg_spec}" + ".in" + "| sed 's/RHUBARB_VERSION/#{pkg_version}/' > #{pkg_spec}"
|
81
|
+
end
|
82
|
+
|
80
83
|
desc "Create a tarball"
|
81
|
-
task :tarball => :make_rpmdirs do
|
82
|
-
require 'fileutils'
|
84
|
+
task :tarball => [:make_rpmdirs, :gen_spec] do
|
83
85
|
FileUtils.cp_r 'lib', pkg_dir()
|
84
86
|
FileUtils.cp ['LICENSE', 'README.rdoc', 'CHANGES', 'TODO', 'VERSION'], pkg_dir()
|
85
87
|
sh "tar -cf #{pkg_source} #{pkg_dir}"
|
@@ -87,17 +89,15 @@ task :tarball => :make_rpmdirs do
|
|
87
89
|
end
|
88
90
|
|
89
91
|
desc "Make dirs for building RPM"
|
90
|
-
task :make_rpmdirs => :
|
91
|
-
require 'fileutils'
|
92
|
+
task :make_rpmdirs => :clean do
|
92
93
|
FileUtils.mkdir pkg_dir()
|
93
94
|
FileUtils.mkdir rpm_dirs()
|
94
95
|
end
|
95
96
|
|
96
97
|
desc "Cleanup after an RPM build"
|
97
|
-
task :
|
98
|
+
task :clean do
|
98
99
|
require 'fileutils'
|
99
|
-
FileUtils.rm_r pkg_dir(), :force => true
|
100
|
-
FileUtils.rm_r rpm_dirs(), :force => true
|
100
|
+
FileUtils.rm_r [pkg_dir(), rpm_dirs(), pkg_spec(), 'pkg', name() + ".gemspec"], :force => true
|
101
101
|
end
|
102
102
|
|
103
103
|
require 'spec/rake/spectask'
|
data/TODO
CHANGED
@@ -5,6 +5,10 @@
|
|
5
5
|
* Documentation
|
6
6
|
* Standalone examples (i.e. not just "please see the test suite")
|
7
7
|
* Resolve issues related to using prepared statements
|
8
|
+
* Find rows by value of blob-valued field
|
9
|
+
* Automatic zlib compression of blobs (:zblob type)
|
10
|
+
* Automatic yaml serialization of arbitrary Ruby objects (:rubyobj type)
|
11
|
+
* Refactor column value transformations (e.g. for foreign-key rows, blobs, [future] zblob/rubyobj, etc.) to be more regular and uniform
|
8
12
|
|
9
13
|
Legend:
|
10
14
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.2
|
data/lib/rhubarb/classmixins.rb
CHANGED
@@ -128,6 +128,7 @@ module Rhubarb
|
|
128
128
|
end
|
129
129
|
|
130
130
|
self.colnames.merge([cname])
|
131
|
+
self.colkinds[cname] = kind
|
131
132
|
self.columns << Column.new(cname, kind, quals)
|
132
133
|
|
133
134
|
# add accessors
|
@@ -138,8 +139,14 @@ module Rhubarb
|
|
138
139
|
end
|
139
140
|
|
140
141
|
if not rf
|
142
|
+
xform = nil
|
143
|
+
|
144
|
+
if kind == :blob
|
145
|
+
xform = Util::blobify_proc
|
146
|
+
end
|
147
|
+
|
141
148
|
define_method set_method_name do |arg|
|
142
|
-
@tuple["#{cname}"] = arg
|
149
|
+
@tuple["#{cname}"] = xform ? xform.call(arg) : arg
|
143
150
|
update cname, arg
|
144
151
|
end
|
145
152
|
else
|
@@ -202,7 +209,7 @@ module Rhubarb
|
|
202
209
|
|
203
210
|
# resolve any references in the args
|
204
211
|
new_row.each do |column,value|
|
205
|
-
new_row[column] = Util::rhubarb_fk_identity(value)
|
212
|
+
new_row[column] = colkinds[column] == :blob ? Util::blobify(value) : Util::rhubarb_fk_identity(value)
|
206
213
|
end
|
207
214
|
|
208
215
|
stmt = "insert into #{table_name} (#{colspec}) values (#{valspec})"
|
@@ -246,7 +253,7 @@ module Rhubarb
|
|
246
253
|
# The API purposefully does not expose the ability to create a
|
247
254
|
# row with a given id, and created and updated values are
|
248
255
|
# maintained automatically by the API.
|
249
|
-
attr_accessor :columns, :colnames, :constraints, :dirtied, :refs, :creation_callbacks
|
256
|
+
attr_accessor :columns, :colnames, :colkinds, :constraints, :dirtied, :refs, :creation_callbacks
|
250
257
|
end
|
251
258
|
end
|
252
259
|
|
@@ -254,6 +261,7 @@ module Rhubarb
|
|
254
261
|
self.columns ||= [Column.new(:row_id, :integer, [:primary_key]), Column.new(:created, :integer, []), Column.new(:updated, :integer, [])]
|
255
262
|
self.colnames ||= Set.new [:created, :updated]
|
256
263
|
self.constraints ||= []
|
264
|
+
self.colkinds ||= {}
|
257
265
|
self.dirtied ||= {}
|
258
266
|
self.refs ||= {}
|
259
267
|
self.creation_callbacks ||= []
|
data/lib/rhubarb/persisting.rb
CHANGED
@@ -34,7 +34,17 @@ module Rhubarb
|
|
34
34
|
freshen
|
35
35
|
not @tuple
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
|
+
def hash
|
39
|
+
freshen
|
40
|
+
@row_id ^ self.table_name.hash
|
41
|
+
end
|
42
|
+
|
43
|
+
def ==(other)
|
44
|
+
freshen
|
45
|
+
self.class == other.class && other.row_id == self.row_id
|
46
|
+
end
|
47
|
+
|
38
48
|
# Initializes a new instance backed by a tuple of values. Do not call this directly.
|
39
49
|
# Create new instances with the create or find methods.
|
40
50
|
def initialize(tup)
|
data/lib/rhubarb/util.rb
CHANGED
@@ -24,5 +24,13 @@ module Rhubarb
|
|
24
24
|
def self.rhubarb_fk_identity(object)
|
25
25
|
(object.row_id if object.class.ancestors.include? Persisting) || object
|
26
26
|
end
|
27
|
+
|
28
|
+
def self.blobify(obj)
|
29
|
+
blobify_proc.call(obj)
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.blobify_proc
|
33
|
+
@blobify_proc ||= Proc.new {|x| x.is_a?(SQLite3::Blob) ? x : SQLite3::Blob.new(x)}
|
34
|
+
end
|
27
35
|
end
|
28
36
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
%{!?ruby_sitelib: %global ruby_sitelib %(ruby -rrbconfig -e 'puts Config::CONFIG["sitelibdir"] ')}
|
2
|
-
%define rel 0.
|
2
|
+
%define rel 0.1
|
3
3
|
|
4
4
|
Summary: Simple versioned object-graph persistence layer
|
5
5
|
Name: ruby-rhubarb
|
6
|
-
Version:
|
6
|
+
Version: RHUBARB_VERSION
|
7
7
|
Release: %{rel}%{?dist}
|
8
8
|
Group: Applications/System
|
9
9
|
License: ASL 2.0
|
data/test/helper.rb
CHANGED
data/test/test_rhubarb.rb
CHANGED
@@ -11,8 +11,7 @@
|
|
11
11
|
#
|
12
12
|
# http://www.apache.org/licenses/LICENSE-2.0
|
13
13
|
|
14
|
-
require '
|
15
|
-
require 'test/unit'
|
14
|
+
require 'helper'
|
16
15
|
|
17
16
|
class TestClass
|
18
17
|
include Rhubarb::Persisting
|
@@ -88,6 +87,11 @@ class FreshTestTable
|
|
88
87
|
declare_column :fum, :integer
|
89
88
|
end
|
90
89
|
|
90
|
+
class BlobTestTable
|
91
|
+
include Rhubarb::Persisting
|
92
|
+
declare_column :info, :blob
|
93
|
+
end
|
94
|
+
|
91
95
|
class BackendBasicTests < Test::Unit::TestCase
|
92
96
|
def setup
|
93
97
|
Rhubarb::Persistence::open(":memory:")
|
@@ -101,6 +105,7 @@ class BackendBasicTests < Test::Unit::TestCase
|
|
101
105
|
klasses << ToRef
|
102
106
|
klasses << FromRef
|
103
107
|
klasses << FreshTestTable
|
108
|
+
klasses << BlobTestTable
|
104
109
|
klasses << RhubarbNamespace::NMTC
|
105
110
|
klasses << RhubarbNamespace::NMTC2
|
106
111
|
|
@@ -554,6 +559,26 @@ class BackendBasicTests < Test::Unit::TestCase
|
|
554
559
|
end
|
555
560
|
|
556
561
|
end
|
562
|
+
|
563
|
+
def test_equality
|
564
|
+
tc1 = TestClass.create(:foo=>1, :bar=>"hello")
|
565
|
+
tc2 = TestClass.create(:foo=>1, :bar=>"hello")
|
566
|
+
tc3 = TestClass.create(:foo=>2, :bar=>"goodbye")
|
567
|
+
|
568
|
+
tc1p = TestClass.find(tc1.row_id)
|
569
|
+
|
570
|
+
assert_equal(tc1, tc1) # equality is reflexive
|
571
|
+
assert_equal(tc1p, tc1) # even after find operations
|
572
|
+
assert_equal(tc1, tc1p) # ... and it should be symmetric
|
573
|
+
assert_not_equal(tc1, tc2) # these are not identical
|
574
|
+
assert_not_equal(tc1p, tc2) # even after find operations
|
575
|
+
assert_not_equal(tc2, tc1p) # ... and it should be symmetric
|
576
|
+
assert_not_same(tc1, tc2) # but these are not identical
|
577
|
+
assert_not_equal(tc1, tc3) # these aren't even equal!
|
578
|
+
assert_not_equal(tc2, tc3) # neither are these
|
579
|
+
assert_not_equal(tc3, tc1) # and inequality should hold
|
580
|
+
assert_not_equal(tc3, tc2) # under symmetry
|
581
|
+
end
|
557
582
|
|
558
583
|
def freshness_query_fixture
|
559
584
|
@flist = []
|
@@ -629,4 +654,25 @@ class BackendBasicTests < Test::Unit::TestCase
|
|
629
654
|
end
|
630
655
|
end
|
631
656
|
end
|
657
|
+
|
658
|
+
def test_blob_data
|
659
|
+
words = %w{the quick brown fox jumps over a lazy dog now is time for all good men to come aid party jackdaws love my big sphinx of quartz}
|
660
|
+
text = ""
|
661
|
+
(0..300).each do
|
662
|
+
text << words[rand(words.length)] << " "
|
663
|
+
end
|
664
|
+
|
665
|
+
compressed_text = Zlib::Deflate.deflate(text)
|
666
|
+
|
667
|
+
row = BlobTestTable.create(:info => text)
|
668
|
+
|
669
|
+
crow = BlobTestTable.create(:info => compressed_text)
|
670
|
+
|
671
|
+
btrow = BlobTestTable.find(row.row_id)
|
672
|
+
cbtrow = BlobTestTable.find(crow.row_id)
|
673
|
+
|
674
|
+
assert_equal(text, btrow.info)
|
675
|
+
assert_equal(text, Zlib::Inflate.inflate(cbtrow.info))
|
676
|
+
end
|
677
|
+
|
632
678
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rhubarb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- William Benton
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-02-
|
12
|
+
date: 2010-02-22 00:00:00 -06:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -59,7 +59,7 @@ files:
|
|
59
59
|
- lib/rhubarb/reference.rb
|
60
60
|
- lib/rhubarb/rhubarb.rb
|
61
61
|
- lib/rhubarb/util.rb
|
62
|
-
- ruby-rhubarb.spec
|
62
|
+
- ruby-rhubarb.spec.in
|
63
63
|
- test/helper.rb
|
64
64
|
- test/test_rhubarb.rb
|
65
65
|
has_rdoc: true
|