Skip to content
This repository
Newer
Older
100644 351 lines (248 sloc) 14.235 kb
6449698e » yourewelcome
2008-09-06 Released verversion 0.9.7
1 = Searchgasm
aa5b90a3 » yourewelcome
2008-08-25 First commit
2
99680568 » yourewelcome
2008-08-27 Updated readme
3 Searchgasm is orgasmic. Maybe not orgasmic, but you will get aroused. So go grab a towel and let's dive in.
1f7251cf » yourewelcome
2008-08-27 Added association_collection
4
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
5 <b>Searchgasm's inspiration comes right from ActiveRecord. ActiveRecord lets you create objects that represent a record in the database, so why can't you create objects that represent searching the database? Now you can! It's searching, ordering, and pagination all in one.</b>
c703fbe4 » yourewelcome
2008-09-02 Updated readme
6
39666522 » yourewelcome
2008-09-08 Hardened some test, added more documentation
7 == Helpful links
c4a3956d » yourewelcome
2008-09-04 Updated helpers, cleaned up code, started documentation
8
85bfebfe » yourewelcome
2008-09-07 Updated readme, Github has problems parsing rdoc
9 * <b>Documentation:</b> http://searchgasm.rubyforge.org
10 * <b>Easy pagination, ordering, and searching tutorial:</b> http://www.binarylogic.com/2008/9/7/tutorial-pagination-ordering-and-searching-with-searchgasm
4c13dd08 » yourewelcome
2008-09-11 Release v1.0.1 (see changelog)
11 * <b>Live example of the tutorial above (with source):</b> http://searchgasm_example.binarylogic.com
d5ef895f » yourewelcome
2008-09-21 Added remote_helper config option
12 * <b>Bugs / feature suggestions:</b> http://binarylogic.lighthouseapp.com/projects/16601-searchgasm
6449698e » yourewelcome
2008-09-06 Released verversion 0.9.7
13
14 == Install and use
15
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
16 sudo gem install searchgasm
6449698e » yourewelcome
2008-09-06 Released verversion 0.9.7
17
3b7f5aec » yourewelcome
2008-09-07 Updated installation guide in readme
18 For rails
6449698e » yourewelcome
2008-09-06 Released verversion 0.9.7
19
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
20 $ cd vendor/plugins
21 $ sudo gem unpack searchgasm
6449698e » yourewelcome
2008-09-06 Released verversion 0.9.7
22
23 Or as a plugin
24
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
25 script/plugin install git://github.com/binarylogic/searchgasm.git
6449698e » yourewelcome
2008-09-06 Released verversion 0.9.7
26
27 Now try out some of the examples below:
28
29 <b>For all examples, let's assume the following relationships: User => Orders => Line Items</b>
30
39666522 » yourewelcome
2008-09-08 Hardened some test, added more documentation
31 == Simple Searching Example
32
33 User.all(
34 :conditions => {
35 :first_name_contains => "Ben", # first_name like '%Ben%'
36 :email_ends_with => "binarylogic.com" # email like '%binarylogic.com'
37 },
38 :per_page => 20, # limit 20
39 :page => 3, # offset 40, which starts us on page 3
40 :order_as => "ASC",
41 :order_by => {:user_group => :name} # order user_groups.name ASC
42 )
43
44 same as above, but object based
45
46 search = User.new_search
47 search.conditions.first_name_contains = "Ben"
48 search.conditions.email_ends_with = "binarylogic.com"
49 search.per_page = 20
50 search.page = 3
51 search.order_as = "ASC"
52 search.order_by = {:user_group => :name}
53 search.all
54
55 In both examples, instead of using the "all" method you could use any search method: first, find(:all), find(:first), count, sum, average, etc, just like ActiveRecord.
56
57 == The beauty of searchgasm, integration into rails
6449698e » yourewelcome
2008-09-06 Released verversion 0.9.7
58
07f8a72f » Ben Johnson
2008-09-12 Released v1.0.2
59 Using Searchgasm in rails is the best part, because rails has all kinds of nifty methods to make dealing with ActiveRecord objects quick and easy, especially with forms. So let's take advantage of them! That's the idea behind this plugin. Searchgasm is searching, ordering, and pagination all rolled into one simple plugin. Take all of that pagination and searching cruft out of your models and controllers, and let Searchgasm handle it. Check it out:
24a7d880 » yourewelcome
2008-09-02 Updated readme
60
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
61 # app/controllers/users_controller.rb
62 def index
63 @search = User.new_search(params[:search])
64 @users, @users_count = @search.all, @search.count
65 end
24a7d880 » yourewelcome
2008-09-02 Updated readme
66
07f8a72f » Ben Johnson
2008-09-12 Released v1.0.2
67 Now your view:
dc39ad7b » yourewelcome
2008-09-07 Updated readme
68
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
69 # app/views/users/index.html.haml
70 - form_for @search do |f|
71 - f.fields_for @search.conditions do |users|
72 = users.text_field :first_name_contains
73 = users.calendar_date_select :created_after # nice rails plugin for replacing date_select
74 - users.fields_for users.object.orders do |orders|
75 = orders.select :total_gt, (1..100)
76 = f.submit "Search"
77
4c13dd08 » yourewelcome
2008-09-11 Release v1.0.1 (see changelog)
78 - if @users_count > 0
79 %table
80 %tr
81 %th= order_by_link :account => :name
82 %th= order_by_link :first_name
83 %th= order_by_link :last_name
84 %th= order_by_link :email
85 - @users.each do |user|
6ad15264 » yourewelcome
2008-09-09 Released v1.0
86 %tr
87 %td= user.account? ? user.account.name : "-"
88 %td= user.first_name
89 %td= user.last_name
90 %td= user.email
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
91
4c13dd08 » yourewelcome
2008-09-11 Release v1.0.1 (see changelog)
92 Per page:
93 = per_page_select
94 Page:
95 = page_select
96 - else
97 No users were found.
24a7d880 » yourewelcome
2008-09-02 Updated readme
98
07f8a72f » Ben Johnson
2008-09-12 Released v1.0.2
99 Things to note in this view:
100
101 1. Passing a search object right into form\_for and fields\_for
102 2. The built in conditions for each column and how you can traverse the relationships and set conditions on them
103 3. The order_by_link helper
104 4. The page_select and per_page_select helpers
105 5. All of your search logic is in 1 spot: your view. Nice and DRY.
106
4c13dd08 » yourewelcome
2008-09-11 Release v1.0.1 (see changelog)
107 <b>See my tutorial on this example: http://www.binarylogic.com/2008/9/7/tutorial-pagination-ordering-and-searching-with-searchgasm</b>
4065f0db » yourewelcome
2008-09-02 Updated readme
108
6449698e » yourewelcome
2008-09-06 Released verversion 0.9.7
109 == Exhaustive Example w/ Object Based Searching (great for form_for or fields_for)
bec7f7dd » yourewelcome
2008-08-29 Reffeactored and changed everything, much nicer
110
39666522 » yourewelcome
2008-09-08 Hardened some test, added more documentation
111 # Start a new search
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
112 @search = User.new_search(
113 :conditions => {
114 :first_name_contains => "Ben",
115 :age_gt => 18,
116 :orders => {:total_lt => 100}
117 },
118 :per_page => 20,
119 :page => 2,
120 :order_by => {:orders => :total},
121 :order_as => "DESC"
122 )
123
124 # Set local conditions
125 @search.conditions.email_ends_with = "binarylogic.com"
126
127 # Set conditions on relationships
128 @search.conditions.oders.line_items.created_after = Time.now # can traverse through all relationships
129
130 # Set options
131 @search.per_page = 50 # overrides the 20 set above
132 @search.order_by = [:first_name, {:user_group => :name}] # order by first name and then by the user group's name it belongs to
133 @search.order_as = "ASC"
134
135 # Set ANY of the ActiveRecord options
136 @search.group = "last_name"
137 @search.readonly = true
138 # ... see ActiveRecord documentation
139
140 # Return results just like ActiveRecord
141 @search.all
142 @search.first
dcf6ebf8 » yourewelcome
2008-09-02 Updated readme
143
c703fbe4 » yourewelcome
2008-09-02 Updated readme
144 Take the @search object and pass it right into form\_for or fields\_for (see above).
cf237603 » yourewelcome
2008-09-01 Added tests, new features, and improved readme
145
6449698e » yourewelcome
2008-09-06 Released verversion 0.9.7
146 == Calculations
cf237603 » yourewelcome
2008-09-01 Added tests, new features, and improved readme
147
148 Using the object from above:
149
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
150 @search.average('id')
2badebdb » yourewelcome
2008-09-18 Released v1.0.4 (see changelog)
151 @search.count # ignores limit and offset
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
152 @search.maximum('id')
153 @search.minimum('id')
154 @search.sum('id')
155 @search.calculate(:sum, 'id')
156 # ...any of the above calculations, see ActiveRecord documentation on calculations
1f7251cf » yourewelcome
2008-08-27 Added association_collection
157
cf237603 » yourewelcome
2008-09-01 Added tests, new features, and improved readme
158 Or do it from your model:
159
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
160 User.count(:conditions => {:first_name_contains => "Ben"})
161 User.sum('id', :conditions => {:first_name_contains => "Ben"})
162 # ... all other calcualtions, etc.
cf237603 » yourewelcome
2008-09-01 Added tests, new features, and improved readme
163
6449698e » yourewelcome
2008-09-06 Released verversion 0.9.7
164 == Different ways to search, take your pick
7db3b5b3 » yourewelcome
2008-08-28 Updated readme
165
bec7f7dd » yourewelcome
2008-08-29 Reffeactored and changed everything, much nicer
166 Any of the options used in the above example can be used in these, but for the sake of brevity I am only using a few:
7db3b5b3 » yourewelcome
2008-08-28 Updated readme
167
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
168 User.all(:conditions => {:age_gt => 18}, :per_page => 20)
7db3b5b3 » yourewelcome
2008-08-28 Updated readme
169
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
170 User.first(:conditions => {:age_gt => 18}, :per_page => 20)
7db3b5b3 » yourewelcome
2008-08-28 Updated readme
171
2ec93e32 » yourewelcome
2008-09-08 Released v 9.0.9.10. Some small bug fixes
172 User.find(:all, :conditions => {:age_gt => 18}, :per_page => 20)
7db3b5b3 » yourewelcome
2008-08-28 Updated readme
173
2ec93e32 » yourewelcome
2008-09-08 Released v 9.0.9.10. Some small bug fixes
174 User.find(:first, :conditions => {:age_gt => 18}, :per_page => 20)
7db3b5b3 » yourewelcome
2008-08-28 Updated readme
175
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
176 search = User.new_search(:conditions => {:age_gt => 18}) # build_search is an alias
177 search.conditions.first_name_contains = "Ben"
178 search.per_page = 20
179 search.all
fa5f3b78 » yourewelcome
2008-09-18 Add "any" option for conditions to join with "or" instead of "and"
180
181 == Match ANY or ALL of the conditions
182
183 As you saw above, the nice thing about Searchgasm is it's integration with forms. I designed the "any" option so that forms can set this as well, just like a condition.
184
185 search = User.new_search(:conditions => {:age_gt => 18})
186 search.conditions.first_name_contains = "Ben"
187 search.conditions.any = true # can set this to "true" or "1" or "yes"
188 search.all # will join all conditions with "or" instead of "and"
189 # ... all operations above are available
bec7f7dd » yourewelcome
2008-08-29 Reffeactored and changed everything, much nicer
190
6449698e » yourewelcome
2008-09-06 Released verversion 0.9.7
191 == Scoped searching
bec7f7dd » yourewelcome
2008-08-29 Reffeactored and changed everything, much nicer
192
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
193 @current_user.orders.find(:all, :conditions => {:total_lte => 500})
194 @current_user.orders.count(:conditions => {:total_lte => 500})
195 @current_user.orders.sum('total', :conditions => {:total_lte => 500})
196
4c13dd08 » yourewelcome
2008-09-11 Release v1.0.1 (see changelog)
197 search = @current_user.orders.build_search(:conditions => {:total_lte => 500})
bec7f7dd » yourewelcome
2008-08-29 Reffeactored and changed everything, much nicer
198
6449698e » yourewelcome
2008-09-06 Released verversion 0.9.7
199 == Searching trees
cf237603 » yourewelcome
2008-09-01 Added tests, new features, and improved readme
200
201 For tree data structures you get a few nifty methods. Let's assume Users is a tree data structure.
202
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
203 # Child of
204 User.all(:conditions => {:child_of => User.roots.first})
205 User.all(:conditions => {:child_of => User.roots.first.id})
206
207 # Sibling of
208 User.all(:conditions => {:sibling_of => User.roots.first})
209 User.all(:conditions => {:sibling_of => User.roots.first.id})
210
211 # Descendant of (includes all recursive children: children, grand children, great grand children, etc)
212 User.all(:conditions => {:descendant_of => User.roots.first})
213 User.all(:conditions => {:descendant_of => User.roots.first.id})
214
215 # Inclusive descendant_of. Same as above but includes the root
216 User.all(:conditions => {:inclusive_descendant_of => User.roots.first})
217 User.all(:conditions => {:inclusive_descendant_of => User.roots.first.id})
218
cf237603 » yourewelcome
2008-09-01 Added tests, new features, and improved readme
219
c06d174f » yourewelcome
2008-09-18 Released v1.0.3 (see changelog)
220 == Scope support
bec7f7dd » yourewelcome
2008-08-29 Reffeactored and changed everything, much nicer
221
c06d174f » yourewelcome
2008-09-18 Released v1.0.3 (see changelog)
222 Not only can you use searchgasm when searching, but you can use it when using scopes.
7db3b5b3 » yourewelcome
2008-08-28 Updated readme
223
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
224 class User < ActiveRecord::Base
225 named_scope :sexy, :conditions => {:first_name => "Ben", email_ends_with => "binarylogic.com"}, :per_page => 20
226 end
c06d174f » yourewelcome
2008-09-18 Released v1.0.3 (see changelog)
227
228 or
229
230 class User < ActiveRecord::Base
231 def self.find_sexy
232 with_scope(:find => {:conditions => {:first_name => "Ben", email_ends_with => "binarylogic.com"}, :per_page => 20}) do
233 all
234 end
235 end
236 end
590f51e6 » yourewelcome
2008-08-27 Updated readme
237
6449698e » yourewelcome
2008-09-06 Released verversion 0.9.7
238 == Always use protection...against SQL injections
bec7f7dd » yourewelcome
2008-08-29 Reffeactored and changed everything, much nicer
239
6a8e5f76 » yourewelcome
2008-09-24 Released v1.2.0
240 If there is one thing we all know, it's to always use protection against SQL injections. That's why searchgasm protects you by default. The new\_search methods protect mass assignments by default (instantiation and search.options = {}). This means that various checks are done to ensure it is not possible to perform any type of SQL injection during mass assignments. But this also limits how you can search, meaning you can't write raw SQL. If you want to be daring and search without protection, all that you have to do is add ! to the end of the method: new\_search!.
590f51e6 » yourewelcome
2008-08-27 Updated readme
241
6449698e » yourewelcome
2008-09-06 Released verversion 0.9.7
242 === Protected from SQL injections
99680568 » yourewelcome
2008-08-27 Updated readme
243
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
244 search = Account.new_search(params[:search])
ae22512e » yourewelcome
2008-08-25 Updated readme
245
6449698e » yourewelcome
2008-09-06 Released verversion 0.9.7
246 === *NOT* protected from SQL injections
bec7f7dd » yourewelcome
2008-08-29 Reffeactored and changed everything, much nicer
247
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
248 accounts = Account.find(params[:search])
249 accounts = Account.all(params[:search])
250 account = Account.first(params[:search])
251 search = Account.new_search!(params[:search])
33f192ea » yourewelcome
2008-09-02 Ehanced protection
252
6ad15264 » yourewelcome
2008-09-09 Released v1.0
253 I'm sure you already knew this, but it's tempting to do this when you can pass the params hash right into these methods.
254
6a8e5f76 » yourewelcome
2008-09-24 Released v1.2.0
255 Lesson learned: use new\_search when passing in params as *ANY* of the options.
aa5b90a3 » yourewelcome
2008-08-25 First commit
256
6449698e » yourewelcome
2008-09-06 Released verversion 0.9.7
257 == Available Conditions
ae22512e » yourewelcome
2008-08-25 Updated readme
258
1271b7a6 » yourewelcome
2008-08-31 Added gemspec
259 Depending on the type, each column comes preloaded with a bunch of nifty conditions:
ae22512e » yourewelcome
2008-08-25 Updated readme
260
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
261 all columns
262 => :equals, :does_not_equal
bec7f7dd » yourewelcome
2008-08-29 Reffeactored and changed everything, much nicer
263
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
264 :string, :text
265 => :begins_with, :contains, :keywords, :ends_with
bec7f7dd » yourewelcome
2008-08-29 Reffeactored and changed everything, much nicer
266
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
267 :integer, :float, :decimal,:datetime, :timestamp, :time, :date
268 => :greater_than, :greater_than_or_equal_to, :less_than, :less_than_or_equal_to
ae22512e » yourewelcome
2008-08-25 Updated readme
269
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
270 tree data structures (see above "searching trees")
271 => :child_of, :sibling_of, :descendant_of, :inclusive_descendant_of
cf237603 » yourewelcome
2008-09-01 Added tests, new features, and improved readme
272
7db3b5b3 » yourewelcome
2008-08-28 Updated readme
273 Some of these conditions come with aliases, so you have your choice how to call the conditions. For example you can use "greater\_than" or "gt":
1f7251cf » yourewelcome
2008-08-27 Added association_collection
274
39666522 » yourewelcome
2008-09-08 Hardened some test, added more documentation
275 :equals => :is
276 :does_not_equal => :is_not, :not
9232844c » yourewelcome
2008-09-22 Released v1.1.2 (see changelog)
277 :is_nil => :nil, :is_null, :null
278 :is_blank => :blank
39666522 » yourewelcome
2008-09-08 Hardened some test, added more documentation
279 :begins_with => :starts_with, :sw, :bw, :start
280 :contains => :like, :has
281 :ends_with => :ew, :ends, :end
282 :greater_than => :gt, :after
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
283 :greater_than_or_equal_to => :at_least, :gte
39666522 » yourewelcome
2008-09-08 Hardened some test, added more documentation
284 :keywords => :kwords, :kw
285 :less_than => :lt, :before
286 :less_than_or_equal_to => :at_most, :lte
4fb59294 » yourewelcome
2008-08-27 Added new features, cleaned up readme
287
6449698e » yourewelcome
2008-09-06 Released verversion 0.9.7
288 For more information on each condition see Searchgasm::Condition. Each condition has it's own class and the source is pretty simple and self explanatory.
289
290 === Enhanced searching and blacklisted words
bec7f7dd » yourewelcome
2008-08-29 Reffeactored and changed everything, much nicer
291
292 You will notice above there is "contains" and "keywords". The difference is that "keywords" is an enhanced search. It acts like a real keyword search. It finds those keywords, in any order, and blacklists meaningless words such as "and", "the", etc. "contains" finds the EXACT string in the column you are searching, spaces and all.
293
6449698e » yourewelcome
2008-09-06 Released verversion 0.9.7
294 === Roll your own conditions
e8274f3f » yourewelcome
2008-09-03 Added example in readme for adding your own conditions
295
296 I didn't include this function because its MySQL specific, and it's probably rarely used, but MySQL supports a "SOUNDS LIKE" function.
297
298 I want to use it, so let's add it:
299
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
300 # config/initializers/searchgasm.rb
301 # Actual function for MySQL databases only
302 class SoundsLike < Searchgasm::Condition::Base
303 class << self
304 # I pass you the column, you tell me what you want the method to be called.
305 # If you don't want to add this condition for that column, return nil
07f8a72f » Ben Johnson
2008-09-12 Released v1.0.2
306 # It defaults to "#{column.name}_sounds_like" (using the class name). So if thats what you want you don't even need to do this.
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
307 def name_for_column(column)
308 super
e8274f3f » yourewelcome
2008-09-03 Added example in readme for adding your own conditions
309 end
310
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
311 # Only do this if you want aliases for your condition
312 def aliases_for_column(column)
313 ["#{column.name}_sounds", "#{column.name}_similar_to"]
314 end
315 end
316
317 # You can return an array or a string. NOT a hash, because all of these conditions
318 # need to eventually get merged together. The array or string can be anything you would put in
07f8a72f » Ben Johnson
2008-09-12 Released v1.0.2
319 # the :conditions option for ActiveRecord::Base.find(). Also, for a list of methods / variables you can use check out
320 # Searchgasm::Condition::Base.
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
321 def to_conditions(value)
322 ["#{quoted_table_name}.#{quoted_column_name} SOUNDS LIKE ?", value]
323 end
324 end
325
326 Searchgasm::Conditions::Base.register_condition(SoundsLike)
e8274f3f » yourewelcome
2008-09-03 Added example in readme for adding your own conditions
327
328 Now test it out:
329
1d815aa0 » yourewelcome
2008-09-07 Fixed bug when setting per_page to nil
330 search = User.new_search
331 search.conditions.first_name_sounds_like = "Ben"
332 search.all # will return any user that has a first name that sounds like "Ben"
e8274f3f » yourewelcome
2008-09-03 Added example in readme for adding your own conditions
333
6449698e » yourewelcome
2008-09-06 Released verversion 0.9.7
334 Pretty nifty, huh? You can create any condition ultimately creating any SQL you want. The sky is the limit. For more information see Searchgasm::Condition::Base
335
39666522 » yourewelcome
2008-09-08 Hardened some test, added more documentation
336 == Under the hood
337
c06d174f » yourewelcome
2008-09-18 Released v1.0.3 (see changelog)
338 I'm a big fan of understanding what I'm using, so here's a quick explanation: The design behind this plugin is pretty simple and I had 1 main rule when developing this:
339
340 ActiveRecord should never know about Searchgasm
341
342 What that rule means is that any options you pass when searching get "sanitized" down into options ActiveRecord can understand. Searchgasm serves as a transparent filter between you and ActiveRecord. It doesn't dig into the ActiveRecord internals, it only uses what is publicly available. It jumps in and helps out <em>only</em> when needed, otherwise it sits back and stays completely out of the way. Between that and the extensive tests, this is a solid and fast plugin.
39666522 » yourewelcome
2008-09-08 Hardened some test, added more documentation
343
6449698e » yourewelcome
2008-09-06 Released verversion 0.9.7
344 == Credits
4fb59294 » yourewelcome
2008-08-27 Added new features, cleaned up readme
345
13202545 » yourewelcome
2008-09-06 Fixed some probs in readme
346 Author: {Ben Johnson}[http://github.com/binarylogic] of {Binary Logic}[http://www.binarylogic.com]
9b5304b3 » yourewelcome
2008-08-27 Updated readme
347
13202545 » yourewelcome
2008-09-06 Fixed some probs in readme
348 Credit to {Zack Ham}[http://github.com/zackham] and {Robert Malko}[http://github.com/malkomalko/] for helping with feature suggestions.
aa5b90a3 » yourewelcome
2008-08-25 First commit
349
350
13202545 » yourewelcome
2008-09-06 Fixed some probs in readme
351 Copyright (c) 2008 {Ben Johnson}[http://github.com/binarylogic] of {Binary Logic}[http://www.binarylogic.com], released under the MIT license
Something went wrong with that request. Please try again.