ferret 0.11.6 → 0.11.8.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (185) hide show
  1. data/README +10 -22
  2. data/RELEASE_CHANGES +137 -0
  3. data/RELEASE_NOTES +60 -0
  4. data/Rakefile +379 -274
  5. data/TODO +100 -8
  6. data/bin/ferret-browser +0 -0
  7. data/ext/BZLIB_blocksort.c +1094 -0
  8. data/ext/BZLIB_bzlib.c +1578 -0
  9. data/ext/BZLIB_compress.c +672 -0
  10. data/ext/BZLIB_crctable.c +104 -0
  11. data/ext/BZLIB_decompress.c +626 -0
  12. data/ext/BZLIB_huffman.c +205 -0
  13. data/ext/BZLIB_randtable.c +84 -0
  14. data/ext/{api.c → STEMMER_api.c} +7 -10
  15. data/ext/{libstemmer.c → STEMMER_libstemmer.c} +3 -2
  16. data/ext/{stem_ISO_8859_1_danish.c → STEMMER_stem_ISO_8859_1_danish.c} +123 -124
  17. data/ext/{stem_ISO_8859_1_dutch.c → STEMMER_stem_ISO_8859_1_dutch.c} +177 -188
  18. data/ext/STEMMER_stem_ISO_8859_1_english.c +1117 -0
  19. data/ext/{stem_ISO_8859_1_finnish.c → STEMMER_stem_ISO_8859_1_finnish.c} +276 -306
  20. data/ext/STEMMER_stem_ISO_8859_1_french.c +1246 -0
  21. data/ext/{stem_ISO_8859_1_german.c → STEMMER_stem_ISO_8859_1_german.c} +161 -170
  22. data/ext/STEMMER_stem_ISO_8859_1_hungarian.c +1230 -0
  23. data/ext/STEMMER_stem_ISO_8859_1_italian.c +1065 -0
  24. data/ext/STEMMER_stem_ISO_8859_1_norwegian.c +297 -0
  25. data/ext/{stem_ISO_8859_1_porter.c → STEMMER_stem_ISO_8859_1_porter.c} +263 -290
  26. data/ext/{stem_ISO_8859_1_portuguese.c → STEMMER_stem_ISO_8859_1_portuguese.c} +362 -380
  27. data/ext/STEMMER_stem_ISO_8859_1_spanish.c +1093 -0
  28. data/ext/STEMMER_stem_ISO_8859_1_swedish.c +307 -0
  29. data/ext/STEMMER_stem_ISO_8859_2_romanian.c +998 -0
  30. data/ext/{stem_KOI8_R_russian.c → STEMMER_stem_KOI8_R_russian.c} +244 -245
  31. data/ext/STEMMER_stem_UTF_8_danish.c +339 -0
  32. data/ext/{stem_UTF_8_dutch.c → STEMMER_stem_UTF_8_dutch.c} +192 -211
  33. data/ext/STEMMER_stem_UTF_8_english.c +1125 -0
  34. data/ext/{stem_UTF_8_finnish.c → STEMMER_stem_UTF_8_finnish.c} +284 -324
  35. data/ext/STEMMER_stem_UTF_8_french.c +1256 -0
  36. data/ext/{stem_UTF_8_german.c → STEMMER_stem_UTF_8_german.c} +170 -187
  37. data/ext/STEMMER_stem_UTF_8_hungarian.c +1234 -0
  38. data/ext/STEMMER_stem_UTF_8_italian.c +1073 -0
  39. data/ext/STEMMER_stem_UTF_8_norwegian.c +299 -0
  40. data/ext/{stem_UTF_8_porter.c → STEMMER_stem_UTF_8_porter.c} +271 -310
  41. data/ext/STEMMER_stem_UTF_8_portuguese.c +1023 -0
  42. data/ext/STEMMER_stem_UTF_8_romanian.c +1004 -0
  43. data/ext/STEMMER_stem_UTF_8_russian.c +694 -0
  44. data/ext/STEMMER_stem_UTF_8_spanish.c +1097 -0
  45. data/ext/STEMMER_stem_UTF_8_swedish.c +309 -0
  46. data/ext/STEMMER_stem_UTF_8_turkish.c +2205 -0
  47. data/ext/{utilities.c → STEMMER_utilities.c} +100 -68
  48. data/ext/analysis.c +276 -121
  49. data/ext/analysis.h +190 -143
  50. data/ext/api.h +3 -4
  51. data/ext/array.c +5 -3
  52. data/ext/array.h +52 -43
  53. data/ext/bitvector.c +38 -482
  54. data/ext/bitvector.h +446 -124
  55. data/ext/bzlib.h +282 -0
  56. data/ext/bzlib_private.h +503 -0
  57. data/ext/compound_io.c +23 -22
  58. data/ext/config.h +21 -11
  59. data/ext/document.c +43 -40
  60. data/ext/document.h +31 -21
  61. data/ext/except.c +20 -38
  62. data/ext/except.h +89 -76
  63. data/ext/extconf.rb +3 -2
  64. data/ext/ferret.c +49 -35
  65. data/ext/ferret.h +14 -11
  66. data/ext/field_index.c +262 -0
  67. data/ext/field_index.h +52 -0
  68. data/ext/filter.c +11 -10
  69. data/ext/fs_store.c +65 -47
  70. data/ext/global.c +245 -165
  71. data/ext/global.h +252 -54
  72. data/ext/hash.c +200 -243
  73. data/ext/hash.h +205 -163
  74. data/ext/hashset.c +118 -96
  75. data/ext/hashset.h +110 -82
  76. data/ext/header.h +19 -19
  77. data/ext/helper.c +11 -10
  78. data/ext/helper.h +14 -6
  79. data/ext/index.c +745 -366
  80. data/ext/index.h +503 -529
  81. data/ext/internal.h +1020 -0
  82. data/ext/lang.c +10 -0
  83. data/ext/lang.h +35 -15
  84. data/ext/mempool.c +5 -4
  85. data/ext/mempool.h +30 -22
  86. data/ext/modules.h +35 -7
  87. data/ext/multimapper.c +43 -2
  88. data/ext/multimapper.h +32 -23
  89. data/ext/posh.c +0 -0
  90. data/ext/posh.h +4 -38
  91. data/ext/priorityqueue.c +10 -12
  92. data/ext/priorityqueue.h +33 -21
  93. data/ext/q_boolean.c +22 -9
  94. data/ext/q_const_score.c +3 -2
  95. data/ext/q_filtered_query.c +15 -12
  96. data/ext/q_fuzzy.c +147 -135
  97. data/ext/q_match_all.c +3 -2
  98. data/ext/q_multi_term.c +28 -32
  99. data/ext/q_parser.c +451 -173
  100. data/ext/q_phrase.c +158 -79
  101. data/ext/q_prefix.c +16 -18
  102. data/ext/q_range.c +363 -31
  103. data/ext/q_span.c +130 -141
  104. data/ext/q_term.c +21 -21
  105. data/ext/q_wildcard.c +19 -23
  106. data/ext/r_analysis.c +369 -242
  107. data/ext/r_index.c +421 -434
  108. data/ext/r_qparser.c +142 -92
  109. data/ext/r_search.c +790 -407
  110. data/ext/r_store.c +44 -44
  111. data/ext/r_utils.c +264 -96
  112. data/ext/ram_store.c +29 -23
  113. data/ext/scanner.c +895 -0
  114. data/ext/scanner.h +36 -0
  115. data/ext/scanner_mb.c +6701 -0
  116. data/ext/scanner_utf8.c +4415 -0
  117. data/ext/search.c +210 -87
  118. data/ext/search.h +556 -488
  119. data/ext/similarity.c +17 -16
  120. data/ext/similarity.h +51 -44
  121. data/ext/sort.c +157 -354
  122. data/ext/stem_ISO_8859_1_hungarian.h +16 -0
  123. data/ext/stem_ISO_8859_2_romanian.h +16 -0
  124. data/ext/stem_UTF_8_hungarian.h +16 -0
  125. data/ext/stem_UTF_8_romanian.h +16 -0
  126. data/ext/stem_UTF_8_turkish.h +16 -0
  127. data/ext/stopwords.c +287 -278
  128. data/ext/store.c +57 -51
  129. data/ext/store.h +308 -286
  130. data/ext/symbol.c +10 -0
  131. data/ext/symbol.h +23 -0
  132. data/ext/term_vectors.c +14 -293
  133. data/ext/threading.h +22 -22
  134. data/ext/win32.h +12 -4
  135. data/lib/ferret.rb +2 -1
  136. data/lib/ferret/browser.rb +1 -1
  137. data/lib/ferret/field_symbol.rb +94 -0
  138. data/lib/ferret/index.rb +221 -34
  139. data/lib/ferret/number_tools.rb +6 -6
  140. data/lib/ferret/version.rb +3 -0
  141. data/test/{unit → long_running}/largefile/tc_largefile.rb +1 -1
  142. data/test/test_helper.rb +7 -2
  143. data/test/test_installed.rb +1 -0
  144. data/test/threading/thread_safety_index_test.rb +10 -1
  145. data/test/threading/thread_safety_read_write_test.rb +4 -7
  146. data/test/threading/thread_safety_test.rb +0 -0
  147. data/test/unit/analysis/tc_analyzer.rb +29 -27
  148. data/test/unit/analysis/tc_token_stream.rb +23 -16
  149. data/test/unit/index/tc_index.rb +116 -11
  150. data/test/unit/index/tc_index_reader.rb +27 -27
  151. data/test/unit/index/tc_index_writer.rb +10 -0
  152. data/test/unit/index/th_doc.rb +38 -21
  153. data/test/unit/search/tc_filter.rb +31 -10
  154. data/test/unit/search/tc_index_searcher.rb +6 -0
  155. data/test/unit/search/tm_searcher.rb +53 -1
  156. data/test/unit/store/tc_fs_store.rb +40 -2
  157. data/test/unit/store/tc_ram_store.rb +0 -0
  158. data/test/unit/store/tm_store.rb +0 -0
  159. data/test/unit/store/tm_store_lock.rb +7 -6
  160. data/test/unit/tc_field_symbol.rb +26 -0
  161. data/test/unit/ts_analysis.rb +0 -0
  162. data/test/unit/ts_index.rb +0 -0
  163. data/test/unit/ts_store.rb +0 -0
  164. data/test/unit/ts_utils.rb +0 -0
  165. data/test/unit/utils/tc_number_tools.rb +0 -0
  166. data/test/utils/content_generator.rb +226 -0
  167. metadata +262 -221
  168. data/ext/inc/lang.h +0 -48
  169. data/ext/inc/threading.h +0 -31
  170. data/ext/stem_ISO_8859_1_english.c +0 -1156
  171. data/ext/stem_ISO_8859_1_french.c +0 -1276
  172. data/ext/stem_ISO_8859_1_italian.c +0 -1091
  173. data/ext/stem_ISO_8859_1_norwegian.c +0 -296
  174. data/ext/stem_ISO_8859_1_spanish.c +0 -1119
  175. data/ext/stem_ISO_8859_1_swedish.c +0 -307
  176. data/ext/stem_UTF_8_danish.c +0 -344
  177. data/ext/stem_UTF_8_english.c +0 -1176
  178. data/ext/stem_UTF_8_french.c +0 -1296
  179. data/ext/stem_UTF_8_italian.c +0 -1113
  180. data/ext/stem_UTF_8_norwegian.c +0 -302
  181. data/ext/stem_UTF_8_portuguese.c +0 -1055
  182. data/ext/stem_UTF_8_russian.c +0 -709
  183. data/ext/stem_UTF_8_spanish.c +0 -1137
  184. data/ext/stem_UTF_8_swedish.c +0 -313
  185. data/lib/ferret_version.rb +0 -3
data/README CHANGED
@@ -1,39 +1,27 @@
1
1
  = Ferret
2
2
 
3
- Ferret is a Ruby port of the Java Lucene search engine.
4
- (http://jakarta.apache.org/lucene/) In the same way as Lucene, it is not a
5
- standalone application, but a library you can use to index documents and
3
+ Ferret is a Ruby search library inspired by the Apache Lucene search engine for
4
+ Java (http://jakarta.apache.org/lucene/). In the same way as Lucene, it is not
5
+ a standalone application, but a library you can use to index documents and
6
6
  search for things in them later.
7
7
 
8
8
  == Requirements
9
9
 
10
10
  * Ruby 1.8
11
- * C compiler to build the extension. Tested with gcc, VC6 and VC2005
11
+ * C compiler to build the extension. Tested with gcc, VC6
12
+ * make (or nmake on windows)
12
13
 
13
14
  == Installation
14
15
 
15
- If you have gems installed you can simply do;
16
+ $ sudo gem install ferret
16
17
 
17
- gem install ferret
18
+ If you don't have rubygems installed you can still install Ferret. Just
19
+ download one of the zipped up versions of Ferret, unzip it and change into the
20
+ unzipped directory. Then run the following set of commands;
18
21
 
19
- Otherwise, you will need Rake installed. De-compress the archive and enter its top directory.
20
-
21
- tar zxpvf ferret-<version>.tar.gz
22
- cd ferret-<version>
23
-
24
- Run the following;
25
-
26
- $ rake ext
27
22
  $ ruby setup.rb config
28
23
  $ ruby setup.rb setup
29
- # ruby setup.rb install
30
-
31
- These simple steps install ferret in the default location of Ruby libraries.
32
- You can also install files into your favorite directory by supplying setup.rb
33
- some options. Try;
34
-
35
- $ ruby setup.rb --help
36
-
24
+ $ sudo ruby setup.rb install
37
25
 
38
26
  == Usage
39
27
 
@@ -0,0 +1,137 @@
1
+ (in /home/dave/w/ferret/ruby)
2
+ ------------------------------------------------------------------------
3
+ r830 | dbalmain | 2008-03-01 14:10:47 +1100 (Sat, 01 Mar 2008) | 1 line
4
+
5
+ A few more updates to the build system
6
+ ------------------------------------------------------------------------
7
+ r829 | dbalmain | 2008-03-01 13:55:16 +1100 (Sat, 01 Mar 2008) | 1 line
8
+
9
+ A few more updates to the build system
10
+ ------------------------------------------------------------------------
11
+ r828 | dbalmain | 2008-02-29 10:48:33 +1100 (Fri, 29 Feb 2008) | 1 line
12
+
13
+ Moved largefile test to a new long_running test directory so that tests can be run more easily
14
+ ------------------------------------------------------------------------
15
+ r826 | dbalmain | 2008-02-29 10:09:48 +1100 (Fri, 29 Feb 2008) | 1 line
16
+
17
+ Updated references to ferret/version.rb. Updated Rakefile to allow release task testing
18
+ ------------------------------------------------------------------------
19
+ r825 | dbalmain | 2008-02-29 10:02:27 +1100 (Fri, 29 Feb 2008) | 1 line
20
+
21
+ Updated Rakefile to clean it up (added namespaces).
22
+ ------------------------------------------------------------------------
23
+ r824 | dbalmain | 2008-02-29 10:01:08 +1100 (Fri, 29 Feb 2008) | 1 line
24
+
25
+ Updated :filter_proc so that custom PostFilter extensions can be built and applied to searches. See ruby/examples/c_extensions/age_filter
26
+ ------------------------------------------------------------------------
27
+ r823 | dbalmain | 2008-02-26 18:44:39 +1100 (Tue, 26 Feb 2008) | 1 line
28
+
29
+ Fixed ticket #277. This will also help with the correct highlighting of matching urls in queries
30
+ ------------------------------------------------------------------------
31
+ r822 | dbalmain | 2008-02-22 12:46:48 +1100 (Fri, 22 Feb 2008) | 1 line
32
+
33
+ Updated to latest posh.h => http://poshlib.hookatooka.com/poshlib/
34
+ ------------------------------------------------------------------------
35
+ r821 | dbalmain | 2008-02-22 09:05:25 +1100 (Fri, 22 Feb 2008) | 1 line
36
+
37
+ Added ruby bindings to MultiMapper for testing in Ruby
38
+ ------------------------------------------------------------------------
39
+ r820 | dbalmain | 2008-02-09 14:30:55 +1100 (Sat, 09 Feb 2008) | 1 line
40
+
41
+ Updated svn:ignore properties to handle new stemmer files
42
+ ------------------------------------------------------------------------
43
+ r819 | dbalmain | 2008-02-09 14:27:46 +1100 (Sat, 09 Feb 2008) | 9 lines
44
+
45
+ Fixed Ticket #337. StemFilter.new now works with 'English', :english or
46
+ 'EnGlIsH' and 'UTF_8' or 'utf-8' etc.
47
+
48
+ Also, good news for Norwegians, Romanians, Turks and Finns. We now have 3 new
49
+ stemmers for Norwegian, Romanian and Turkish and 2 new stop-word lists for
50
+ Finnish and Hungarian. Please try them out and let me know if there are any
51
+ problems.
52
+
53
+
54
+ ------------------------------------------------------------------------
55
+ r818 | dbalmain | 2008-02-09 13:20:37 +1100 (Sat, 09 Feb 2008) | 1 line
56
+
57
+ Removed old version of stemmer. Making way for new version. This will break build temporarily
58
+ ------------------------------------------------------------------------
59
+ r817 | dbalmain | 2008-02-09 11:55:02 +1100 (Sat, 09 Feb 2008) | 1 line
60
+
61
+ Added a very useful group_by example.
62
+ ------------------------------------------------------------------------
63
+ r816 | dbalmain | 2008-02-09 09:26:20 +1100 (Sat, 09 Feb 2008) | 1 line
64
+
65
+ Updated documentation for :filter_proc to indicate that you can return a Float to be used to modify the score.
66
+ ------------------------------------------------------------------------
67
+ r815 | dbalmain | 2008-02-09 00:27:58 +1100 (Sat, 09 Feb 2008) | 1 line
68
+
69
+ Made TypedRangeQuery the default range query when used from Ferret::Index::Index
70
+ ------------------------------------------------------------------------
71
+ r814 | dbalmain | 2008-02-08 23:16:55 +1100 (Fri, 08 Feb 2008) | 1 line
72
+
73
+ Made the TypedRangeQuery optional in the query parser
74
+ ------------------------------------------------------------------------
75
+ r813 | dbalmain | 2008-02-08 23:12:13 +1100 (Fri, 08 Feb 2008) | 1 line
76
+
77
+ Added TypedRangeQuery and TypedRangeFilter to the ruby bindings
78
+ ------------------------------------------------------------------------
79
+ r812 | dbalmain | 2008-02-08 22:19:31 +1100 (Fri, 08 Feb 2008) | 1 line
80
+
81
+ Added TypedRangeQuery so that you can do range queries with unpadded numbers
82
+ ------------------------------------------------------------------------
83
+ r811 | dbalmain | 2008-02-08 16:22:06 +1100 (Fri, 08 Feb 2008) | 3 lines
84
+
85
+ Whoops, quick fix. Had unnecessarily nested locks.
86
+
87
+
88
+ ------------------------------------------------------------------------
89
+ r810 | dbalmain | 2008-02-08 16:17:33 +1100 (Fri, 08 Feb 2008) | 1 line
90
+
91
+ Added patch for Ticket #340 which adds batch updating and deleting. Made significant modifications from the patch.
92
+ ------------------------------------------------------------------------
93
+ r809 | dbalmain | 2008-02-08 13:49:07 +1100 (Fri, 08 Feb 2008) | 18 lines
94
+
95
+ Added score filter. This enables you to filter the results and modify the score
96
+ to change the sort order.
97
+
98
+ For example to modify the scoring so that a document with todays date gets
99
+ twice the score factor as a document 50 days ago and four times the score
100
+ factor of a document 100 days ago (ie a half life of 50 days) you would do
101
+ this;
102
+
103
+ fifty_day_half_life_filter = lambda do |doc, score, searcher|
104
+ days = (Date.today() - Date.parse(searcher[doc][:date])).to_i
105
+ 1.0 / (2.0 ** (days.to_f / 50.0))
106
+ end
107
+
108
+ top_docs = @searcher.search(q, :filter_proc => fifty_day_half_life_filter)
109
+
110
+
111
+
112
+
113
+ ------------------------------------------------------------------------
114
+ r808 | dbalmain | 2008-01-11 07:14:01 +1100 (Fri, 11 Jan 2008) | 1 line
115
+
116
+ Changed unsigned long longs to f_u64 type to fix ticket #336
117
+ ------------------------------------------------------------------------
118
+ r807 | dbalmain | 2008-01-11 07:12:40 +1100 (Fri, 11 Jan 2008) | 1 line
119
+
120
+ Changed unsigned long longs to f_u64 type to fix ticket #336
121
+ ------------------------------------------------------------------------
122
+ r806 | dbalmain | 2008-01-11 07:01:00 +1100 (Fri, 11 Jan 2008) | 1 line
123
+
124
+ Minor comment correction
125
+ ------------------------------------------------------------------------
126
+ r805 | dbalmain | 2007-12-12 10:28:23 +1100 (Wed, 12 Dec 2007) | 1 line
127
+
128
+ Fixed Ticket #332. Added spaces so that code parses correctly.
129
+ ------------------------------------------------------------------------
130
+ r804 | dbalmain | 2007-12-03 11:20:34 +1100 (Mon, 03 Dec 2007) | 1 line
131
+
132
+ Added test for ticket #324
133
+ ------------------------------------------------------------------------
134
+ r803 | dbalmain | 2007-12-03 11:12:55 +1100 (Mon, 03 Dec 2007) | 1 line
135
+
136
+ Fixed Ferret::Index::Index#query_update for ticket #324. Was only updating a maximum of 10 records.
137
+ ------------------------------------------------------------------------
@@ -0,0 +1,60 @@
1
+ The most significant update in this release is that you can now alter the
2
+ scoring, thereby altering the ordering of search results. A great application of
3
+ this is that you can now change the weight of a document based on its age. In
4
+ this example we have 365 day half life, ie a year-old document has half the
5
+ weight of a new document and twice the weight of a 2-year-old document;
6
+
7
+ require 'ferret'
8
+
9
+ age_weight = lambda do |doc, score, searcher|
10
+ age = (Date.today - Date.parse(searcher[doc][:date])).to_i
11
+ 1 / 2 ** (age.to_f/365)
12
+ end
13
+
14
+ index = Ferret::I.new
15
+
16
+ sales = [
17
+ { :artist => 'Giovanni Bellini',
18
+ :date => '2006-10-23',
19
+ :work => 'Transfiguration'
20
+ },
21
+ { :artist => 'Giovanni Bellini',
22
+ :date => '2008-01-05',
23
+ :work => 'Pesaro Altarpiece'
24
+ },
25
+ { :artist => 'Gentile Bellini',
26
+ :date => '2008-02-10',
27
+ :work => 'St. Dominic'
28
+ },
29
+ ].each {|doc| index << doc}
30
+
31
+ puts index.search('artist:(Giovanni Bellini)').to_s(:work)
32
+ # =>
33
+ # TopDocs: total_hits = 3, max_score = 0.767351 [
34
+ # 0 "Transfiguration": 0.767351
35
+ # 1 "Pesaro Altarpiece": 0.767351
36
+ # 2 "St. Dominic": 0.129147
37
+ # ]
38
+
39
+ puts index.search('artist:(Giovanni Bellini)',
40
+ :filter_proc => age_weight).to_s(:work)
41
+ # =>
42
+ # TopDocs: total_hits = 3, max_score = 0.718006 [
43
+ # 1 "Pesaro Altarpiece": 0.718006
44
+ # 0 "Transfiguration": 0.311937
45
+ # 2 "St. Dominic": 0.129147
46
+ # ]
47
+
48
+ You can also now write your own C extensions to filter the search results. You
49
+ can see an example of this by downloading the source and looking at;
50
+
51
+ ferret_unzipped/ruby/examples/c_extensions/age_filter/
52
+
53
+ Alternatively, you can view the code at;
54
+
55
+ http://ferret.davebalmain.com/trac/browser/trunk/ruby/examples/c_extensions?rev=828
56
+
57
+ Also, good news for Norwegians, Romanians, Turks and Finns. We now have 3 new
58
+ stemmers for Norwegian, Romanian and Turkish and 2 new stop-word lists for
59
+ Finnish and Hungarian. Please try them out and let me know if there are any
60
+ problems.
data/Rakefile CHANGED
@@ -1,338 +1,443 @@
1
- $:. << 'lib'
2
- # Some parts of this Rakefile where taken from Jim Weirich's Rakefile for
3
- # Rake. Other parts where taken from the David Heinemeier Hansson's Rails
4
- # Rakefile. Both are under MIT-LICENSE. Thanks to both for their excellent
5
- # projects.
6
-
7
1
  require 'rake'
8
- require 'rake/testtask'
9
- require 'rake/rdoctask'
10
2
  require 'rake/clean'
11
- require 'ferret_version'
3
+ require 'rake/gempackagetask'
4
+ require 'rake/rdoctask'
5
+ require 'rake/testtask'
12
6
 
13
- begin
14
- require 'rubygems'
15
- require 'rake/gempackagetask'
16
- rescue Exception
17
- nil
18
- end
7
+ $:. << 'lib'
8
+ require 'ferret/version'
19
9
 
20
- CURRENT_VERSION = Ferret::VERSION
21
- if ENV['REL']
22
- PKG_VERSION = ENV['REL']
23
- else
24
- PKG_VERSION = CURRENT_VERSION
25
- end
26
10
 
27
- def announce(msg='')
11
+ def say(msg='')
28
12
  STDERR.puts msg
29
13
  end
30
14
 
31
- EXT = "ferret_ext.so"
32
- EXT_SRC = FileList["../c/src/*.[c]", "../c/include/*.h",
33
- "../c/lib/libstemmer_c/src_c/*.[ch]",
34
- "../c/lib/libstemmer_c/runtime/*.[ch]",
35
- "../c/lib/libstemmer_c/libstemmer/*.[ch]",
36
- "../c/lib/libstemmer_c/include/libstemmer.h"]
37
- EXT_SRC.exclude('../**/ind.[ch]')
38
-
39
- EXT_SRC_DEST = EXT_SRC.map {|fn| File.join("ext", File.basename(fn))}
40
- SRC = (FileList["ext/*.[ch]"] + EXT_SRC_DEST).uniq
41
-
42
- CLEAN.include(FileList['**/*.o', '**/*.obj', 'InstalledFiles',
43
- '.config', 'ext/cferret.c'])
44
- CLOBBER.include(FileList['**/*.so'], 'ext/Makefile', EXT_SRC_DEST)
45
- POLISH = Rake::FileList.new.include(FileList['**/*.so'], 'ext/Makefile')
46
-
47
- desc "Clean specifically for the release."
48
- task :polish => [:clean] do
49
- POLISH.each { |fn| rm_r fn rescue nil }
15
+ def prompt(msg)
16
+ STDERR.print "#{msg} [Yna]: "
17
+ while true
18
+ case STDIN.gets.chomp!
19
+ when /^(y(es)?)?$/i then return true
20
+ when /^no?$/i then return false
21
+ when /^a(bort)?$/i then fail('aborted')
22
+ else
23
+ STDERR.print "Sorry, I don't understand. Please type y, n or a: "
24
+ end
25
+ end
50
26
  end
51
27
 
52
- desc "Run tests with Valgrind"
53
- task :valgrind do
54
- sh "valgrind --gen-suppressions=yes --suppressions=ferret_valgrind.supp " +
55
- "--leak-check=yes --show-reachable=yes -v ruby test/test_all.rb"
56
- #sh "valgrind --suppressions=ferret_valgrind.supp " +
57
- # "--leak-check=yes --show-reachable=yes -v ruby test/unit/index/tc_index_reader.rb"
58
- #valgrind --gen-suppressions=yes --suppressions=ferret_valgrind.supp --leak-check=yes --show-reachable=yes -v ruby test/test_all.rb
59
- end
28
+ windows = (RUBY_PLATFORM =~ /win32|cygwin/) rescue nil
29
+ SUDO = windows ? "" : "sudo "
60
30
 
61
- task :default => :test_all
62
- #task :default => :ext do
31
+
32
+ task :default => 'test:unit'
33
+ #task :default => :build do
63
34
  # sh "ruby test/unit/index/tc_index.rb"
64
35
  #end
65
36
 
66
- desc "Run all tests"
67
- task :test_all => [ :test_units ]
68
-
69
- desc "Generate API documentation"
70
- task :doc => [ :appdoc ]
71
-
72
- desc "run unit tests in test/unit"
73
- Rake::TestTask.new("test_units" => :ext) do |t|
74
- t.libs << "test/unit"
75
- t.pattern = 'test/unit/t[cs]_*.rb'
76
- #t.pattern = 'test/unit/search/tc_index_searcher.rb'
77
- t.verbose = true
78
- end
79
-
80
- desc "Generate documentation for the application"
81
- rd = Rake::RDocTask.new("appdoc") do |rdoc|
82
- rdoc.rdoc_dir = 'doc/api'
83
- rdoc.title = "Ferret Search Library Documentation"
84
- rdoc.options << '--line-numbers'
85
- rdoc.options << '--inline-source'
86
- rdoc.options << '--charset=utf-8'
87
- rdoc.rdoc_files.include('README')
88
- rdoc.rdoc_files.include('TODO')
89
- rdoc.rdoc_files.include('TUTORIAL')
90
- rdoc.rdoc_files.include('MIT-LICENSE')
91
- rdoc.rdoc_files.include('lib/**/*.rb')
92
- rdoc.rdoc_files.include('ext/r_*.c')
93
- rdoc.rdoc_files.include('ext/ferret.c')
94
- end
37
+ BZLIB_SRC = FileList["../c/lib/bzlib/*.h"] +
38
+ FileList["../c/lib/bzlib/*.c"].map do |fn|
39
+ fn.gsub(%r{/([^/]*.c)}, '/BZ_\1')
40
+ end
41
+ ##############################################################################
42
+ # Building
43
+ ##############################################################################
44
+
45
+ task :build => 'build:compile'
46
+ namespace :build do
47
+ EXT = "ferret_ext.so"
48
+ # Note: libstemmer.[h] is necessary so that the file isn't included when it
49
+ # doesn't exist. It needs to have one regular expression element.
50
+ EXT_SRC = FileList["../c/src/*.[ch]", "../c/include/*.h",
51
+ "../c/lib/bzlib/*.[ch]",
52
+ "../c/lib/libstemmer_c/src_c/*.[ch]",
53
+ "../c/lib/libstemmer_c/runtime/*.[ch]",
54
+ "../c/lib/libstemmer_c/libstemmer/*.[ch]",
55
+ "../c/lib/libstemmer_c/include/libstemmer.[h]"]
56
+ EXT_SRC.exclude('../c/**/ind.[ch]',
57
+ '../c/**/symbol.[ch]',
58
+ '../c/include/threading.h',
59
+ '../c/include/scanner.h',
60
+ '../c/include/internal.h',
61
+ '../c/src/lang.c',
62
+ '../c/include/lang.h')
63
+
64
+ EXT_SRC_MAP = {}
65
+ EXT_SRC_DEST = EXT_SRC.map do |fn|
66
+ ext_fn = File.join("ext", File.basename(fn))
67
+ if fn =~ /.c$/ and fn =~ /(bzlib|stemmer)/
68
+ prefix = $1.upcase
69
+ ext_fn.gsub!(/ext\//, "ext/#{prefix}_")
70
+ end
71
+ EXT_SRC_MAP[fn] = ext_fn
72
+ end
73
+ SRC = FileList["ext/*.[ch]", EXT_SRC_DEST, 'ext/internal.h'].uniq
74
+
75
+ CLEAN.include ['**/*.o', '**/*.obj', '.config', 'ext/cferret.c']
76
+ CLOBBER.include ['doc/api', 'ext/*.so', 'ext/Makefile',
77
+ 'ext/internal.h', EXT_SRC_DEST]
78
+
79
+ # The following block creates file tasks for all of the c files. They
80
+ # belong in the ../c directory in source the working copy and they need
81
+ # to be linked to in the ext directory
82
+ EXT_SRC.each do |fn|
83
+ dest_fn = EXT_SRC_MAP[fn]
84
+ # prepend lib files to avoid conflicts
85
+ file dest_fn => fn do |t|
86
+ ln_sf File.expand_path(fn), File.expand_path(dest_fn)
87
+
88
+ if fn =~ /stemmer/
89
+ # flatten the directory structure for lib_stemmer
90
+ open(dest_fn) do |in_f|
91
+ open(dest_fn + ".out", "w") do |out_f|
92
+ in_f.each do |line|
93
+ out_f.write(line.sub(/(#include ["<])[.a-z_\/]*\//, '\1'))
94
+ end
95
+ end
96
+ end
97
+ mv dest_fn + ".out", dest_fn
98
+ end
99
+ end
100
+ end if File.exists?("../c")
95
101
 
96
- EXT_SRC.each do |fn|
97
- dest_fn = File.join("ext", File.basename(fn))
98
- file dest_fn => fn do |t|
99
- begin
100
- raise "copy for release" if ENV["REL"]
101
- ln_s File.join("..", fn), dest_fn
102
- rescue Exception => e
103
- cp File.expand_path(fn), dest_fn
102
+ file 'ext/internal.h' => '../c/include/internal.h' do
103
+ File.open('ext/internal.h', 'w') do |f|
104
+ File.readlines('../c/include/internal.h').each do |l|
105
+ next if l =~ /ALLOC/ and l !~ /ZERO|MP_/
106
+ f.puts(l)
107
+ end
104
108
  end
109
+ end
105
110
 
106
- if fn =~ /stemmer/
107
- # flatten the directory structure for lib_stemmer
108
- open(dest_fn) do |in_f|
109
- open(dest_fn + ".out", "w") do |out_f|
110
- in_f.each {|line| out_f.write(line.sub(/(#include ["<])[.a-z_\/]*\//) {"#{$1}"})}
111
+ desc "Build the extension (ferret_ext.so). You'll need a C compiler and Make."
112
+ task :compile => ["ext/#{EXT}"] + SRC
113
+
114
+ file "ext/#{EXT}" => "ext/Makefile" do
115
+ cd "ext"
116
+ if windows and ENV['make'].nil?
117
+ begin
118
+ sh "nmake"
119
+ rescue Exception => e
120
+ path = ':\Program Files\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT'
121
+ if File.exists? "f#{path}"
122
+ sh "f#{path}"
123
+ elsif File.exists? "c#{path}"
124
+ sh "c#{path}"
125
+ else
126
+ say
127
+ say "***************************************************************"
128
+ say "You need to have Visual C++ 6 to build Ferret on Windows."
129
+ say "If you have it installed, you may need to run;"
130
+ say ' C:\Program Files\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT'
131
+ say "***************************************************************"
132
+ say
133
+ raise e
111
134
  end
135
+ sh "nmake"
112
136
  end
113
- mv dest_fn + ".out", dest_fn
137
+ else
138
+ sh "make"
114
139
  end
140
+ cd ".."
115
141
  end
116
- end if File.exists?("../c")
117
-
118
- desc "Build the extension"
119
- task :ext => ["ext/#{EXT}"] + SRC do
120
- rm_f 'ext/mem_pool.*'
121
- rm_f 'ext/defines.h'
122
- end
123
142
 
124
- file "ext/#{EXT}" => ["ext/Makefile"] do
125
- cp "ext/inc/lang.h", "ext/lang.h"
126
- cp "ext/inc/threading.h", "ext/threading.h"
127
- cd "ext"
128
- if (/mswin/ =~ RUBY_PLATFORM) and ENV['make'].nil?
129
- begin
130
- sh "nmake"
131
- rescue Exception => e
132
- puts
133
- puts "**********************************************************************"
134
- puts "You may need to call VCVARS32.BAT to set the environment variables."
135
- puts ' "f:\Program Files\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT"'
136
- puts "**********************************************************************"
137
- puts
138
- raise e
139
- end
140
- else
141
- sh "make"
143
+ file "ext/Makefile" => SRC do
144
+ cd "ext"
145
+ ruby "extconf.rb"
146
+ cd ".."
142
147
  end
143
- cd ".."
144
148
  end
145
149
 
146
- file "ext/lang.h" => ["ext/inc/lang.h"] do
147
- rm_f "ext/lang.h"
148
- cp "ext/inc/lang.h", "ext/lang.h"
149
- end
150
+ ##############################################################################
151
+ # Testing
152
+ ##############################################################################
153
+
154
+ task :test => 'test:units'
155
+ namespace :test do
156
+ desc "Run tests with Valgrind"
157
+ task :valgrind do
158
+ sh "valgrind --suppressions=ferret_valgrind.supp " +
159
+ "--leak-check=yes --show-reachable=yes " +
160
+ "-v ruby test/unit/index/tc_index_reader.rb"
161
+ end
150
162
 
151
- file "ext/threading.h" => ["ext/inc/threading.h"] do
152
- rm_f "ext/threading.h"
153
- cp "ext/inc/threading.h", "ext/threading.h"
154
- end
163
+ desc "Run all tests"
164
+ task :all => [ :units ]
155
165
 
156
- file "ext/Makefile" => SRC do
157
- cd "ext"
158
- `ruby extconf.rb`
159
- cd ".."
166
+ desc "run unit tests in test/unit"
167
+ Rake::TestTask.new("units" => :build) do |t|
168
+ t.libs << "test/unit"
169
+ t.pattern = 'test/unit/t[cs]_*.rb'
170
+ t.verbose = true
171
+ end
172
+ task :unit => :units
173
+
174
+ desc "run tests using locally installed gem"
175
+ Rake::TestTask.new("installed") do |t|
176
+ t.libs << "test/unit"
177
+ t.ruby_opts << '-rtest/test_installed'
178
+ t.pattern = 'test/unit/t[cs]_*.rb'
179
+ t.verbose = true
180
+ end
160
181
  end
161
182
 
162
- # Make Parsers ---------------------------------------------------------------
183
+ ##############################################################################
184
+ # Documentation
185
+ ##############################################################################
163
186
 
164
- RACC_SRC = FileList["lib/**/*.y"]
165
- RACC_OUT = RACC_SRC.collect { |fn| fn.sub(/\.y$/, '.tab.rb') }
187
+ desc "Generate API documentation"
188
+ task :doc => 'doc:rdoc'
189
+ namespace :doc do
190
+ if allison = Gem.cache.find_name('allison').last
191
+ allison_template = File.join(allison.full_gem_path, 'lib/allison.rb')
192
+ end
193
+ desc "Generate documentation for the application"
194
+ $rd = Rake::RDocTask.new do |rdoc|
195
+ rdoc.rdoc_dir = 'doc/api'
196
+ rdoc.title = "Ferret Search Library Documentation"
197
+ rdoc.options << '--line-numbers'
198
+ rdoc.options << '--inline-source'
199
+ rdoc.options << '--charset=utf-8'
200
+ rdoc.template = allison_template if allison_template
201
+ rdoc.rdoc_files.include('README')
202
+ rdoc.rdoc_files.include('TODO')
203
+ rdoc.rdoc_files.include('TUTORIAL')
204
+ rdoc.rdoc_files.include('MIT-LICENSE')
205
+ rdoc.rdoc_files.include('lib/**/*.rb')
206
+ rdoc.rdoc_files.include('ext/r_*.c')
207
+ rdoc.rdoc_files.include('ext/ferret.c')
208
+ end
166
209
 
167
- task :parsers => RACC_OUT
168
- rule(/\.tab\.rb$/ => [proc {|tn| tn.sub(/\.tab\.rb$/, '.y')}]) do |t|
169
- sh "racc #{t.source}"
210
+ desc "Look for TODO and FIXME tags in the code"
211
+ task :todo do
212
+ FileList['**/*.rb', 'ext/*.[ch]'].egrep /[#*].*(FIXME|TODO|TBD)/i
213
+ end
170
214
  end
171
215
 
172
- # Create Packages ------------------------------------------------------------
216
+ ##############################################################################
217
+ # Packaging and Installing
218
+ ##############################################################################
173
219
 
174
220
  PKG_FILES = FileList[
175
221
  'setup.rb',
176
222
  '[-A-Z]*',
177
- 'ext/**/*.[ch]',
178
- 'lib/**/*.rb',
179
- 'lib/**/*.rhtml',
180
- 'lib/**/*.css',
181
- 'lib/**/*.js',
223
+ 'lib/**/*.rb',
224
+ 'lib/**/*.rhtml',
225
+ 'lib/**/*.css',
226
+ 'lib/**/*.js',
182
227
  'test/**/*.rb',
183
228
  'test/**/wordfile',
184
229
  'rake_utils/**/*.rb',
185
- 'Rakefile'
230
+ 'Rakefile',
231
+ SRC
186
232
  ]
187
- PKG_FILES.exclude('**/*.o')
188
- PKG_FILES.exclude('**/Makefile')
189
- PKG_FILES.exclude('ext/ferret_ext.so')
190
-
191
-
192
- if ! defined?(Gem)
193
- puts "Package Target requires RubyGEMs"
194
- else
195
- spec = Gem::Specification.new do |s|
196
-
197
- #### Basic information.
198
- s.name = 'ferret'
199
- s.version = PKG_VERSION
200
- s.summary = "Ruby indexing library."
201
- s.description = <<-EOF
202
- Ferret is a port of the Java Lucene project. It is a powerful
203
- indexing and search library.
204
- EOF
205
233
 
206
- #### Dependencies and requirements.
207
- s.add_dependency('rake')
208
- s.files = PKG_FILES.to_a
209
- s.extensions << "ext/extconf.rb"
210
- s.require_path = 'lib'
211
- s.autorequire = 'ferret'
212
- s.bindir = 'bin'
213
- s.executables = ['ferret-browser']
214
- s.default_executable = 'ferret-browser'
215
-
216
- #### Author and project details.
217
- s.author = "David Balmain"
218
- s.email = "dbalmain@gmail.com"
219
- s.homepage = "http://ferret.davebalmain.com/trac"
220
- s.rubyforge_project = "ferret"
221
-
222
- s.has_rdoc = true
223
- s.extra_rdoc_files = rd.rdoc_files.reject { |fn| fn =~ /\.rb$/ }.to_a
224
- s.rdoc_options <<
225
- '--title' << 'Ferret -- Ruby Indexer' <<
226
- '--main' << 'README' << '--line-numbers' <<
227
- 'TUTORIAL' << 'TODO'
228
-
229
- if RUBY_PLATFORM =~ /mswin/
230
- s.files = PKG_FILES.to_a + ["ext/#{EXT}"]
231
- s.extensions.clear
232
- s.platform = Gem::Platform::WIN32
233
- end
234
+ spec = Gem::Specification.new do |s|
235
+
236
+ #### Basic information.
237
+ s.name = 'ferret'
238
+ s.version = Ferret::VERSION
239
+ s.summary = "Ruby indexing library."
240
+ s.description = "Ferret is a super fast, highly configurable search library."
241
+
242
+ #### Dependencies and requirements.
243
+ s.add_dependency('rake')
244
+ s.files = PKG_FILES.to_a
245
+ s.extensions << "ext/extconf.rb"
246
+ s.require_path = 'lib'
247
+ s.bindir = 'bin'
248
+ s.executables = ['ferret-browser']
249
+ s.default_executable = 'ferret-browser'
250
+
251
+ #### Author and project details.
252
+ s.author = "David Balmain"
253
+ s.email = "dbalmain@gmail.com"
254
+ #s.homepage = "http://ferret.davebalmain.com/trac"
255
+ s.homepage = "http://github.com/jkraemer/ferret"
256
+ s.rubyforge_project = "ferret"
257
+
258
+ s.has_rdoc = true
259
+ s.extra_rdoc_files = $rd.rdoc_files.reject { |fn| fn =~ /\.rb$/ }.to_a
260
+ s.rdoc_options <<
261
+ '--title' << 'Ferret -- Ruby Search Library' <<
262
+ '--main' << 'README' << '--line-numbers' <<
263
+ 'TUTORIAL' << 'TODO'
264
+
265
+ key_file = File.expand_path('~/.gem/gem-private_key.pem')
266
+ key_file = nil unless File.exists?(key_file)
267
+ cert_file = File.expand_path('~/.gem/gem-public_cert.pem')
268
+ cert_file = nil unless File.exists?(cert_file)
269
+ if key_file and cert_file
270
+ s.signing_key = key_file
271
+ s.cert_chain = cert_file
234
272
  end
235
273
 
236
- package_task = Rake::GemPackageTask.new(spec) do |pkg|
237
- unless RUBY_PLATFORM =~ /mswin/
238
- pkg.need_zip = true
239
- pkg.need_tar = true
240
- end
274
+ if windows
275
+ s.files = PKG_FILES.to_a + ["ext/#{EXT}"]
276
+ s.extensions.clear
277
+ s.platform = Gem::Platform::WIN32
278
+ else
279
+ s.platform = Gem::Platform::RUBY
241
280
  end
242
281
  end
243
282
 
244
- # Support Tasks ------------------------------------------------------
283
+ package_task = Rake::GemPackageTask.new(spec) do |pkg|
284
+ unless windows
285
+ pkg.need_zip = true
286
+ pkg.need_tar = true
287
+ end
288
+ end
245
289
 
246
- desc "Look for TODO and FIXME tags in the code"
247
- task :todo do
248
- FileList['**/*.rb'].egrep /#.*(FIXME|TODO|TBD)/
290
+ desc "Run :gem and install the resulting gem"
291
+ task :install => :gem do
292
+ sh "#{SUDO}gem install pkg/ferret-#{Ferret::VERSION}.gem --no-rdoc --no-ri -l"
249
293
  end
250
- # --------------------------------------------------------------------
251
- # Creating a release
252
-
253
- desc "Make a new release"
254
- task :release => [
255
- :prerelease,
256
- :polish,
257
- :test_all,
258
- :update_version,
259
- :package,
260
- :tag] do
261
- announce
262
- announce "**************************************************************"
263
- announce "* Release #{PKG_VERSION} Complete."
264
- announce "* Packages ready to upload."
265
- announce "**************************************************************"
266
- announce
294
+
295
+ desc "Run :clobber and uninstall the .gem"
296
+ task :uninstall => :clobber do
297
+ sh "#{SUDO}gem uninstall ferret"
267
298
  end
268
299
 
269
- # Validate that everything is ready to go for a release.
270
- task :prerelease do
271
- announce
272
- announce "**************************************************************"
273
- announce "* Making RubyGem Release #{PKG_VERSION}"
274
- announce "* (current version #{CURRENT_VERSION})"
275
- announce "**************************************************************"
276
- announce
277
-
278
- # Is a release number supplied?
279
- unless ENV['REL']
280
- fail "Usage: rake release REL=x.y.z [REUSE=tag_suffix]"
281
- end
300
+ desc "Same as :install but you must be rootgem"
301
+ task :root_install => :gem do
302
+ sh "gem install pkg/ferret-#{Ferret::VERSION}.gem --no-rdoc --no-ri -l"
303
+ end
282
304
 
283
- # Is the release different than the current release.
284
- # (or is REUSE set?)
285
- if PKG_VERSION == CURRENT_VERSION && ! ENV['REUSE']
286
- fail "Current version is #{PKG_VERSION}, must specify REUSE=tag_suffix to reuse version"
287
- end
305
+ desc "Same as :uninstall but you must be root"
306
+ task :root_uninstall => :clobber do
307
+ sh "gem uninstall ferret"
308
+ end
288
309
 
289
- # Are all source files checked in?
290
- data = `svn -q --ignore-externals status`
291
- unless data =~ /^$/
292
- fail "'svn -q status' is not clean ... do you have unchecked-in files?"
293
- end
294
-
295
- announce "No outstanding checkins found ... OK"
310
+ def list_changes_since_last_release
311
+ tag_listing = `svn list svn://davebalmain.com/ferret/tags`
312
+ last_tag = tag_listing.split("\n").last
313
+ log = `svn log --stop-on-copy svn://davebalmain.com/ferret/tags/#{last_tag}`
314
+ first_log = log.split(/-------+/)[-2]
315
+ last_revision = /^r(\d+)\s+\|/.match(first_log)[1]
316
+ `svn log .. -rHEAD:#{last_revision}`
296
317
  end
297
318
 
298
- def reversion(fn)
299
- open(fn) do |ferret_in|
300
- open(fn + ".new", "w") do |ferret_out|
301
- ferret_in.each do |line|
302
- if line =~ /^ VERSION\s*=\s*/
303
- ferret_out.puts " VERSION = '#{PKG_VERSION}'"
304
- else
305
- ferret_out.puts line
319
+ desc "List changes since last release"
320
+ task :changes do
321
+ puts list_changes_since_last_release
322
+ end
323
+
324
+ if ENV['FERRET_DEV']
325
+ ##############################################################################
326
+ # Releasing
327
+ ##############################################################################
328
+
329
+ desc "Generate and upload a new release"
330
+ task :release => 'release:release'
331
+ namespace :release do
332
+ task :release => [:status_check, 'test:all', :package, :tag] do
333
+ say
334
+ say "**************************************************************"
335
+ say "* Release #{Ferret::VERSION} Complete."
336
+ say "* Packages ready to upload."
337
+ say "**************************************************************"
338
+ say
339
+ reversion("lib/ferret/version.rb")
340
+ end
341
+
342
+ # Validate that everything is ready to go for a release.
343
+ task :status_check do
344
+ # Are all source files checked in?
345
+ unless `svn -q --ignore-externals status` =~ /^$/
346
+ fail "'svn -q status' is not clean ... do you have unchecked-in files?"
347
+ end
348
+
349
+ say "No outstanding checkins found ... OK"
350
+ end
351
+
352
+ def reversion(fn)
353
+ new_version = nil
354
+ begin
355
+ print "Ferret is currently at #{Ferret::VERSION}. What version now? "
356
+ new_version = STDIN.gets.chomp!
357
+ end until prompt("Change to version #{new_version}?")
358
+
359
+ if ENV['RELTEST']
360
+ say "Would change the version in lib/ferret/version.rb from"
361
+ say " #{Ferret::VERSION} => #{new_version}"
362
+ say "and then commit the changes with the command"
363
+ say " svn ci -m \"Updated to version #{new_version}\" " +
364
+ "lib/ferret/version.rb"
365
+ else
366
+ open(fn) do |ferret_in|
367
+ open(fn + ".new", "w") do |ferret_out|
368
+ ferret_in.each do |line|
369
+ if line =~ /^ VERSION\s*=\s*/
370
+ ferret_out.puts " VERSION = '#{new_version}'"
371
+ else
372
+ ferret_out.puts line
373
+ end
374
+ end
375
+ end
306
376
  end
377
+ mv fn + ".new", fn
378
+ sh %{svn ci -m "Updated to version #{new_version}" lib/ferret/version.rb}
307
379
  end
308
380
  end
309
- end
310
- mv fn + ".new", fn
311
- end
312
381
 
313
- task :update_version => [:prerelease] do
314
- if PKG_VERSION == CURRENT_VERSION
315
- announce "No version change ... skipping version update"
316
- else
317
- announce "Updating Ferret version to #{PKG_VERSION}"
318
- reversion("lib/ferret_version.rb")
319
- if ENV['RELTEST']
320
- announce "Release Task Testing, skipping commiting of new version"
321
- else
322
- sh %{svn ci -m "Updated to version #{PKG_VERSION}" lib/ferret_version.rb}
382
+ # Tag all the SVN files with the latest release number
383
+ task :tag => :status_check do
384
+ reltag = "REL-#{Ferret::VERSION}"
385
+ say "Tagging SVN with [#{reltag}]"
386
+ if ENV['RELTEST']
387
+ say "Release Task Testing, skipping SVN tagging. Would do;"
388
+ say %{svn copy -m "creating release #{reltag}" svn://www.davebalmain.com/ferret/trunk svn://www.davebalmain.com/ferret/tags/#{reltag}}
389
+ else
390
+ sh %{svn copy -m "creating release #{reltag}" svn://www.davebalmain.com/ferret/trunk svn://www.davebalmain.com/ferret/tags/#{reltag}}
391
+ end
323
392
  end
393
+
324
394
  end
325
- end
326
395
 
327
- desc "Tag all the SVN files with the latest release number (REL=x.y.z)"
328
- task :tag => [:prerelease] do
329
- reltag = "REL-#{PKG_VERSION}"
330
- reltag << ENV['REUSE'] if ENV['REUSE']
331
- announce "Tagging SVN with [#{reltag}]"
332
- if ENV['RELTEST']
333
- announce "Release Task Testing, skipping SVN tagging. Would do the following;"
334
- announce %{svn copy -m "creating release #{reltag}" svn://www.davebalmain.com/ferret/trunk svn://www.davebalmain.com/ferret/tags/#{reltag}}
335
- else
336
- sh %{svn copy -m "creating release #{reltag}" svn://www.davebalmain.com/ferret/trunk svn://www.davebalmain.com/ferret/tags/#{reltag}}
396
+ ##############################################################################
397
+ # Publishing
398
+ ##############################################################################
399
+
400
+ namespace :publish do
401
+ PUBLISH_PROMPT = <<-EOF
402
+ Make sure you updated RELEASE_NOTES and RELEASE_CHANGES and that the
403
+ package exists. Are you sure you want to continue?
404
+ EOF
405
+ desc "Publish gem on rubyforge for download. Will only do the linux version"
406
+ task :release do
407
+ exit unless prompt(PUBLISH_PROMPT)
408
+ require 'rubyforge'
409
+ require 'rake/contrib/rubyforgepublisher'
410
+ version = Ferret::VERSION
411
+
412
+ packages = %w(gem tgz zip).map {|ext| "pkg/ferret-#{version}.#{ext}"}
413
+
414
+ rubyforge = RubyForge.new
415
+ rubyforge.login
416
+ rubyforge.add_release('ferret', 'ferret',
417
+ "ferret-#{version}", *packages)
418
+ end
419
+
420
+ desc "Publish the documentation"
421
+ task :docs => 'doc:rdoc' do
422
+ sh %{rsync -rzv --delete -e 'ssh -p 8900' doc/api/ davebalmain.com:/var/www/ferret/api}
423
+ end
424
+
425
+ desc "Publish the documentation and release"
426
+ task :all => [:doc, :release]
337
427
  end
338
428
  end
429
+
430
+
431
+
432
+
433
+ #
434
+ # In case I ever need to add another racc parser, here's how
435
+ #
436
+ # # Make Parsers ---------------------------------------------------------------
437
+ #
438
+ # RACC_SRC = FileList["lib/**/*.y"]
439
+ #
440
+ # task :parsers => RACC_OUT
441
+ # rule(/\.tab\.rb$/ => [proc {|tn| tn.sub(/\.tab\.rb$/, '.y')}]) do |t|
442
+ # sh "racc #{t.source}"
443
+ # end