rubysouth-tokyo_model 0.0.2 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +10 -0
- data/Manifest.txt +3 -1
- data/README.rdoc +18 -19
- data/lib/tokyo_model.rb +6 -1
- data/lib/tokyo_model/adapters/abstract_adapter.rb +9 -3
- data/lib/tokyo_model/adapters/file.rb +4 -1
- data/lib/tokyo_model/adapters/tyrant.rb +6 -2
- data/lib/tokyo_model/persistable.rb +29 -9
- data/lib/tokyo_model/query.rb +109 -0
- data/test/test_basic_model.rb +2 -14
- data/test/test_helper.rb +14 -2
- data/test/test_query.rb +18 -0
- data/tokyo_model.gemspec +38 -0
- metadata +6 -2
data/History.txt
CHANGED
data/Manifest.txt
CHANGED
@@ -7,6 +7,7 @@ lib/tokyo_model/adapters/abstract_adapter.rb
|
|
7
7
|
lib/tokyo_model/adapters/file.rb
|
8
8
|
lib/tokyo_model/adapters/tyrant.rb
|
9
9
|
lib/tokyo_model/persistable.rb
|
10
|
+
lib/tokyo_model/query.rb
|
10
11
|
script/console
|
11
12
|
script/destroy
|
12
13
|
script/generate
|
@@ -15,4 +16,5 @@ test/fixtures/post.rb
|
|
15
16
|
test/test_basic_model.rb
|
16
17
|
test/test_file_adapter.rb
|
17
18
|
test/test_helper.rb
|
18
|
-
|
19
|
+
test/test_query.rb
|
20
|
+
tokyo_model.gemspec
|
data/README.rdoc
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
= TokyoModel
|
2
2
|
|
3
|
-
TokyoModel is a lightweight ORM that uses TokyoCabinet's table
|
4
|
-
as a storage backend.
|
5
|
-
|
3
|
+
TokyoModel is a small, lightweight ORM that uses TokyoCabinet's table
|
4
|
+
databases (TDB) as a storage backend. It is to ActiveRecord or Sequel what
|
5
|
+
Sinatra is to Rails or Merb.
|
6
6
|
|
7
7
|
Our first public release is planned for some time in late April 2009. At the
|
8
8
|
moment almost ALMOST NOTHING is implemented. It wouldn't even be fair to
|
@@ -12,21 +12,20 @@ describe this as pre-alpha. DO NOT USE THIS.
|
|
12
12
|
|
13
13
|
Copyright (c) 2009 Adrian Mugnolo and Norman Clarke
|
14
14
|
|
15
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
the following conditions:
|
15
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
16
|
+
of this software and associated documentation files (the 'Software'), to deal
|
17
|
+
in the Software without restriction, including without limitation the rights
|
18
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
19
|
+
copies of the Software, and to permit persons to whom the Software is
|
20
|
+
furnished to do so, subject to the following conditions:
|
22
21
|
|
23
|
-
The above copyright notice and this permission notice shall be
|
24
|
-
|
22
|
+
The above copyright notice and this permission notice shall be included in all
|
23
|
+
copies or substantial portions of the Software.
|
25
24
|
|
26
|
-
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
SOFTWARE
|
25
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
26
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
27
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
28
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
29
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
30
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
31
|
+
SOFTWARE.
|
data/lib/tokyo_model.rb
CHANGED
@@ -3,10 +3,11 @@ $:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) ||
|
|
3
3
|
require 'uri'
|
4
4
|
require 'tokyo_model/persistable'
|
5
5
|
require 'tokyo_model/adapters/abstract_adapter'
|
6
|
+
require 'tokyo_model/query'
|
6
7
|
|
7
8
|
module TokyoModel
|
8
9
|
|
9
|
-
VERSION = '0.0.
|
10
|
+
VERSION = '0.0.4'
|
10
11
|
ADAPTERS = [:file, :tyrant].freeze
|
11
12
|
DATABASES = []
|
12
13
|
|
@@ -26,6 +27,10 @@ module TokyoModel
|
|
26
27
|
DATABASES.each { |d| d.close }
|
27
28
|
end
|
28
29
|
|
30
|
+
def self.query
|
31
|
+
Query.new(DATABASES.first)
|
32
|
+
end
|
33
|
+
|
29
34
|
private
|
30
35
|
|
31
36
|
def self.adapter(scheme)
|
@@ -1,13 +1,19 @@
|
|
1
1
|
module TokyoModel
|
2
2
|
module Adapters
|
3
3
|
|
4
|
-
|
4
|
+
class ConnectionError < StandardError ; end
|
5
|
+
|
6
|
+
# This class exists almost exclusively to document the methods that all
|
5
7
|
# adapters must implement. The default implementation simply delegates
|
6
8
|
# everything to the underlying database file or connection.
|
7
9
|
class AbstractAdapter
|
8
10
|
|
9
11
|
attr :db
|
10
12
|
|
13
|
+
def connection
|
14
|
+
@db
|
15
|
+
end
|
16
|
+
|
11
17
|
# Delete the record identified by +pkey+.
|
12
18
|
def out(pkey)
|
13
19
|
@db.out(pkey)
|
@@ -30,11 +36,11 @@ module TokyoModel
|
|
30
36
|
end
|
31
37
|
|
32
38
|
# Perform a query.
|
33
|
-
def query
|
39
|
+
def query
|
34
40
|
raise NotImplementedError.new
|
35
41
|
end
|
36
42
|
|
37
|
-
# Delegate any unknown method calls to the underlying
|
43
|
+
# Delegate any unknown method calls to the underlying +@db+.
|
38
44
|
def method_missing(symbol, *args)
|
39
45
|
@db.send(symbol, *args)
|
40
46
|
end
|
@@ -6,7 +6,6 @@ module TokyoModel
|
|
6
6
|
# This adapter provides access to TokyoCabinet TDB files.
|
7
7
|
class File < AbstractAdapter
|
8
8
|
|
9
|
-
|
10
9
|
# Permitted open modes for accessing TDB files: +:read+, +:write+,
|
11
10
|
# +:create+, +:truncate+, +:nolock+, +:lock_noblock+ and +:sync+
|
12
11
|
OPEN_MODES = {
|
@@ -28,6 +27,10 @@ module TokyoModel
|
|
28
27
|
@db.open(uri.path, args.empty? ? File.default_open_mode : File.open_mode(*args))
|
29
28
|
end
|
30
29
|
|
30
|
+
def query
|
31
|
+
Query.new(TokyoCabinet::TDBQRY.new(@db))
|
32
|
+
end
|
33
|
+
|
31
34
|
class << self
|
32
35
|
|
33
36
|
# The default open mode is read/write.
|
@@ -16,12 +16,16 @@ module TokyoModel
|
|
16
16
|
def initialize(uri, *args)
|
17
17
|
@db = TokyoTyrant::RDBTBL::new
|
18
18
|
if uri.scheme == "unix"
|
19
|
-
@db.open(uri.path, 0)
|
19
|
+
@db.open(uri.path, 0) || raise(ConnectionError.new(@db.errmsg(@db.ecode)))
|
20
20
|
else
|
21
|
-
@db.open(uri.host, uri.port || DEFAULT_PORT)
|
21
|
+
@db.open(uri.host, uri.port || DEFAULT_PORT) || raise(ConnectionError.new(@db.errmsg(@db.ecode)))
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
def query
|
26
|
+
Query.new(TokyoTyrant::RDBQRY.new(@db))
|
27
|
+
end
|
28
|
+
|
25
29
|
end
|
26
30
|
end
|
27
31
|
end
|
@@ -8,8 +8,13 @@ module TokyoModel
|
|
8
8
|
|
9
9
|
module ClassMethods
|
10
10
|
|
11
|
-
def
|
12
|
-
|
11
|
+
def db=(*args)
|
12
|
+
db_or_uri = args.shift
|
13
|
+
if db_or_uri.respond_to?(:scheme)
|
14
|
+
@db = TokyoModel.open(db_or_uri, *args)
|
15
|
+
else
|
16
|
+
@db = db_or_uri
|
17
|
+
end
|
13
18
|
end
|
14
19
|
|
15
20
|
def db
|
@@ -19,7 +24,7 @@ module TokyoModel
|
|
19
24
|
def get(id)
|
20
25
|
obj = new
|
21
26
|
if record = db.get(id)
|
22
|
-
record.each { |k, v| obj.send("#{k}=".to_sym, v) }
|
27
|
+
record.each { |k, v| obj.send("#{k}=".to_sym, v) if obj.respond_to?("#{k}=".to_sym) }
|
23
28
|
obj.id = id
|
24
29
|
end
|
25
30
|
obj
|
@@ -27,7 +32,21 @@ module TokyoModel
|
|
27
32
|
alias_method :find, :get
|
28
33
|
|
29
34
|
def setter_methods
|
30
|
-
|
35
|
+
if !@setter_methods
|
36
|
+
im = instance_methods - Object.instance_methods
|
37
|
+
@setter_methods = im.select {|m| im.include?("#{m}=") && m =~ /[^=]$/ }
|
38
|
+
end
|
39
|
+
@setter_methods
|
40
|
+
end
|
41
|
+
|
42
|
+
def find(&block)
|
43
|
+
ids = query.conditions(&block).execute
|
44
|
+
ids.inject([]) { |m, o| m << get(o); m }
|
45
|
+
end
|
46
|
+
|
47
|
+
def query
|
48
|
+
type = self.to_s
|
49
|
+
db.query.conditions { type_is type }
|
31
50
|
end
|
32
51
|
|
33
52
|
end
|
@@ -37,11 +56,12 @@ module TokyoModel
|
|
37
56
|
end
|
38
57
|
|
39
58
|
def attributes
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
59
|
+
hash = {}
|
60
|
+
self.class.setter_methods.each do |s|
|
61
|
+
val = send(s.to_sym)
|
62
|
+
hash[s] = val if val
|
44
63
|
end
|
64
|
+
hash
|
45
65
|
end
|
46
66
|
|
47
67
|
def db
|
@@ -57,7 +77,7 @@ module TokyoModel
|
|
57
77
|
end
|
58
78
|
|
59
79
|
def put
|
60
|
-
db.put(id, attributes)
|
80
|
+
db.put(id, attributes.merge({ "type" => self.class.to_s }))
|
61
81
|
end
|
62
82
|
alias_method :save, :put
|
63
83
|
|
@@ -0,0 +1,109 @@
|
|
1
|
+
module TokyoModel
|
2
|
+
|
3
|
+
class Query
|
4
|
+
|
5
|
+
attr :conditions, :db_query
|
6
|
+
|
7
|
+
# Query condition: string is equal to
|
8
|
+
QCSTREQ = 1
|
9
|
+
# Query condition: string is included in
|
10
|
+
QCSTRINC = 2
|
11
|
+
# Query condition: string begins with
|
12
|
+
QCSTRBW = 3
|
13
|
+
# Query condition: string ends with
|
14
|
+
QCSTREW = 4
|
15
|
+
# Query condition: string includes all tokens in
|
16
|
+
QCSTRAND = 5
|
17
|
+
# Query condition: string includes at least one token in
|
18
|
+
QCSTROR = 6
|
19
|
+
# Query condition: string is equal to at least one token in
|
20
|
+
QCSTROREQ = 7
|
21
|
+
# Query condition: string matches regular expressions of
|
22
|
+
QCSTRRX = 8
|
23
|
+
# Query condition: number is equal to
|
24
|
+
QCNUMEQ = 9
|
25
|
+
# Query condition: number is greater than
|
26
|
+
QCNUMGT = 10
|
27
|
+
# Query condition: number is greater than or equal to
|
28
|
+
QCNUMGE = 11
|
29
|
+
# Query condition: number is less than
|
30
|
+
QCNUMLT = 12
|
31
|
+
# Query condition: number is less than or equal to
|
32
|
+
QCNUMLE = 13
|
33
|
+
# Query condition: number is between two tokens of
|
34
|
+
QCNUMBT = 14
|
35
|
+
# Query condition: number is equal to at least one token in
|
36
|
+
QCNUMOREQ = 15
|
37
|
+
# Query condition: negation flag
|
38
|
+
QCNEGATE = 1 << 24
|
39
|
+
# Query condition: no index flag
|
40
|
+
QCNOIDX = 1 << 25
|
41
|
+
# Order type: string ascending
|
42
|
+
QOSTRASC = 1
|
43
|
+
# Order type: string descending
|
44
|
+
QOSTRDESC = 2
|
45
|
+
# Order type: number ascending
|
46
|
+
QONUMASC = 3
|
47
|
+
# Order type: number descending
|
48
|
+
QONUMDESC = 4
|
49
|
+
# Post treatment: modify the record
|
50
|
+
QPPUT = 1 << 0
|
51
|
+
# Post treatment: remove the record
|
52
|
+
QPOUT = 1 << 1
|
53
|
+
# Post treatment: stop the iteration
|
54
|
+
QPSTOP = 1 << 24
|
55
|
+
|
56
|
+
def initialize(db_query)
|
57
|
+
@db_query = db_query
|
58
|
+
@conditions = []
|
59
|
+
end
|
60
|
+
|
61
|
+
def conditions(&block)
|
62
|
+
@conditions += QueryConditions.new.instance_eval(&block)
|
63
|
+
self
|
64
|
+
end
|
65
|
+
|
66
|
+
def execute
|
67
|
+
@conditions.each { |c| @db_query.addcond(*c) }
|
68
|
+
@db_query.search
|
69
|
+
end
|
70
|
+
|
71
|
+
CONDITIONS = {
|
72
|
+
:is => QCSTREQ,
|
73
|
+
:like => QCSTRINC,
|
74
|
+
:has => QCSTROR,
|
75
|
+
:has_all => QCSTRAND,
|
76
|
+
:equals_one => QCSTROREQ,
|
77
|
+
:begins_with => QCSTRBW,
|
78
|
+
:ends_with => QCSTREW,
|
79
|
+
:matches => QCSTRRX,
|
80
|
+
:eq => QCNUMEQ,
|
81
|
+
:gt => QCNUMGT,
|
82
|
+
:gte => QCNUMGE,
|
83
|
+
:lt => QCNUMLT,
|
84
|
+
:lte => QCNUMLE,
|
85
|
+
:btw => QCNUMBT,
|
86
|
+
:in => QCNUMOREQ
|
87
|
+
}
|
88
|
+
end
|
89
|
+
|
90
|
+
class QueryConditions
|
91
|
+
|
92
|
+
attr :conditions
|
93
|
+
|
94
|
+
METHODS = Query::CONDITIONS.keys.inject([]) { |m, o| m << o.to_s }.join("|")
|
95
|
+
|
96
|
+
def initialize
|
97
|
+
@conditions = []
|
98
|
+
end
|
99
|
+
|
100
|
+
def method_missing(symbol, *args)
|
101
|
+
symbol.to_s =~ /([a-z0-9_]+)_(#{METHODS}+)(!)?/
|
102
|
+
name, op, negate = $1, $2.to_sym, $3
|
103
|
+
op = negate ? Query::QCNEGATE | Query::CONDITIONS[op] : Query::CONDITIONS[op]
|
104
|
+
conditions << [name, op] + args
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
data/test/test_basic_model.rb
CHANGED
@@ -1,27 +1,15 @@
|
|
1
1
|
require 'test_helper'
|
2
|
-
require File.dirname(__FILE__) + "/fixtures/post.rb"
|
3
2
|
|
4
3
|
class TestBasicModel < Test::Unit::TestCase
|
5
4
|
|
6
5
|
setup do
|
7
|
-
|
8
|
-
@post = Post.new
|
9
|
-
@post.title = "First post!"
|
10
|
-
@post.body = "Lorem ipsum dolor sit amet, consectetur adipisicing elit"
|
11
|
-
@post.author = "John Doe"
|
12
|
-
@post.permalink = "http://example.org/posts/1"
|
13
|
-
@post.put
|
14
|
-
end
|
15
|
-
|
16
|
-
teardown do
|
17
|
-
TokyoModel.close
|
18
|
-
FileUtils.rm_f dbpath
|
6
|
+
load_fixtures
|
19
7
|
end
|
20
8
|
|
21
9
|
context "a model" do
|
22
10
|
|
23
11
|
should "have a db connection" do
|
24
|
-
|
12
|
+
assert Post.db.respond_to?(:get)
|
25
13
|
end
|
26
14
|
|
27
15
|
should "be gettable" do
|
data/test/test_helper.rb
CHANGED
@@ -5,13 +5,25 @@ require 'test/unit'
|
|
5
5
|
require 'contest'
|
6
6
|
|
7
7
|
require File.dirname(__FILE__) + '/../lib/tokyo_model'
|
8
|
+
require File.dirname(__FILE__) + "/fixtures/post.rb"
|
8
9
|
|
9
10
|
def tmpdir
|
10
11
|
@tmpdir ||= File.join(File.dirname(File.expand_path(__FILE__)), "tmp")
|
11
12
|
end
|
12
13
|
|
13
14
|
def dbpath
|
14
|
-
"#{tmpdir}/test.
|
15
|
+
"#{tmpdir}/test.tct"
|
15
16
|
end
|
16
17
|
|
17
|
-
|
18
|
+
def load_fixtures
|
19
|
+
@post = Post.new
|
20
|
+
@post.title = "First post!"
|
21
|
+
@post.body = "Lorem ipsum dolor sit amet, consectetur adipisicing elit"
|
22
|
+
@post.author = "John Doe"
|
23
|
+
@post.permalink = "http://example.org/posts/1"
|
24
|
+
@post.save
|
25
|
+
end
|
26
|
+
|
27
|
+
FileUtils.mkdir_p tmpdir
|
28
|
+
TokyoModel.open("file:#{dbpath}", :write, :read, :create, :truncate)
|
29
|
+
# TokyoModel.open("tyrant://127.0.0.1")
|
data/test/test_query.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestQuery < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
load_fixtures
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_a_query
|
10
|
+
@posts = Post.find do
|
11
|
+
title_has! "NONE!"
|
12
|
+
author_is "John Doe"
|
13
|
+
body_matches "[a-zA-Z,\.\s]*$"
|
14
|
+
end
|
15
|
+
p @posts
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
data/tokyo_model.gemspec
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{tokyo_model}
|
5
|
+
s.version = "0.0.4"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Adrian Mugnolo", "Norman Clarke"]
|
9
|
+
s.date = %q{2009-04-21}
|
10
|
+
s.description = %q{}
|
11
|
+
s.email = ["adrian@mugnolo.com", "norman@randomba.org"]
|
12
|
+
s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.rdoc"]
|
13
|
+
s.files = ["History.txt", "Manifest.txt", "README.rdoc", "Rakefile", "lib/tokyo_model.rb", "lib/tokyo_model/adapters/abstract_adapter.rb", "lib/tokyo_model/adapters/file.rb", "lib/tokyo_model/adapters/tyrant.rb", "lib/tokyo_model/persistable.rb", "lib/tokyo_model/query.rb", "script/console", "script/destroy", "script/generate", "test/contest.rb", "test/fixtures/post.rb", "test/test_basic_model.rb", "test/test_file_adapter.rb", "test/test_helper.rb", "test/test_query.rb", "tokyo_model.gemspec"]
|
14
|
+
s.has_rdoc = true
|
15
|
+
s.homepage = %q{http://github.com/rubysouth/tokyo_model}
|
16
|
+
s.rdoc_options = ["--main", "README.rdoc"]
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.rubyforge_project = %q{tokyo-model}
|
19
|
+
s.rubygems_version = %q{1.3.2}
|
20
|
+
s.summary = %q{}
|
21
|
+
s.test_files = ["test/test_basic_model.rb", "test/test_file_adapter.rb", "test/test_helper.rb", "test/test_query.rb"]
|
22
|
+
|
23
|
+
if s.respond_to? :specification_version then
|
24
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
25
|
+
s.specification_version = 3
|
26
|
+
|
27
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
28
|
+
s.add_development_dependency(%q<newgem>, [">= 1.3.0"])
|
29
|
+
s.add_development_dependency(%q<hoe>, [">= 1.8.0"])
|
30
|
+
else
|
31
|
+
s.add_dependency(%q<newgem>, [">= 1.3.0"])
|
32
|
+
s.add_dependency(%q<hoe>, [">= 1.8.0"])
|
33
|
+
end
|
34
|
+
else
|
35
|
+
s.add_dependency(%q<newgem>, [">= 1.3.0"])
|
36
|
+
s.add_dependency(%q<hoe>, [">= 1.8.0"])
|
37
|
+
end
|
38
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubysouth-tokyo_model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adrian Mugnolo
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2009-04-
|
13
|
+
date: 2009-04-21 00:00:00 -07:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -55,6 +55,7 @@ files:
|
|
55
55
|
- lib/tokyo_model/adapters/file.rb
|
56
56
|
- lib/tokyo_model/adapters/tyrant.rb
|
57
57
|
- lib/tokyo_model/persistable.rb
|
58
|
+
- lib/tokyo_model/query.rb
|
58
59
|
- script/console
|
59
60
|
- script/destroy
|
60
61
|
- script/generate
|
@@ -63,6 +64,8 @@ files:
|
|
63
64
|
- test/test_basic_model.rb
|
64
65
|
- test/test_file_adapter.rb
|
65
66
|
- test/test_helper.rb
|
67
|
+
- test/test_query.rb
|
68
|
+
- tokyo_model.gemspec
|
66
69
|
has_rdoc: true
|
67
70
|
homepage: http://github.com/rubysouth/tokyo_model
|
68
71
|
post_install_message:
|
@@ -94,3 +97,4 @@ test_files:
|
|
94
97
|
- test/test_basic_model.rb
|
95
98
|
- test/test_file_adapter.rb
|
96
99
|
- test/test_helper.rb
|
100
|
+
- test/test_query.rb
|