model_set 1.0.0 → 1.1.0
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/.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
|