model_set 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/.rbenv-gemsets +1 -0
- data/.rbenv-version +1 -0
- data/Gemfile +3 -0
- data/Rakefile +2 -39
- data/VERSION +1 -1
- data/lib/model_set/conditioned.rb +14 -15
- data/lib/model_set/conditions.rb +26 -33
- data/lib/model_set/query.rb +16 -12
- data/lib/model_set/solr_query.rb +40 -30
- data/lib/model_set/sphinx_query.rb +89 -43
- data/lib/model_set/sql_base_query.rb +27 -15
- data/lib/model_set/sql_query.rb +8 -10
- data/lib/model_set.rb +39 -15
- data/model_set.gemspec +24 -136
- data/test/model_set_test.rb +18 -0
- data/test/test_helper.rb +1 -6
- data/vendor/sphinx_client/lib/sphinx/client.rb +68 -18
- data/vendor/sphinx_client/lib/sphinx/response.rb +68 -68
- data/vendor/sphinx_client/spec/client_spec.rb +4 -4
- data/vendor/sphinx_client/spec/fixtures/keywords.php +7 -7
- data/vendor/sphinx_client/spec/fixtures/sphinxapi.php +5 -3
- data/vendor/sphinx_client/spec/sphinx/sphinx-id64.conf +1 -1
- data/vendor/sphinx_client/spec/sphinx/sphinx.conf +1 -1
- data/vendor/sphinx_client/test.rb +27 -0
- metadata +131 -24
@@ -57,9 +57,9 @@ module Sphinx
|
|
57
57
|
# Current client-side command implementation versions
|
58
58
|
|
59
59
|
# search command version
|
60
|
-
VER_COMMAND_SEARCH =
|
60
|
+
VER_COMMAND_SEARCH = 0x119
|
61
61
|
# excerpt command version
|
62
|
-
VER_COMMAND_EXCERPT =
|
62
|
+
VER_COMMAND_EXCERPT = 0x102
|
63
63
|
# update command version
|
64
64
|
VER_COMMAND_UPDATE = 0x102
|
65
65
|
# keywords command version
|
@@ -107,7 +107,12 @@ module Sphinx
|
|
107
107
|
SPH_RANK_WORDCOUNT = 3
|
108
108
|
# phrase proximity
|
109
109
|
SPH_RANK_PROXIMITY = 4
|
110
|
-
|
110
|
+
SPH_RANK_MATCHANY = 5
|
111
|
+
SPH_RANK_FIELDMASK = 6
|
112
|
+
SPH_RANK_SPH04 = 7
|
113
|
+
SPH_RANK_EXPR = 8
|
114
|
+
SPH_RANK_TOTAL = 9
|
115
|
+
|
111
116
|
# Known sort modes
|
112
117
|
|
113
118
|
# sort by document relevance desc, then by date
|
@@ -147,8 +152,11 @@ module Sphinx
|
|
147
152
|
SPH_ATTR_FLOAT = 5
|
148
153
|
# signed 64-bit integer
|
149
154
|
SPH_ATTR_BIGINT = 6
|
155
|
+
# string
|
156
|
+
SPH_ATTR_STRING = 7
|
150
157
|
# this attr has multiple values (0 or more)
|
151
|
-
|
158
|
+
SPH_ATTR_MULTI = 0x40000001
|
159
|
+
SPH_ATTR_MULTI64 = 0x40000002
|
152
160
|
|
153
161
|
# Known grouping functions
|
154
162
|
|
@@ -169,7 +177,7 @@ module Sphinx
|
|
169
177
|
def initialize
|
170
178
|
# per-client-object settings
|
171
179
|
@host = 'localhost' # searchd host (default is "localhost")
|
172
|
-
@port =
|
180
|
+
@port = 9312 # searchd port (default is 9312)
|
173
181
|
|
174
182
|
# per-query settings
|
175
183
|
@offset = 0 # how many records to seek from result-set start (default is 0)
|
@@ -192,6 +200,7 @@ module Sphinx
|
|
192
200
|
@anchor = [] # geographical anchor point
|
193
201
|
@indexweights = [] # per-index weights
|
194
202
|
@ranker = SPH_RANK_PROXIMITY_BM25 # ranking mode (default is SPH_RANK_PROXIMITY_BM25)
|
203
|
+
@rankexpr = '' # ranker expression for SPH_RANK_EXPR
|
195
204
|
@maxquerytime = 0 # max query time, milliseconds (default is 0, do not limit)
|
196
205
|
@fieldweights = {} # per-field-name weights
|
197
206
|
@overrides = [] # per-query attribute values overrides
|
@@ -262,14 +271,19 @@ module Sphinx
|
|
262
271
|
end
|
263
272
|
|
264
273
|
# Set ranking mode.
|
265
|
-
def SetRankingMode(ranker)
|
274
|
+
def SetRankingMode(ranker, rankexpr = '')
|
266
275
|
assert { ranker == SPH_RANK_PROXIMITY_BM25 \
|
267
276
|
|| ranker == SPH_RANK_BM25 \
|
268
277
|
|| ranker == SPH_RANK_NONE \
|
269
278
|
|| ranker == SPH_RANK_WORDCOUNT \
|
270
|
-
|| ranker == SPH_RANK_PROXIMITY
|
279
|
+
|| ranker == SPH_RANK_PROXIMITY \
|
280
|
+
|| ranker == SPH_RANK_MATCHANY \
|
281
|
+
|| ranker == SPH_RANK_FIELDMASK \
|
282
|
+
|| ranker == SPH_RANK_SPH04 \
|
283
|
+
|| ranker == SPH_RANK_EXPR }
|
271
284
|
|
272
285
|
@ranker = ranker
|
286
|
+
@rankexpr = rankexpr
|
273
287
|
end
|
274
288
|
|
275
289
|
# Set matches sorting mode.
|
@@ -349,7 +363,7 @@ module Sphinx
|
|
349
363
|
|
350
364
|
if values.instance_of?(Array) && values.size > 0
|
351
365
|
values.each do |value|
|
352
|
-
assert { value.instance_of? Fixnum
|
366
|
+
assert { value.instance_of? Fixnum }
|
353
367
|
end
|
354
368
|
|
355
369
|
@filters << { 'type' => SPH_FILTER_VALUES, 'attr' => attribute, 'exclude' => exclude, 'values' => values }
|
@@ -564,7 +578,14 @@ module Sphinx
|
|
564
578
|
|
565
579
|
# mode and limits
|
566
580
|
request = Request.new
|
567
|
-
request.put_int @offset, @limit, @mode, @ranker
|
581
|
+
request.put_int @offset, @limit, @mode, @ranker
|
582
|
+
# process the 'expr' ranker
|
583
|
+
if @ranker == SPH_RANK_EXPR
|
584
|
+
request.put_string @rankexpr
|
585
|
+
end
|
586
|
+
|
587
|
+
request.put_int @sort
|
588
|
+
|
568
589
|
request.put_string @sortby
|
569
590
|
# query itself
|
570
591
|
request.put_string query
|
@@ -758,14 +779,23 @@ module Sphinx
|
|
758
779
|
when SPH_ATTR_FLOAT
|
759
780
|
# handle floats
|
760
781
|
r['attrs'][a] = response.get_float
|
782
|
+
when SPH_ATTR_STRING
|
783
|
+
# handle string
|
784
|
+
r['attrs'][a] = response.get_string
|
761
785
|
else
|
762
786
|
# handle everything else as unsigned ints
|
763
787
|
val = response.get_int
|
764
|
-
if
|
788
|
+
if attrs[a]==SPH_ATTR_MULTI
|
765
789
|
r['attrs'][a] = []
|
766
790
|
1.upto(val) do
|
767
791
|
r['attrs'][a] << response.get_int
|
768
792
|
end
|
793
|
+
elsif attrs[a]==SPH_ATTR_MULTI64
|
794
|
+
r['attrs'][a] = []
|
795
|
+
val = val/2
|
796
|
+
1.upto(val) do
|
797
|
+
r['attrs'][a] << response.get_int64
|
798
|
+
end
|
769
799
|
else
|
770
800
|
r['attrs'][a] = val
|
771
801
|
end
|
@@ -825,12 +855,18 @@ module Sphinx
|
|
825
855
|
opts['before_match'] ||= '<b>';
|
826
856
|
opts['after_match'] ||= '</b>';
|
827
857
|
opts['chunk_separator'] ||= ' ... ';
|
858
|
+
opts['html_strip_mode'] ||= 'index';
|
828
859
|
opts['limit'] ||= 256;
|
860
|
+
opts['limit_passages'] ||= 0;
|
861
|
+
opts['limit_words'] ||= 0;
|
829
862
|
opts['around'] ||= 5;
|
863
|
+
opts['start_passage_id'] ||= 1;
|
830
864
|
opts['exact_phrase'] ||= false
|
831
865
|
opts['single_passage'] ||= false
|
832
866
|
opts['use_boundaries'] ||= false
|
833
867
|
opts['weight_order'] ||= false
|
868
|
+
opts['load_files'] ||= false
|
869
|
+
opts['allow_empty'] ||= false
|
834
870
|
|
835
871
|
# build request
|
836
872
|
|
@@ -840,6 +876,10 @@ module Sphinx
|
|
840
876
|
flags |= 4 if opts['single_passage']
|
841
877
|
flags |= 8 if opts['use_boundaries']
|
842
878
|
flags |= 16 if opts['weight_order']
|
879
|
+
flags |= 32 if opts['query_mode']
|
880
|
+
flags |= 64 if opts['force_all_words']
|
881
|
+
flags |= 128 if opts['load_files']
|
882
|
+
flags |= 256 if opts['allow_empty']
|
843
883
|
|
844
884
|
request = Request.new
|
845
885
|
request.put_int 0, flags # mode=0, flags=1 (remove spaces)
|
@@ -853,6 +893,12 @@ module Sphinx
|
|
853
893
|
request.put_string opts['after_match']
|
854
894
|
request.put_string opts['chunk_separator']
|
855
895
|
request.put_int opts['limit'].to_i, opts['around'].to_i
|
896
|
+
|
897
|
+
# options v1.2
|
898
|
+
request.put_int opts['limit_passages'].to_i
|
899
|
+
request.put_int opts['limit_words'].to_i
|
900
|
+
request.put_int opts['start_passage_id'].to_i
|
901
|
+
request.put_string opts['html_strip_mode']
|
856
902
|
|
857
903
|
# documents
|
858
904
|
request.put_int docs.size
|
@@ -989,9 +1035,13 @@ module Sphinx
|
|
989
1035
|
# Connect to searchd server.
|
990
1036
|
def Connect
|
991
1037
|
begin
|
992
|
-
|
993
|
-
|
994
|
-
|
1038
|
+
if @host[0,1]=='/'
|
1039
|
+
sock = UNIXSocket.new(@host)
|
1040
|
+
else
|
1041
|
+
sock = TCPSocket.new(@host, @port)
|
1042
|
+
end
|
1043
|
+
rescue => err
|
1044
|
+
@error = "connection to #{@host}:#{@port} failed (error=#{err})"
|
995
1045
|
raise SphinxConnectError, @error
|
996
1046
|
end
|
997
1047
|
|
@@ -1032,9 +1082,9 @@ module Sphinx
|
|
1032
1082
|
# check response
|
1033
1083
|
read = response.length
|
1034
1084
|
if response.empty? or read != len.to_i
|
1035
|
-
@error =
|
1036
|
-
?
|
1037
|
-
:
|
1085
|
+
@error = response.empty? \
|
1086
|
+
? 'received zero-sized searchd response' \
|
1087
|
+
: "failed to read searchd response (status=#{status}, ver=#{ver}, len=#{len}, read=#{read})"
|
1038
1088
|
raise SphinxResponseError, @error
|
1039
1089
|
end
|
1040
1090
|
|
@@ -1076,9 +1126,9 @@ module Sphinx
|
|
1076
1126
|
command_ver = Sphinx::Client.const_get('VER_COMMAND_' + cmd)
|
1077
1127
|
|
1078
1128
|
sock = self.Connect
|
1079
|
-
len = request.to_s.length + (additional != nil ?
|
1129
|
+
len = request.to_s.length + (additional != nil ? 8 : 0)
|
1080
1130
|
header = [command_id, command_ver, len].pack('nnN')
|
1081
|
-
header << [additional].pack('
|
1131
|
+
header << [0, additional].pack('NN') if additional != nil
|
1082
1132
|
sock.send(header + request.to_s, 0)
|
1083
1133
|
response = self.GetResponse(sock, command_ver)
|
1084
1134
|
return Response.new(response)
|
@@ -1,69 +1,69 @@
|
|
1
|
-
module Sphinx
|
2
|
-
# Unpack internal Sphinx representation of ints, floats, strings, and arrays.
|
3
|
-
# needed by Sphinx search engine.
|
4
|
-
class Response
|
5
|
-
# Initialize new request.
|
6
|
-
def initialize(response)
|
7
|
-
@response = response
|
8
|
-
@position = 0
|
9
|
-
@size = response.length
|
10
|
-
end
|
11
|
-
|
12
|
-
# Gets current stream position.
|
13
|
-
def position
|
14
|
-
@position
|
15
|
-
end
|
16
|
-
|
17
|
-
# Gets response size.
|
18
|
-
def size
|
19
|
-
@size
|
20
|
-
end
|
21
|
-
|
22
|
-
# Returns <tt>true</tt> when response stream is out.
|
23
|
-
def eof?
|
24
|
-
@position >= @size
|
25
|
-
end
|
26
|
-
|
27
|
-
# Get int from stream.
|
28
|
-
def get_int
|
29
|
-
raise EOFError if @position + 4 > @size
|
30
|
-
value = @response[@position, 4].unpack('N*').first
|
31
|
-
@position += 4
|
32
|
-
return value
|
33
|
-
end
|
34
|
-
|
35
|
-
# Get 64-bit int from stream.
|
36
|
-
def get_int64
|
37
|
-
raise EOFError if @position + 8 > @size
|
38
|
-
hi, lo = @response[@position, 8].unpack('N*N*')
|
39
|
-
@position += 8
|
40
|
-
return (hi << 32) + lo
|
41
|
-
end
|
42
|
-
|
43
|
-
# Get array of <tt>count</tt> ints from stream.
|
44
|
-
def get_ints(count)
|
45
|
-
length = 4 * count
|
46
|
-
raise EOFError if @position + length > @size
|
47
|
-
values = @response[@position, length].unpack('N*' * count)
|
48
|
-
@position += length
|
49
|
-
return values
|
50
|
-
end
|
51
|
-
|
52
|
-
# Get string from stream.
|
53
|
-
def get_string
|
54
|
-
length = get_int
|
55
|
-
raise EOFError if @position + length > @size
|
56
|
-
value = length > 0 ? @response[@position, length] : ''
|
57
|
-
@position += length
|
58
|
-
return value
|
59
|
-
end
|
60
|
-
|
61
|
-
# Get float from stream.
|
62
|
-
def get_float
|
63
|
-
raise EOFError if @position + 4 > @size
|
64
|
-
uval = @response[@position, 4].unpack('N*').first;
|
65
|
-
@position += 4
|
66
|
-
return ([uval].pack('L')).unpack('f*').first
|
67
|
-
end
|
68
|
-
end
|
1
|
+
module Sphinx
|
2
|
+
# Unpack internal Sphinx representation of ints, floats, strings, and arrays.
|
3
|
+
# needed by Sphinx search engine.
|
4
|
+
class Response
|
5
|
+
# Initialize new request.
|
6
|
+
def initialize(response)
|
7
|
+
@response = response
|
8
|
+
@position = 0
|
9
|
+
@size = response.length
|
10
|
+
end
|
11
|
+
|
12
|
+
# Gets current stream position.
|
13
|
+
def position
|
14
|
+
@position
|
15
|
+
end
|
16
|
+
|
17
|
+
# Gets response size.
|
18
|
+
def size
|
19
|
+
@size
|
20
|
+
end
|
21
|
+
|
22
|
+
# Returns <tt>true</tt> when response stream is out.
|
23
|
+
def eof?
|
24
|
+
@position >= @size
|
25
|
+
end
|
26
|
+
|
27
|
+
# Get int from stream.
|
28
|
+
def get_int
|
29
|
+
raise EOFError if @position + 4 > @size
|
30
|
+
value = @response[@position, 4].unpack('N*').first
|
31
|
+
@position += 4
|
32
|
+
return value
|
33
|
+
end
|
34
|
+
|
35
|
+
# Get 64-bit int from stream.
|
36
|
+
def get_int64
|
37
|
+
raise EOFError if @position + 8 > @size
|
38
|
+
hi, lo = @response[@position, 8].unpack('N*N*')
|
39
|
+
@position += 8
|
40
|
+
return (hi << 32) + lo
|
41
|
+
end
|
42
|
+
|
43
|
+
# Get array of <tt>count</tt> ints from stream.
|
44
|
+
def get_ints(count)
|
45
|
+
length = 4 * count
|
46
|
+
raise EOFError if @position + length > @size
|
47
|
+
values = @response[@position, length].unpack('N*' * count)
|
48
|
+
@position += length
|
49
|
+
return values
|
50
|
+
end
|
51
|
+
|
52
|
+
# Get string from stream.
|
53
|
+
def get_string
|
54
|
+
length = get_int
|
55
|
+
raise EOFError if @position + length > @size
|
56
|
+
value = length > 0 ? @response[@position, length] : ''
|
57
|
+
@position += length
|
58
|
+
return value
|
59
|
+
end
|
60
|
+
|
61
|
+
# Get float from stream.
|
62
|
+
def get_float
|
63
|
+
raise EOFError if @position + 4 > @size
|
64
|
+
uval = @response[@position, 4].unpack('N*').first;
|
65
|
+
@position += 4
|
66
|
+
return ([uval].pack('L')).unpack('f*').first
|
67
|
+
end
|
68
|
+
end
|
69
69
|
end
|
@@ -30,14 +30,14 @@ describe 'The Connect method of Sphinx::Client' do
|
|
30
30
|
end
|
31
31
|
|
32
32
|
it 'should establish TCP connection to the server and initialize session' do
|
33
|
-
TCPSocket.should_receive(:new).with('localhost',
|
33
|
+
TCPSocket.should_receive(:new).with('localhost', 9312).and_return(@sock)
|
34
34
|
@sock.should_receive(:recv).with(4).and_return([1].pack('N'))
|
35
35
|
@sock.should_receive(:send).with([1].pack('N'), 0)
|
36
36
|
@sphinx.send(:Connect).should be(@sock)
|
37
37
|
end
|
38
38
|
|
39
39
|
it 'should raise exception when searchd protocol is not 1+' do
|
40
|
-
TCPSocket.should_receive(:new).with('localhost',
|
40
|
+
TCPSocket.should_receive(:new).with('localhost', 9312).and_return(@sock)
|
41
41
|
@sock.should_receive(:recv).with(4).and_return([0].pack('N'))
|
42
42
|
@sock.should_receive(:close)
|
43
43
|
lambda { @sphinx.send(:Connect) }.should raise_error(Sphinx::SphinxConnectError)
|
@@ -45,9 +45,9 @@ describe 'The Connect method of Sphinx::Client' do
|
|
45
45
|
end
|
46
46
|
|
47
47
|
it 'should raise exception on connection error' do
|
48
|
-
TCPSocket.should_receive(:new).with('localhost',
|
48
|
+
TCPSocket.should_receive(:new).with('localhost', 9312).and_raise(Errno::EBADF)
|
49
49
|
lambda { @sphinx.send(:Connect) }.should raise_error(Sphinx::SphinxConnectError)
|
50
|
-
@sphinx.GetLastError.should == 'connection to localhost:
|
50
|
+
@sphinx.GetLastError.should == 'connection to localhost:9312 failed'
|
51
51
|
end
|
52
52
|
|
53
53
|
it 'should use custom host and port' do
|
@@ -1,8 +1,8 @@
|
|
1
|
-
<?php
|
2
|
-
|
3
|
-
require ("sphinxapi.php");
|
4
|
-
|
5
|
-
$cl = new SphinxClient();
|
6
|
-
$cl->BuildKeywords('test', 'index', true);
|
7
|
-
|
1
|
+
<?php
|
2
|
+
|
3
|
+
require ("sphinxapi.php");
|
4
|
+
|
5
|
+
$cl = new SphinxClient();
|
6
|
+
$cl->BuildKeywords('test', 'index', true);
|
7
|
+
|
8
8
|
?>
|
@@ -5,7 +5,9 @@
|
|
5
5
|
//
|
6
6
|
|
7
7
|
//
|
8
|
-
// Copyright (c) 2001-
|
8
|
+
// Copyright (c) 2001-2012, Andrew Aksyonoff
|
9
|
+
// Copyright (c) 2008-2012, Sphinx Technologies Inc
|
10
|
+
// All rights reserved
|
9
11
|
//
|
10
12
|
// This program is free software; you can redistribute it and/or modify
|
11
13
|
// it under the terms of the GNU General Public License. You should have
|
@@ -177,7 +179,7 @@ function sphUnpack64 ( $v )
|
|
177
179
|
class SphinxClient
|
178
180
|
{
|
179
181
|
var $_host; ///< searchd host (default is "localhost")
|
180
|
-
var $_port; ///< searchd port (default is
|
182
|
+
var $_port; ///< searchd port (default is 9312)
|
181
183
|
var $_offset; ///< how many records to seek from result-set start (default is 0)
|
182
184
|
var $_limit; ///< how many records to return from result-set starting at offset (default is 20)
|
183
185
|
var $_mode; ///< query matching mode (default is SPH_MATCH_ALL)
|
@@ -219,7 +221,7 @@ class SphinxClient
|
|
219
221
|
{
|
220
222
|
// per-client-object settings
|
221
223
|
$this->_host = "localhost";
|
222
|
-
$this->_port =
|
224
|
+
$this->_port = 9312;
|
223
225
|
|
224
226
|
// per-query settings
|
225
227
|
$this->_offset = 0;
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#
|
2
|
+
# $Id$
|
3
|
+
#
|
4
|
+
|
5
|
+
require 'init.rb'
|
6
|
+
|
7
|
+
q = ARGV.join(' ')
|
8
|
+
@sphinx = Sphinx::Client.new
|
9
|
+
# @sphinx.SetSortMode(Sphinx::Client::SPH_SORT_ATTR_ASC, 'created_at')
|
10
|
+
results = @sphinx.Query(q)
|
11
|
+
|
12
|
+
puts "Query '#{q}' retrieved #{results['total']} of #{results['total_found']} matches in #{results['time']} sec.";
|
13
|
+
puts "Query stats:";
|
14
|
+
results['words'].each do |word, info|
|
15
|
+
puts " '#{word}' found #{info['hits']} times in #{info['docs']} documents\n"
|
16
|
+
end
|
17
|
+
puts
|
18
|
+
|
19
|
+
n = 1
|
20
|
+
results['matches'].each do |doc|
|
21
|
+
print "#{n}. doc_id=#{doc['id']}, weight=#{doc['weight']}"
|
22
|
+
doc['attrs'].each do |attr, value|
|
23
|
+
print ", #{attr}=#{value}"
|
24
|
+
end
|
25
|
+
puts
|
26
|
+
n = n+1
|
27
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: model_set
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 19
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
+
- 1
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 1.0.0
|
10
|
+
version: 1.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Justin Balthrop
|
@@ -15,13 +15,113 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2013-06-03 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
-
name:
|
22
|
+
name: shoulda
|
23
23
|
prerelease: false
|
24
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - "="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 5
|
30
|
+
segments:
|
31
|
+
- 3
|
32
|
+
- 0
|
33
|
+
- 1
|
34
|
+
version: 3.0.1
|
35
|
+
type: :development
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: mocha
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 3
|
46
|
+
segments:
|
47
|
+
- 0
|
48
|
+
version: "0"
|
49
|
+
type: :development
|
50
|
+
version_requirements: *id002
|
51
|
+
- !ruby/object:Gem::Dependency
|
52
|
+
name: rsolr
|
53
|
+
prerelease: false
|
54
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
hash: 3
|
60
|
+
segments:
|
61
|
+
- 0
|
62
|
+
version: "0"
|
63
|
+
type: :development
|
64
|
+
version_requirements: *id003
|
65
|
+
- !ruby/object:Gem::Dependency
|
66
|
+
name: json
|
67
|
+
prerelease: false
|
68
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
hash: 3
|
74
|
+
segments:
|
75
|
+
- 0
|
76
|
+
version: "0"
|
77
|
+
type: :development
|
78
|
+
version_requirements: *id004
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: rake
|
81
|
+
prerelease: false
|
82
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
hash: 3
|
88
|
+
segments:
|
89
|
+
- 0
|
90
|
+
version: "0"
|
91
|
+
type: :development
|
92
|
+
version_requirements: *id005
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: system_timer
|
95
|
+
prerelease: false
|
96
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ">="
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
hash: 3
|
102
|
+
segments:
|
103
|
+
- 0
|
104
|
+
version: "0"
|
105
|
+
type: :development
|
106
|
+
version_requirements: *id006
|
107
|
+
- !ruby/object:Gem::Dependency
|
108
|
+
name: activerecord-postgresql-adapter
|
109
|
+
prerelease: false
|
110
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
111
|
+
none: false
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
hash: 3
|
116
|
+
segments:
|
117
|
+
- 0
|
118
|
+
version: "0"
|
119
|
+
type: :development
|
120
|
+
version_requirements: *id007
|
121
|
+
- !ruby/object:Gem::Dependency
|
122
|
+
name: ordered_set
|
123
|
+
prerelease: false
|
124
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
25
125
|
none: false
|
26
126
|
requirements:
|
27
127
|
- - ">="
|
@@ -33,11 +133,11 @@ dependencies:
|
|
33
133
|
- 1
|
34
134
|
version: 1.0.1
|
35
135
|
type: :runtime
|
36
|
-
version_requirements: *
|
136
|
+
version_requirements: *id008
|
37
137
|
- !ruby/object:Gem::Dependency
|
38
138
|
name: deep_clonable
|
39
139
|
prerelease: false
|
40
|
-
requirement: &
|
140
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
41
141
|
none: false
|
42
142
|
requirements:
|
43
143
|
- - ">="
|
@@ -49,33 +149,37 @@ dependencies:
|
|
49
149
|
- 0
|
50
150
|
version: 1.1.0
|
51
151
|
type: :runtime
|
52
|
-
version_requirements: *
|
152
|
+
version_requirements: *id009
|
53
153
|
- !ruby/object:Gem::Dependency
|
54
154
|
name: activerecord
|
55
155
|
prerelease: false
|
56
|
-
requirement: &
|
156
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
57
157
|
none: false
|
58
158
|
requirements:
|
59
|
-
- -
|
159
|
+
- - ~>
|
60
160
|
- !ruby/object:Gem::Version
|
61
|
-
hash:
|
161
|
+
hash: 17
|
62
162
|
segments:
|
63
163
|
- 2
|
64
|
-
-
|
65
|
-
-
|
66
|
-
version: 2.
|
164
|
+
- 3
|
165
|
+
- 9
|
166
|
+
version: 2.3.9
|
67
167
|
type: :runtime
|
68
|
-
version_requirements: *
|
168
|
+
version_requirements: *id010
|
69
169
|
description: Easy manipulation of sets of ActiveRecord models
|
70
|
-
email:
|
170
|
+
email:
|
171
|
+
- git@justinbalthrop.com
|
71
172
|
executables: []
|
72
173
|
|
73
174
|
extensions: []
|
74
175
|
|
75
|
-
extra_rdoc_files:
|
76
|
-
|
77
|
-
- README.rdoc
|
176
|
+
extra_rdoc_files: []
|
177
|
+
|
78
178
|
files:
|
179
|
+
- .gitignore
|
180
|
+
- .rbenv-gemsets
|
181
|
+
- .rbenv-version
|
182
|
+
- Gemfile
|
79
183
|
- LICENSE
|
80
184
|
- README.rdoc
|
81
185
|
- Rakefile
|
@@ -172,8 +276,9 @@ files:
|
|
172
276
|
- vendor/sphinx_client/spec/sphinx/sphinx_test.sql
|
173
277
|
- vendor/sphinx_client/sphinx.yml.tpl
|
174
278
|
- vendor/sphinx_client/tasks/sphinx.rake
|
279
|
+
- vendor/sphinx_client/test.rb
|
175
280
|
has_rdoc: true
|
176
|
-
homepage:
|
281
|
+
homepage: https://github.com/ninjudd/model_set
|
177
282
|
licenses: []
|
178
283
|
|
179
284
|
post_install_message:
|
@@ -202,9 +307,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
202
307
|
requirements: []
|
203
308
|
|
204
309
|
rubyforge_project:
|
205
|
-
rubygems_version: 1.
|
310
|
+
rubygems_version: 1.5.2
|
206
311
|
signing_key:
|
207
312
|
specification_version: 3
|
208
313
|
summary: Easy manipulation of sets of ActiveRecord models
|
209
|
-
test_files:
|
210
|
-
|
314
|
+
test_files:
|
315
|
+
- test/model_set_test.rb
|
316
|
+
- test/multi_set_test.rb
|
317
|
+
- test/test_helper.rb
|