jk-ferret 0.11.8.2 → 0.11.8.3

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -142,7 +142,7 @@ namespace :build do
142
142
 
143
143
  file "ext/Makefile" => SRC do
144
144
  cd "ext"
145
- `ruby extconf.rb`
145
+ ruby "extconf.rb"
146
146
  cd ".."
147
147
  end
148
148
  end
@@ -3,6 +3,11 @@
3
3
  *
4
4
  * Exception Handling looks something like this;
5
5
  *
6
+ * ### NOTE ###
7
+ * You must use a FINALLY block if you use "default:" block. Otherwise the
8
+ * default: block will get called in place of the FINALLY block.
9
+ *
10
+ *
6
11
  * <pre>
7
12
  * FRT_TRY
8
13
  * FRT_RAISE(FRT_EXCEPTION, msg1);
@@ -143,7 +148,7 @@ typedef struct frt_xcontext_t
143
148
  # define FRT_RAISE(excode, ...) do {\
144
149
  snprintf(frt_xmsg_buffer, FRT_XMSG_BUFFER_SIZE, __VA_ARGS__);\
145
150
  snprintf(frt_xmsg_buffer_final, FRT_XMSG_BUFFER_SIZE,\
146
- "Error occured in %s:%d - %s\n\t%s\n",\
151
+ "Error occured in %s:%d - %s\n\t%s",\
147
152
  __FILE__, __LINE__, __func__, frt_xmsg_buffer);\
148
153
  frt_xraise(excode, frt_xmsg_buffer_final);\
149
154
  } while (0)
@@ -86,7 +86,7 @@ void
86
86
  //object_del(void *key)
87
87
  object_del2(void *key, const char *file, int line)
88
88
  {
89
- if (object_get(key) == Qnil)
89
+ if (object_get(key) == Qnil)
90
90
  printf("failed deleting %ld. %s:%d\n", (long)key, file, line);
91
91
  //printf("deleting %ld. now contains %ld, %s:%d\n", (long)key, --hash_cnt, file, line);
92
92
  h_del(object_map, key);
@@ -140,7 +140,6 @@ void *frb_thread_getspecific(thread_key_t key)
140
140
  void frb_create_dir(VALUE rpath)
141
141
  {
142
142
  VALUE mFileUtils;
143
- rb_require("fileutils");
144
143
  mFileUtils = rb_define_module("FileUtils");
145
144
  rb_funcall(mFileUtils, id_mkdir_p, 1, rpath);
146
145
  }
@@ -261,7 +260,7 @@ void V_FRT_EXIT(const char *err_type, const char *fmt, va_list args)
261
260
  }
262
261
 
263
262
  snprintf(buf + so_far, FRT_BUF_SIZ - so_far, "\n");
264
- rb_raise(frb_get_error(err_type), buf);
263
+ rb_raise(frb_get_error(err_type), "%s", buf);
265
264
  }
266
265
 
267
266
  #ifdef FRT_HAS_VARARGS
@@ -300,8 +299,8 @@ VALUE frb_get_term(Symbol field, const char *text)
300
299
  static VALUE frb_term_to_s(VALUE self)
301
300
  {
302
301
  VALUE rstr;
303
- VALUE rfield = rb_funcall(self, id_field, 0);
304
- VALUE rtext = rb_funcall(self, id_text, 0);
302
+ VALUE rfield = rb_funcall(self, id_field, 0);
303
+ VALUE rtext = rb_funcall(self, id_text, 0);
305
304
  char *field = StringValuePtr(rfield);
306
305
  char *text = StringValuePtr(rtext);
307
306
  char *term_str = ALLOC_N(char,
@@ -338,6 +337,7 @@ void Init_Ferret(void)
338
337
  {
339
338
  mFerret = rb_define_module("Ferret");
340
339
  Init_Term();
340
+ rb_require("fileutils");
341
341
  }
342
342
 
343
343
  void Init_ferret_ext(void)
@@ -153,6 +153,20 @@ static void fs_clear_locks(Store *store)
153
153
  closedir(d);
154
154
  }
155
155
 
156
+ static void remove_if_index_file(const char *base_path, const char *file_name)
157
+ {
158
+ char path[MAX_FILE_PATH];
159
+ char *basename;
160
+ join_path(path, base_path, file_name);
161
+ /* get basename of path */
162
+ basename = strrchr(path, DIR_SEPARATOR_CHAR);
163
+ basename = (basename ? basename + 1 : path);
164
+ /* we don't want to delete non-index files here */
165
+ if (file_name_filter_is_index_file(basename, true)) {
166
+ remove(path);
167
+ }
168
+ }
169
+
156
170
  static void fs_clear(Store *store)
157
171
  {
158
172
  struct dirent *de;
@@ -166,13 +180,16 @@ static void fs_clear(Store *store)
166
180
  while ((de = readdir(d)) != NULL) {
167
181
  if (de->d_name[0] > '/' /* skip ., .., / and '\0'*/
168
182
  && !file_is_lock(de->d_name)) {
169
- char path[MAX_FILE_PATH];
170
- remove(join_path(path, store->dir.path, de->d_name));
183
+ remove_if_index_file(store->dir.path, de->d_name);
171
184
  }
172
185
  }
173
186
  closedir(d);
174
187
  }
175
188
 
189
+ /**
190
+ * Clear all files which belong to the index. Use fs_clear to clear the
191
+ * directory regardless of the files origin.
192
+ */
176
193
  static void fs_clear_all(Store *store)
177
194
  {
178
195
  struct dirent *de;
@@ -185,16 +202,7 @@ static void fs_clear_all(Store *store)
185
202
 
186
203
  while ((de = readdir(d)) != NULL) {
187
204
  if (de->d_name[0] > '/') { /* skip ., .., / and '\0'*/
188
- char path[MAX_FILE_PATH];
189
- char *basename;
190
- join_path(path, store->dir.path, de->d_name);
191
- /* get basename of path */
192
- basename = strrchr(path, DIR_SEPARATOR_CHAR);
193
- basename = (basename ? basename + 1 : path);
194
- /* we don't want to delete no index files here */
195
- if (file_name_filter_is_index_file(basename, true)) {
196
- remove(path);
197
- }
205
+ remove_if_index_file(store->dir.path, de->d_name);
198
206
  }
199
207
  }
200
208
  closedir(d);
@@ -147,16 +147,14 @@ char *dbl_to_s(char *buf, double num)
147
147
  }
148
148
  #endif
149
149
 
150
- sprintf(buf, "%#.7g", num);
150
+ sprintf(buf, DBL2S, num);
151
151
  if (!(e = strchr(buf, 'e'))) {
152
152
  e = buf + strlen(buf);
153
153
  }
154
154
  if (!isdigit(e[-1])) {
155
155
  /* reformat if ended with decimal point (ex 111111111111111.) */
156
156
  sprintf(buf, "%#.6e", num);
157
- if (!(e = strchr(buf, 'e'))) {
158
- e = buf + strlen(buf);
159
- }
157
+ if (!(e = strchr(buf, 'e'))) { e = buf + strlen(buf); }
160
158
  }
161
159
  p = e;
162
160
  while (p[-1] == '0' && isdigit(p[-2])) {
@@ -275,8 +273,7 @@ static char *build_gdb_commandfile()
275
273
  const char *commands = "bt\nquit\n";
276
274
  char *filename = ALLOC_N(char, FILENAME_MAX);
277
275
  int fd = build_tempfile(filename, FILENAME_MAX);
278
- if (fd < 0)
279
- return NULL;
276
+ if (fd < 0) { return NULL; }
280
277
  write(fd, commands, strlen(commands));
281
278
  close(fd);
282
279
  return filename;
@@ -456,3 +453,46 @@ void init(int argc, const char *const argv[])
456
453
 
457
454
  atexit(&hash_finalize);
458
455
  }
456
+
457
+ /**
458
+ * For general use when testing
459
+ *
460
+ * TODO wrap in #ifdef
461
+ */
462
+
463
+ static bool p_switch = false;
464
+ static bool p_switch_tmp = false;
465
+
466
+ void p(const char *format, ...)
467
+ {
468
+ va_list args;
469
+
470
+ if (!p_switch) return;
471
+
472
+ va_start(args, format);
473
+ vfprintf(stderr, format, args);
474
+ va_end(args);
475
+ }
476
+
477
+ void p_on()
478
+ {
479
+ fprintf(stderr, "> > > > > STARTING PRINT\n");
480
+ p_switch = true;
481
+ }
482
+
483
+ void p_off()
484
+ {
485
+ fprintf(stderr, "< < < < < STOPPING PRINT\n");
486
+ p_switch = false;
487
+ }
488
+
489
+ void p_pause()
490
+ {
491
+ p_switch_tmp = p_switch;
492
+ p_switch = false;
493
+ }
494
+
495
+ void p_resume()
496
+ {
497
+ p_switch = p_switch_tmp;
498
+ }
@@ -18,6 +18,8 @@ extern "C" {
18
18
  #define FRT_MAX_FILE_PATH 1024
19
19
  #define FRT_BUFFER_SIZE 1024
20
20
 
21
+ #define FRT_DBL2S "%#.7g"
22
+
21
23
  #if defined(__GNUC__) && !defined(__cplusplus)
22
24
  # define FRT_INLINE
23
25
  #else
@@ -299,4 +301,15 @@ extern void frt_clean_up();
299
301
  } // extern "C"
300
302
  #endif
301
303
 
304
+
305
+ /**
306
+ * For general use during testing. Switch this on and off for print statements
307
+ * to only print when p_on is called and not after p_off is called
308
+ */
309
+ extern void p(const char *format, ...);
310
+ extern void p_on();
311
+ extern void p_off();
312
+ extern void p_pause();
313
+ extern void p_resume();
314
+
302
315
  #endif
@@ -401,7 +401,7 @@ FieldInfo *fis_by_number(FieldInfos *fis, int num)
401
401
 
402
402
  FieldInfos *fis_read(InStream *is)
403
403
  {
404
- FieldInfos *volatile fis;
404
+ FieldInfos *volatile fis = NULL;
405
405
  TRY
406
406
  do {
407
407
  StoreValue store_val;
@@ -24,6 +24,7 @@
24
24
  #define COMMIT_LOCK_NAME FRT_COMMIT_LOCK_NAME
25
25
  #define CONSTANT_QUERY FRT_CONSTANT_QUERY
26
26
  #define CW_INIT_CAPA FRT_CW_INIT_CAPA
27
+ #define DBL2S FRT_DBL2S
27
28
  #define DEFAULT_MAX_CLAUSE_COUNT FRT_DEFAULT_MAX_CLAUSE_COUNT
28
29
  #define DEF_MAX_TERMS FRT_DEF_MAX_TERMS
29
30
  #define DEF_MIN_SIM FRT_DEF_MIN_SIM
@@ -52,6 +52,8 @@ typedef struct PhPos
52
52
  static bool pp_next(PhPos *self)
53
53
  {
54
54
  TermDocEnum *tpe = self->tpe;
55
+ assert(tpe);
56
+
55
57
  if (!tpe->next(tpe)) {
56
58
  tpe->close(tpe); /* close stream */
57
59
  self->tpe = NULL;
@@ -66,9 +68,7 @@ static bool pp_next(PhPos *self)
66
68
  static bool pp_skip_to(PhPos *self, int doc_num)
67
69
  {
68
70
  TermDocEnum *tpe = self->tpe;
69
- if (!tpe) {
70
- return false;
71
- }
71
+ assert(tpe);
72
72
 
73
73
  if (!tpe->skip_to(tpe, doc_num)) {
74
74
  tpe->close(tpe); /* close stream */
@@ -337,11 +337,10 @@ static Scorer *phsc_new(Weight *weight,
337
337
  for (j = 0; j < t_cnt; j++) {
338
338
  if (hs_add(term_set, terms[j])) {
339
339
  PhSc(self)->check_repeats = true;
340
- goto repeat_check_done;
340
+ break;
341
341
  }
342
342
  }
343
343
  }
344
- repeat_check_done:
345
344
  PhSc(self)->phrase_pos[i] = pp_new(term_pos_enum[i], positions[i].pos);
346
345
  }
347
346
 
@@ -1104,7 +1103,7 @@ static unsigned long phq_hash(Query *self)
1104
1103
  char **terms = phq->positions[i].terms;
1105
1104
  for (j = ary_size(terms) - 1; j >= 0; j--) {
1106
1105
  hash = (hash << 1) ^ (str_hash(terms[j])
1107
- ^ phq->positions[i].pos);
1106
+ ^ phq->positions[i].pos);
1108
1107
  }
1109
1108
  }
1110
1109
  return (hash ^ phq->slop);
@@ -828,7 +828,8 @@ static bool spanoe_skip_to(SpanEnum *self, int target)
828
828
  }
829
829
  else {
830
830
  while ((soe->queue->size != 0) &&
831
- ((se = (SpanEnum *)pq_top(soe->queue))->doc(se) < target)) {
831
+ ((se = (SpanEnum *)pq_top(soe->queue)) != NULL) &&
832
+ (se->doc(se) < target)) {
832
833
  if (se->skip_to(se, target)) {
833
834
  pq_down(soe->queue);
834
835
  }
@@ -1,6 +1,10 @@
1
1
  #include "ferret.h"
2
2
  #include "index.h"
3
- #include <st.h>
3
+ #ifdef FRT_RUBY_VERSION_1_9
4
+ # include <ruby/st.h>
5
+ #else
6
+ # include <st.h>
7
+ #endif
4
8
 
5
9
  VALUE mIndex;
6
10
 
@@ -811,7 +815,7 @@ frb_te_set_field(VALUE self, VALUE rfield)
811
815
  } else {
812
816
  Check_Type(rfield, T_SYMBOL);
813
817
  rb_raise(rb_eArgError, "field %s doesn't exist in the index",
814
- frb_field(rfield));
818
+ (char *)frb_field(rfield));
815
819
  }
816
820
  te->set_field(te, field_num);
817
821
 
@@ -940,7 +944,7 @@ frb_tde_seek(VALUE self, VALUE rfield, VALUE rterm)
940
944
  field_num = FIX2INT(rfnum);
941
945
  } else {
942
946
  rb_raise(rb_eArgError, "field %s doesn't exist in the index",
943
- frb_field(rfield));
947
+ (char *)frb_field(rfield));
944
948
  }
945
949
  tde->seek(tde, field_num, term);
946
950
  return self;
@@ -2219,7 +2223,7 @@ frb_ir_get_norms_into(VALUE self, VALUE rfield, VALUE rnorms, VALUE roffset)
2219
2223
  offset = FIX2INT(roffset);
2220
2224
  Check_Type(rnorms, T_STRING);
2221
2225
  if (RSTRING_LEN(rnorms) < offset + ir->max_doc(ir)) {
2222
- rb_raise(rb_eArgError, "supplied a string of length:%d to "
2226
+ rb_raise(rb_eArgError, "supplied a string of length:%ld to "
2223
2227
  "IndexReader#get_norms_into but needed a string of length "
2224
2228
  "offset:%d + maxdoc:%d",
2225
2229
  RSTRING_LEN(rnorms), offset, ir->max_doc(ir));
@@ -2392,8 +2396,8 @@ frb_ir_get_doc(int argc, VALUE *argv, VALUE self)
2392
2396
  pos = FIX2INT(arg1);
2393
2397
  pos = (pos < 0) ? (max + pos) : pos;
2394
2398
  if (pos < 0 || pos >= max) {
2395
- rb_raise(rb_eArgError, "index %d is out of range [%d..%d] for "
2396
- "IndexReader#[]", pos, 0, max, -1);
2399
+ rb_raise(rb_eArgError, "index %ld is out of range [%d..%ld] for "
2400
+ "IndexReader#[]", pos, 0, max);
2397
2401
  }
2398
2402
  return frb_get_lazy_doc(ir->get_lazy_doc(ir, pos));
2399
2403
  }
@@ -266,7 +266,7 @@ frb_qp_parse(VALUE self, VALUE rstr)
266
266
  XENDTRY
267
267
 
268
268
  if (msg) {
269
- rb_raise(cQueryParseException, msg);
269
+ rb_raise(cQueryParseException, "%s", msg);
270
270
  }
271
271
 
272
272
  return rq;
@@ -207,8 +207,8 @@ frb_td_to_s(int argc, VALUE *argv, VALUE self)
207
207
  field = frb_field(argv[0]);
208
208
  }
209
209
 
210
- sprintf(str, "TopDocs: total_hits = %ld, max_score = %f [\n",
211
- FIX2INT(rb_funcall(self, id_total_hits, 0)),
210
+ sprintf(str, "TopDocs: total_hits = %ld, max_score = %lf [\n",
211
+ FIX2LONG(rb_funcall(self, id_total_hits, 0)),
212
212
  NUM2DBL(rb_funcall(self, id_max_score, 0)));
213
213
  p = (int)strlen(str);
214
214
 
@@ -2676,7 +2676,7 @@ frb_sea_search_internal(Query *query, VALUE roptions, Searcher *sea)
2676
2676
  else {
2677
2677
  rb_raise(rb_eArgError, "%s is not a sensible :limit value "
2678
2678
  "Please use a positive integer or :all",
2679
- rb_obj_as_string(rval));
2679
+ rs2s(rb_obj_as_string(rval)));
2680
2680
  }
2681
2681
  }
2682
2682
  if (Qnil != (rval = rb_hash_aref(roptions, sym_filter))) {
@@ -2911,7 +2911,7 @@ frb_sea_scan(int argc, VALUE *argv, VALUE self)
2911
2911
  else {
2912
2912
  rb_raise(rb_eArgError, "%s is not a sensible :limit value "
2913
2913
  "Please use a positive integer or :all",
2914
- rb_obj_as_string(rval));
2914
+ rs2s(rb_obj_as_string(rval)));
2915
2915
  }
2916
2916
  }
2917
2917
  }
@@ -379,8 +379,9 @@ static InStream *ram_open_input(Store *store, const char *filename)
379
379
  static int ram_lock_obtain(Lock *lock)
380
380
  {
381
381
  int ret = true;
382
- if (ram_exists(lock->store, lock->name))
382
+ if (ram_exists(lock->store, lock->name)) {
383
383
  ret = false;
384
+ }
384
385
  ram_touch(lock->store, lock->name);
385
386
  return ret;
386
387
  }
@@ -11,7 +11,7 @@
11
11
  void with_lock(Lock *lock, void (*func)(void *arg), void *arg)
12
12
  {
13
13
  if (!lock->obtain(lock)) {
14
- RAISE(IO_ERROR, "couldn't obtain lock \"%s\"", lock->name);
14
+ RAISE(LOCK_ERROR, "couldn't obtain lock \"%s\"", lock->name);
15
15
  }
16
16
  func(arg);
17
17
  lock->release(lock);
@@ -124,7 +124,7 @@ struct FrtInStream
124
124
  } file;
125
125
  union
126
126
  {
127
- off_t pointer; /* only used by RAMIn */
127
+ off_t pointer; /* only used by RAMIn */
128
128
  char *path; /* only used by FSIn */
129
129
  FrtCompoundInStream *cis;
130
130
  } d;
@@ -163,13 +163,13 @@ typedef struct FrtCompoundStore
163
163
  struct FrtStore
164
164
  {
165
165
  int ref_cnt; /* for fs_store only */
166
- frt_mutex_t mutex_i; /* for internal use only */
167
- frt_mutex_t mutex; /* external mutex for use outside */
166
+ frt_mutex_t mutex_i; /* for internal use only */
167
+ frt_mutex_t mutex; /* external mutex for use outside */
168
168
  union
169
169
  {
170
170
  char *path; /* for fs_store only */
171
- FrtHash *ht; /* for ram_store only */
172
- FrtCompoundStore *cmpd; /* for compound_store only */
171
+ FrtHash *ht; /* for ram_store only */
172
+ FrtCompoundStore *cmpd; /* for compound_store only */
173
173
  } dir;
174
174
 
175
175
  #ifdef POSH_OS_WIN32
@@ -5,7 +5,7 @@ module Ferret
5
5
  # __id__. It is useful for creating proxy classes. It is currently used by
6
6
  # the FieldSymbol class which is a proxy to the Symbol class
7
7
  class BlankSlate
8
- instance_methods.each { |m| undef_method m unless m =~ /^__/ }
8
+ instance_methods.each { |m| undef_method m unless m =~ /^__|object_id/ }
9
9
  end
10
10
 
11
11
  # The FieldSymbolMethods module contains the methods that are added to both
@@ -1,3 +1,3 @@
1
1
  module Ferret
2
- VERSION = '0.11.8.2'
2
+ VERSION = '0.11.8.3'
3
3
  end
@@ -15,8 +15,8 @@ class FSStoreTest < Test::Unit::TestCase
15
15
  end
16
16
 
17
17
  def teardown
18
- @dir.refresh()
19
18
  @dir.close()
19
+ Dir[File.join(@dpath, "*")].each {|path| begin File.delete(path) rescue nil end}
20
20
  end
21
21
 
22
22
  def test_fslock
@@ -1,6 +1,5 @@
1
1
  module StoreLockTest
2
2
  class Switch
3
- @@counter = 0
4
3
  def Switch.counter() return @@counter end
5
4
  def Switch.counter=(counter) @@counter = counter end
6
5
  end
@@ -14,7 +13,7 @@ module StoreLockTest
14
13
  assert(lock1.obtain(lock_time_out))
15
14
  assert(lock2.locked?)
16
15
 
17
- assert(! can_obtain_lock?(lock2))
16
+ assert(! can_obtain_lock?(lock2, lock_time_out))
18
17
 
19
18
  exception_thrown = false
20
19
  begin
@@ -31,6 +30,8 @@ module StoreLockTest
31
30
  assert(lock2.obtain(lock_time_out))
32
31
  lock2.release()
33
32
 
33
+ Switch.counter = 0
34
+
34
35
  t = Thread.new() do
35
36
  lock1.while_locked(lock_time_out) do
36
37
  Switch.counter = 1
@@ -46,7 +47,8 @@ module StoreLockTest
46
47
  while Switch.counter < 1
47
48
  end
48
49
 
49
- assert(! can_obtain_lock?(lock2), "lock 2 should not be obtainable")
50
+ assert(! can_obtain_lock?(lock2, lock_time_out),
51
+ "lock 2 should not be obtainable")
50
52
 
51
53
  Switch.counter = 2
52
54
  while Switch.counter < 3
@@ -56,8 +58,7 @@ module StoreLockTest
56
58
  lock2.release()
57
59
  end
58
60
 
59
- def can_obtain_lock?(lock)
60
- lock_time_out = 0.001 # we want this test to run quickly
61
+ def can_obtain_lock?(lock, lock_time_out)
61
62
  begin
62
63
  lock.obtain(lock_time_out)
63
64
  return true
metadata CHANGED
@@ -1,13 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jk-ferret
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 11
8
- - 8
9
- - 2
10
- version: 0.11.8.2
4
+ version: 0.11.8.3
11
5
  platform: ruby
12
6
  authors:
13
7
  - David Balmain
@@ -15,22 +9,19 @@ autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
11
 
18
- date: 2010-09-07 00:00:00 +02:00
12
+ date: 2011-02-22 00:00:00 +01:00
19
13
  default_executable: ferret-browser
20
14
  dependencies:
21
15
  - !ruby/object:Gem::Dependency
22
16
  name: rake
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
25
- none: false
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
26
20
  requirements:
27
21
  - - ">="
28
22
  - !ruby/object:Gem::Version
29
- segments:
30
- - 0
31
23
  version: "0"
32
- type: :runtime
33
- version_requirements: *id001
24
+ version:
34
25
  description: Ferret is a super fast, highly configurable search library.
35
26
  email: dbalmain@gmail.com
36
27
  executables:
@@ -275,8 +266,6 @@ files:
275
266
  - ext/term_vectors.c
276
267
  - ext/threading.h
277
268
  - ext/win32.h
278
- - bin/ferret-browser
279
- - ext/extconf.rb
280
269
  has_rdoc: true
281
270
  homepage: http://github.com/jkraemer/ferret
282
271
  licenses: []
@@ -293,25 +282,21 @@ rdoc_options:
293
282
  require_paths:
294
283
  - lib
295
284
  required_ruby_version: !ruby/object:Gem::Requirement
296
- none: false
297
285
  requirements:
298
286
  - - ">="
299
287
  - !ruby/object:Gem::Version
300
- segments:
301
- - 0
302
288
  version: "0"
289
+ version:
303
290
  required_rubygems_version: !ruby/object:Gem::Requirement
304
- none: false
305
291
  requirements:
306
292
  - - ">="
307
293
  - !ruby/object:Gem::Version
308
- segments:
309
- - 0
310
294
  version: "0"
295
+ version:
311
296
  requirements: []
312
297
 
313
298
  rubyforge_project: ferret
314
- rubygems_version: 1.3.7
299
+ rubygems_version: 1.3.5
315
300
  signing_key:
316
301
  specification_version: 3
317
302
  summary: Ruby indexing library.