friendlyfashion-ts-datetime-delta 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Pat Allan
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,59 @@
1
+ h1. Datetime Deltas for Thinking Sphinx
2
+
3
+ h2. Installation
4
+
5
+ You'll need Thinking Sphinx 1.3.0 or later.
6
+
7
+ <pre><code>gem install ts-datetime-delta</code></pre>
8
+
9
+ In your Gemfile, you can use it like so:
10
+
11
+ <pre><code>gem 'ts-datetime-delta', '~> 1.0.2',
12
+ :require => 'thinking_sphinx/deltas/datetime_delta'</code></pre>
13
+
14
+ Or if you're still on Rails 2, then put this in your @environment.rb@ file with the rest of your gem dependencies:
15
+
16
+ <pre><code>config.gem 'ts-datetime-delta',
17
+ :lib => 'thinking_sphinx/deltas/datetime_delta'
18
+ :version => '>= 1.0.0'</code></pre>
19
+
20
+ No matter which version of Rails, you'll need to add the following line to the bottom of your @Rakefile@:
21
+
22
+ <pre><code>require 'thinking_sphinx/deltas/datetime_delta/tasks'</code></pre>
23
+
24
+ h2. Usage
25
+
26
+ For the indexes you want to use this delta approach, make sure you set that up in their @define_index@ blocks.
27
+
28
+ <pre><code>define_index do
29
+ # ...
30
+
31
+ set_property :delta => :datetime
32
+ end</code></pre>
33
+
34
+ If you want to use a column other than @updated_at@, you can specify it using the @:delta_column@ option. The same goes for the threshold, which defaults to one day.
35
+
36
+ <pre><code>set_property :delta => :datetime,
37
+ :threshold => 1.hour,
38
+ :delta_column => :changed_at</code></pre>
39
+
40
+ Then, while your Rails application is running, you'll need to run the delta indexing rake task regularly - as often as your threshold, allowing for some time for the indexing to actually happen.
41
+
42
+ For example, if you're going to run the delta indexing task every hour, I would recommend setting your threshold to 70 minutes.
43
+
44
+ To ensure this rake task is called regularly, it's best to set it up as a recurring task via cron or similar tools.
45
+
46
+ <pre><code>rake thinking_sphinx:index:delta</code></pre>
47
+
48
+ The shorthand version is:
49
+
50
+ <pre><code>rake ts:in:delta</code></pre>
51
+
52
+ h2. Contributors
53
+
54
+ * "W. Andrew Loe III":http://andrewloe.com/ - Environment variable for disabling merging.
55
+ * "Kirill Maximov":http://kirblog.idetalk.com - Handling nil timestamp column values for toggled checks.
56
+
57
+ h2. Copyright
58
+
59
+ Copyright (c) 2009-2012 Pat Allan, and released under an MIT Licence.
@@ -0,0 +1,66 @@
1
+ Feature: Datetime Delta Indexing
2
+ In order to have delta indexing on frequently-updated sites
3
+ Developers
4
+ Should be able to use an existing datetime column to track changes
5
+
6
+ Scenario: Delta Index should not fire automatically
7
+ Given Sphinx is running
8
+ And I am searching on thetas
9
+ When I search for one
10
+ Then I should get 1 result
11
+
12
+ When I change the name of theta one to eleven
13
+ And I wait for Sphinx to catch up
14
+ And I search for one
15
+ Then I should get 1 result
16
+
17
+ When I search for eleven
18
+ Then I should get 0 results
19
+
20
+ Scenario: Delta Index should fire when jobs are run
21
+ Given Sphinx is running
22
+ And I am searching on thetas
23
+ When I search for two
24
+ Then I should get 1 result
25
+
26
+ When I change the name of theta two to twelve
27
+ And I wait for Sphinx to catch up
28
+ And I search for twelve
29
+ Then I should get 0 results
30
+
31
+ When I index the theta datetime delta
32
+ And I wait for Sphinx to catch up
33
+ And I search for twelve
34
+ Then I should get 1 result
35
+
36
+ When I search for two
37
+ Then I should get 0 results
38
+
39
+ Scenario: New records should be merged into the core index
40
+ Given Sphinx is running
41
+ And I am searching on thetas
42
+ When I search for thirteen
43
+ Then I should get 0 results
44
+
45
+ When I create a new theta named thirteen
46
+ And I search for thirteen
47
+ Then I should get 0 results
48
+
49
+ When I index the theta datetime delta
50
+ And I wait for Sphinx to catch up
51
+ And I search for thirteen
52
+ Then I should get 1 result
53
+
54
+ When I search for the document id of theta thirteen in the theta_core index
55
+ Then it should exist
56
+
57
+ Scenario: Deleting records
58
+ Given Sphinx is running
59
+ And I am searching on thetas
60
+ When I search for three
61
+ Then I should get 1 result
62
+
63
+ When I delete the theta named three
64
+ And I wait for Sphinx to catch up
65
+ And I search for three
66
+ Then I should get 0 results
@@ -0,0 +1,61 @@
1
+ Before do
2
+ $queries_executed = []
3
+
4
+ @model = nil
5
+ @method = :search
6
+ @query = ""
7
+ @conditions = {}
8
+ @with = {}
9
+ @without = {}
10
+ @with_all = {}
11
+ @options = {}
12
+ @results = nil
13
+ end
14
+
15
+ Given "Sphinx is running" do
16
+ ThinkingSphinx::Configuration.instance.controller.should be_running
17
+ end
18
+
19
+ Given /^I am searching on (.+)$/ do |model|
20
+ @model = model.gsub(/\s/, '_').singularize.camelize.constantize
21
+ end
22
+
23
+ When "I wait for Sphinx to catch up" do
24
+ sleep(0.25)
25
+ end
26
+
27
+ When /^I search for (\w+)$/ do |query|
28
+ @results = nil
29
+ @query = query
30
+ end
31
+
32
+ When /^I search for the document id of (\w+) (\w+) in the (\w+) index$/ do |model, name, index|
33
+ model = model.gsub(/\s/, '_').camelize.constantize
34
+ @id = model.find_by_name(name).sphinx_document_id
35
+ @index = index
36
+ end
37
+
38
+ Then /^I should get (\d+) results?$/ do |count|
39
+ results.length.should == count.to_i
40
+ end
41
+
42
+ Then "it should exist" do
43
+ ThinkingSphinx::Search.search_for_id(@id, @index).should == true
44
+ end
45
+
46
+ Then "it should not exist" do
47
+ ThinkingSphinx::Search.search_for_id(@id, @index).should == false
48
+ end
49
+
50
+ def results
51
+ @results ||= (@model || ThinkingSphinx).send(
52
+ @method,
53
+ @query,
54
+ @options.merge(
55
+ :conditions => @conditions,
56
+ :with => @with,
57
+ :without => @without,
58
+ :with_all => @with_all
59
+ )
60
+ )
61
+ end
@@ -0,0 +1,15 @@
1
+ When /^I index the theta datetime delta$/ do
2
+ Theta.sphinx_indexes.first.delta_object.delayed_index(Theta)
3
+ end
4
+
5
+ When /^I change the name of theta (\w+) to (\w+)$/ do |current, replacement|
6
+ Theta.find_by_name(current).update_attributes(:name => replacement)
7
+ end
8
+
9
+ When /^I create a new theta named (\w+)$/ do |name|
10
+ Theta.create(:name => name)
11
+ end
12
+
13
+ When /^I delete the theta named (\w+)$/ do |name|
14
+ Theta.find_by_name(name).destroy
15
+ end
@@ -0,0 +1,3 @@
1
+ username: root
2
+ host: localhost
3
+ password:
@@ -0,0 +1,10 @@
1
+ Theta.create :name => "one"
2
+ Theta.create :name => "two"
3
+ Theta.create :name => "three"
4
+ Theta.create :name => "four"
5
+ Theta.create :name => "five"
6
+ Theta.create :name => "six"
7
+ Theta.create :name => "seven"
8
+ Theta.create :name => "eight"
9
+ Theta.create :name => "nine"
10
+ Theta.create :name => "ten"
@@ -0,0 +1,5 @@
1
+ ActiveRecord::Base.connection.create_table :thetas, :force => true do |t|
2
+ t.column :name, :string, :null => false
3
+ t.column :created_at, :datetime, :null => false
4
+ t.column :updated_at, :datetime, :null => false
5
+ end
@@ -0,0 +1,17 @@
1
+ require 'rubygems'
2
+ require 'cucumber'
3
+ require 'spec/expectations'
4
+ require 'fileutils'
5
+ require 'active_record'
6
+
7
+ $:.unshift File.dirname(__FILE__) + '/../../lib'
8
+
9
+ require 'cucumber/thinking_sphinx/internal_world'
10
+
11
+ world = Cucumber::ThinkingSphinx::InternalWorld.new
12
+ world.configure_database
13
+
14
+ require "thinking_sphinx"
15
+ require 'thinking_sphinx/deltas/datetime_delta'
16
+
17
+ world.setup
@@ -0,0 +1,7 @@
1
+ class Theta < ActiveRecord::Base
2
+ define_index do
3
+ indexes :name, :sortable => true
4
+
5
+ set_property :delta => :datetime, :threshold => 1.hour
6
+ end
7
+ end
@@ -0,0 +1,145 @@
1
+ # Datetime Deltas for Thinking Sphinx
2
+ #
3
+ # This documentation is aimed at those reading the code. If you're looking for
4
+ # a guide to Thinking Sphinx and/or deltas, I recommend you start with the
5
+ # Thinking Sphinx site instead - or the README for this library at the very
6
+ # least.
7
+ #
8
+ # @author Patrick Allan
9
+ # @see http://ts.freelancing-gods.com Thinking Sphinx
10
+ #
11
+ class ThinkingSphinx::Deltas::DatetimeDelta < ThinkingSphinx::Deltas::DefaultDelta
12
+ attr_accessor :column, :threshold
13
+
14
+ def self.index
15
+ ThinkingSphinx.context.indexed_models.collect { |model|
16
+ model.constantize
17
+ }.select { |model|
18
+ model.define_indexes
19
+ model.delta_indexed_by_sphinx?
20
+ }.each do |model|
21
+ model.sphinx_indexes.select { |index|
22
+ index.delta? && index.delta_object.respond_to?(:delayed_index)
23
+ }.each { |index|
24
+ index.delta_object.delayed_index(index.model)
25
+ }
26
+ end
27
+ end
28
+
29
+ # Initialises the Delta object for the given index and settings. All handled
30
+ # by Thinking Sphinx, so you shouldn't need to call this method yourself in
31
+ # general day-to-day situations.
32
+ #
33
+ # @example
34
+ # ThinkingSphinx::Deltas::DatetimeDelta.new index,
35
+ # :delta_column => :updated_at,
36
+ # :threshold => 1.day
37
+ #
38
+ # @param [ThinkingSphinx::Index] index the index using this delta object
39
+ # @param [Hash] options a hash of options for the index
40
+ # @option options [Symbol] :delta_column (:updated_at) The column to use for
41
+ # tracking when a record has changed. Default to :updated_at.
42
+ # @option options [Integer] :threshold (1.day) The window of time to store
43
+ # changes for, in seconds. Defaults to one day.
44
+ #
45
+ def initialize(index, options = {})
46
+ @index = index
47
+ @column = options.delete(:delta_column) || :updated_at
48
+ @threshold = options.delete(:threshold) || 1.day
49
+ end
50
+
51
+ # Does absolutely nothing, beyond returning true. Thinking Sphinx expects
52
+ # this method, though, and we don't want to use the inherited behaviour from
53
+ # DefaultDelta.
54
+ #
55
+ # All the real indexing logic is done by the delayed_index method.
56
+ #
57
+ # @param [Class] model the ActiveRecord model to index.
58
+ # @param [ActiveRecord::Base] instance the instance of the given model that
59
+ # has changed. Optional.
60
+ # @return [Boolean] true
61
+ # @see #delayed_index
62
+ #
63
+ def index(model, instance = nil)
64
+ # do nothing
65
+ true
66
+ end
67
+
68
+ # Processes the delta index for the given model, and then merges the relevant
69
+ # core and delta indexes together. By default, the output of these indexer
70
+ # commands are printed to stdout. If you'd rather it didn't, set
71
+ # ThinkingSphinx.suppress_delta_output to true.
72
+ #
73
+ # @param [Class] model the ActiveRecord model to index
74
+ # @return [Boolean] true
75
+ #
76
+ def delayed_index(model)
77
+ config = ThinkingSphinx::Configuration.instance
78
+ rotate = ThinkingSphinx.sphinx_running? ? " --rotate" : ""
79
+
80
+ output = `#{config.bin_path}#{config.indexer_binary_name} --config #{config.config_file}#{rotate} #{model.delta_index_names.join(' ')}`
81
+
82
+
83
+ model.sphinx_indexes.select(&:delta?).each do |index|
84
+ output += `#{config.bin_path}#{config.indexer_binary_name} --config #{config.config_file}#{rotate} --merge #{index.core_name} #{index.delta_name} --merge-dst-range sphinx_deleted 0 0`
85
+ end unless ENV['DISABLE_MERGE'] == 'true'
86
+
87
+ puts output unless ThinkingSphinx.suppress_delta_output?
88
+
89
+ true
90
+ end
91
+
92
+ # Toggles the given instance to be flagged as part of the next delta indexing.
93
+ # For datetime deltas, this means do nothing at all.
94
+ #
95
+ # @param [ActiveRecord::Base] instance the instance to be toggled
96
+ #
97
+ def toggle(instance)
98
+ # do nothing
99
+ end
100
+
101
+ # Report whether a given instance is considered toggled (part of the next
102
+ # delta process). For datetime deltas, this is true if the delta column
103
+ # (updated_at by default) has a value within the threshold. Otherwise, false
104
+ # is returned.
105
+ #
106
+ # @param [ActiveRecord::Base] instance the instance to check
107
+ # @return [Boolean] True if within the threshold window, otherwise false.
108
+ #
109
+ def toggled(instance)
110
+ res = instance.send(@column)
111
+ res && (res > @threshold.ago)
112
+ end
113
+
114
+ # Returns the SQL query that resets the model data after a normal index. For
115
+ # datetime deltas, nothing needs to be done, so this method returns nil.
116
+ #
117
+ # @param [Class] model The ActiveRecord model that is requesting the query
118
+ # @return [NilClass] Always nil
119
+ #
120
+ def reset_query(model)
121
+ nil
122
+ end
123
+
124
+ # A SQL condition (as part of the WHERE clause) that limits the result set to
125
+ # just the delta data, or all data, depending on whether the toggled argument
126
+ # is true or not. For datetime deltas, the former value is a check on the
127
+ # delta column being within the threshold. In the latter's case, no condition
128
+ # is needed, so nil is returned.
129
+ #
130
+ # @param [Class] model The ActiveRecord model to generate the SQL condition
131
+ # for.
132
+ # @param [Boolean] toggled Whether the query should request delta documents or
133
+ # all documents.
134
+ # @return [String, NilClass] The SQL condition if the toggled version is
135
+ # requested, otherwise nil.
136
+ #
137
+ def clause(model, toggled)
138
+ if toggled
139
+ "#{model.quoted_table_name}.#{model.connection.quote_column_name(@column.to_s)}" +
140
+ " > #{adapter.time_difference(@threshold)}"
141
+ else
142
+ nil
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,15 @@
1
+ namespace :thinking_sphinx do
2
+ namespace :index do
3
+ desc "Index Thinking Sphinx datetime delta indices"
4
+ task :delta => :app_env do
5
+ ThinkingSphinx::Deltas::DatetimeDelta.index
6
+ end
7
+ end
8
+ end
9
+
10
+ namespace :ts do
11
+ namespace :in do
12
+ desc "Index Thinking Sphinx datetime delta indices"
13
+ task :delta => "thinking_sphinx:index:delta"
14
+ end
15
+ end
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,13 @@
1
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
2
+
3
+ require 'rubygems'
4
+ require 'rspec'
5
+
6
+ require 'active_support'
7
+ require 'active_support/time'
8
+ require 'thinking_sphinx'
9
+ require 'thinking_sphinx/deltas/datetime_delta'
10
+
11
+ RSpec.configure do |config|
12
+ #
13
+ end
@@ -0,0 +1,148 @@
1
+ require './spec/spec_helper'
2
+
3
+ describe ThinkingSphinx::Deltas::DatetimeDelta do
4
+ before :each do
5
+ @datetime_delta = ThinkingSphinx::Deltas::DatetimeDelta.new(
6
+ stub('index'), {}
7
+ )
8
+ end
9
+
10
+ describe '#index' do
11
+ it "should do nothing to the model" do
12
+ @datetime_delta.index(stub('model'))
13
+ end
14
+
15
+ it "should do nothing to the instance, if provided" do
16
+ @datetime_delta.index(stub('model'), stub('instance'))
17
+ end
18
+
19
+ it "should make no system calls" do
20
+ @datetime_delta.stub! :` => true
21
+ @datetime_delta.stub! :system => true
22
+
23
+ @datetime_delta.should_not_receive(:`)
24
+ @datetime_delta.should_not_receive(:system)
25
+
26
+ @datetime_delta.index(stub('model'), stub('instance'))
27
+ end
28
+
29
+ it "should return true" do
30
+ @datetime_delta.index(stub('model')).should be_true
31
+ end
32
+ end
33
+
34
+ describe '#delayed_index' do
35
+ let(:root) { File.expand_path File.dirname(__FILE__) + '/../../..' }
36
+
37
+ before :each do
38
+ @index = stub('index',
39
+ :delta? => true,
40
+ :core_name => 'foo_core',
41
+ :delta_name => 'foo_delta'
42
+ )
43
+ @model = stub('foo',
44
+ :name => 'foo',
45
+ :source_of_sphinx_index => @model,
46
+ :delta_index_names => ['foo_delta'],
47
+ :sphinx_indexes => [@index]
48
+ )
49
+
50
+ ThinkingSphinx.suppress_delta_output = false
51
+
52
+ @datetime_delta.stub! :` => ""
53
+ @datetime_delta.stub! :puts => nil
54
+ end
55
+
56
+ it "should process the delta index for the given model" do
57
+ @datetime_delta.should_receive(:`).
58
+ with("indexer --config /config/development.sphinx.conf foo_delta")
59
+
60
+ @datetime_delta.delayed_index(@model)
61
+ end
62
+
63
+ it "should merge the core and delta indexes for the given model" do
64
+ @datetime_delta.should_receive(:`).with("indexer --config /config/development.sphinx.conf --merge foo_core foo_delta --merge-dst-range sphinx_deleted 0 0")
65
+
66
+ @datetime_delta.delayed_index(@model)
67
+ end
68
+
69
+ it "should include --rotate if Sphinx is running" do
70
+ ThinkingSphinx.stub!(:sphinx_running? => true)
71
+ @datetime_delta.should_receive(:`) do |command|
72
+ command.should match(/\s--rotate\s/)
73
+ 'output'
74
+ end
75
+
76
+ @datetime_delta.delayed_index(@model)
77
+ end
78
+
79
+ it "should output the details by default" do
80
+ @datetime_delta.should_receive(:puts)
81
+
82
+ @datetime_delta.delayed_index(@model)
83
+ end
84
+
85
+ it "should hide the details if suppressing delta output" do
86
+ ThinkingSphinx.suppress_delta_output = true
87
+ @datetime_delta.should_not_receive(:puts)
88
+
89
+ @datetime_delta.delayed_index(@model)
90
+ end
91
+ end
92
+
93
+ describe '#toggle' do
94
+ it "should do nothing to the instance" do
95
+ @datetime_delta.toggle(stub('instance'))
96
+ end
97
+ end
98
+
99
+ describe '#toggled' do
100
+ it "should return true if the column value is more recent than the threshold" do
101
+ instance = stub('instance', :updated_at => 20.minutes.ago)
102
+ @datetime_delta.threshold = 30.minutes
103
+
104
+ @datetime_delta.toggled(instance).should be_true
105
+ end
106
+
107
+ it "should return false if the column value is older than the threshold" do
108
+ instance = stub('instance', :updated_at => 30.minutes.ago)
109
+ @datetime_delta.threshold = 20.minutes
110
+
111
+ @datetime_delta.toggled(instance).should be_false
112
+ end
113
+
114
+ it "should return false if the column value is null" do
115
+ instance = stub('instance', :updated_at => nil)
116
+ @datetime_delta.threshold = 20.minutes
117
+
118
+ @datetime_delta.toggled(instance).should be_false
119
+ end
120
+ end
121
+
122
+ describe '#reset_query' do
123
+ it "should be nil" do
124
+ @datetime_delta.reset_query(@model).should be_nil
125
+ end
126
+ end
127
+
128
+ describe '#clause' do
129
+ before :each do
130
+ @model = stub('model', :connection => stub('connection'))
131
+ @model.stub!(:quoted_table_name => '`foo`')
132
+ @model.connection.stub!(:quote_column_name => '`updated_at`')
133
+
134
+ @datetime_delta.stub!(
135
+ :adapter => stub('adapter', :time_difference => 'time_difference')
136
+ )
137
+ end
138
+
139
+ it "should return nil if not for the toggled results" do
140
+ @datetime_delta.clause(@model, false).should be_nil
141
+ end
142
+
143
+ it "should return only records within the threshold" do
144
+ @datetime_delta.clause(@model, true).
145
+ should == '`foo`.`updated_at` > time_difference'
146
+ end
147
+ end
148
+ end
metadata ADDED
@@ -0,0 +1,136 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: friendlyfashion-ts-datetime-delta
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.3
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Justas Janauskas
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-06-11 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: friendlyfashion-thinking-sphinx
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 1.3.8
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 1.3.8
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: 1.2.9
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 1.2.9
46
+ - !ruby/object:Gem::Dependency
47
+ name: yard
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: cucumber
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ description: Manage delta indexes via datetime columns for Thinking Sphinx
79
+ email: jjanauskas@gmail.com
80
+ executables: []
81
+ extensions: []
82
+ extra_rdoc_files:
83
+ - LICENSE
84
+ - README.textile
85
+ files:
86
+ - LICENSE
87
+ - README.textile
88
+ - lib/thinking_sphinx/deltas/datetime_delta.rb
89
+ - lib/thinking_sphinx/deltas/datetime_delta/tasks.rb
90
+ - features/step_definitions/common_steps.rb
91
+ - features/step_definitions/datetime_delta_steps.rb
92
+ - features/support/db/fixtures/thetas.rb
93
+ - features/support/db/migrations/create_thetas.rb
94
+ - features/support/env.rb
95
+ - features/support/models/theta.rb
96
+ - features/datetime_deltas.feature
97
+ - features/support/database.example.yml
98
+ - spec/spec.opts
99
+ - spec/spec_helper.rb
100
+ - spec/thinking_sphinx/deltas/datetime_delta_spec.rb
101
+ homepage: http://github.com/freelancing-god/ts-datetime-delta
102
+ licenses: []
103
+ post_install_message:
104
+ rdoc_options: []
105
+ require_paths:
106
+ - lib
107
+ required_ruby_version: !ruby/object:Gem::Requirement
108
+ none: false
109
+ requirements:
110
+ - - ! '>='
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ required_rubygems_version: !ruby/object:Gem::Requirement
114
+ none: false
115
+ requirements:
116
+ - - ! '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ requirements: []
120
+ rubyforge_project:
121
+ rubygems_version: 1.8.24
122
+ signing_key:
123
+ specification_version: 3
124
+ summary: Thinking Sphinx - Datetime Deltas
125
+ test_files:
126
+ - features/step_definitions/common_steps.rb
127
+ - features/step_definitions/datetime_delta_steps.rb
128
+ - features/support/db/fixtures/thetas.rb
129
+ - features/support/db/migrations/create_thetas.rb
130
+ - features/support/env.rb
131
+ - features/support/models/theta.rb
132
+ - features/datetime_deltas.feature
133
+ - features/support/database.example.yml
134
+ - spec/spec.opts
135
+ - spec/spec_helper.rb
136
+ - spec/thinking_sphinx/deltas/datetime_delta_spec.rb