rhubarb 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|