lucid_works 0.6.29 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.rvmrc +1 -1
- data/Rakefile +25 -0
- data/config/locales/en.yml +171 -83
- data/lib/lucid_works/associations/has_many.rb +2 -2
- data/lib/lucid_works/associations/has_one.rb +1 -1
- data/lib/lucid_works/associations/proxy.rb +3 -3
- data/lib/lucid_works/associations.rb +2 -2
- data/lib/lucid_works/base.rb +21 -48
- data/lib/lucid_works/collection/click.rb +17 -0
- data/lib/lucid_works/collection/settings.rb +0 -1
- data/lib/lucid_works/collection.rb +22 -3
- data/lib/lucid_works/crawler.rb +13 -0
- data/lib/lucid_works/datasource/history.rb +5 -9
- data/lib/lucid_works/datasource/status.rb +8 -11
- data/lib/lucid_works/datasource.rb +67 -32
- data/lib/lucid_works/datasource_property.rb +18 -0
- data/lib/lucid_works/datasource_type.rb +23 -0
- data/lib/lucid_works/exceptions.rb +1 -0
- data/lib/lucid_works/field.rb +43 -2
- data/lib/lucid_works/fieldtype.rb +28 -0
- data/lib/lucid_works/gem_version.rb +1 -1
- data/lib/lucid_works/jdbcdriver.rb +30 -0
- data/lib/lucid_works/role.rb +59 -0
- data/lib/lucid_works/schema/attribute.rb +86 -0
- data/lib/lucid_works/schema/boolean_attribute.rb +34 -0
- data/lib/lucid_works/schema/custom_attribute.rb +15 -0
- data/lib/lucid_works/schema/integer_attribute.rb +32 -0
- data/lib/lucid_works/schema/iso8601_attribute.rb +31 -0
- data/lib/lucid_works/schema/string_attribute.rb +22 -0
- data/lib/lucid_works/schema.rb +66 -97
- data/lib/lucid_works/server.rb +14 -0
- data/lib/lucid_works.rb +12 -0
- data/spec/fixtures/fake_file_ds_to_be_deleted/.gitkeep +0 -0
- data/spec/fixtures/fake_file_ds_to_be_updated/.gitkeep +0 -0
- data/spec/fixtures/fake_file_ds_to_get_index_of/.gitkeep +0 -0
- data/spec/fixtures/fake_file_ds_to_get_schedule_of/.gitkeep +0 -0
- data/spec/fixtures/fake_file_ds_to_get_status_of/.gitkeep +0 -0
- data/spec/fixtures/fake_file_ds_to_mess_with_job_of/.gitkeep +0 -0
- data/spec/fixtures/fake_file_ds_to_test_progress/.gitkeep +0 -0
- data/spec/lib/lucid_works/associations/has_many_spec.rb +4 -3
- data/spec/lib/lucid_works/associations/has_one_spec.rb +4 -3
- data/spec/lib/lucid_works/base_spec.rb +110 -62
- data/spec/lib/lucid_works/collection/activity/history_spec.rb +1 -1
- data/spec/lib/lucid_works/collection_spec.rb +17 -17
- data/spec/lib/lucid_works/datasource/history_spec.rb +4 -4
- data/spec/lib/lucid_works/datasource/status_spec.rb +7 -7
- data/spec/lib/lucid_works/datasource_spec.rb +9 -8
- data/spec/lib/lucid_works/field_spec.rb +101 -2
- data/spec/lib/lucid_works/fieldtype_spec.rb +156 -0
- data/spec/lib/lucid_works/schema/attribute_spec.rb +136 -0
- data/spec/lib/lucid_works/schema_spec.rb +53 -27
- data/spec/spec_helper.rb +3 -50
- data/spec/support/active_model_lint.rb +21 -0
- data/spec/support/lucid_works.rb +52 -0
- metadata +36 -2
data/lib/lucid_works/server.rb
CHANGED
@@ -21,5 +21,19 @@ module LucidWorks
|
|
21
21
|
def uri
|
22
22
|
@host + @path
|
23
23
|
end
|
24
|
+
alias :rest_api_uri :uri
|
25
|
+
|
26
|
+
def crawler(name)
|
27
|
+
crawlers.detect { |c| c.name == name }
|
28
|
+
end
|
29
|
+
|
30
|
+
def solr_uri
|
31
|
+
"#{host}/solr/"
|
32
|
+
end
|
33
|
+
|
34
|
+
# Location where raw log files may be retrieved
|
35
|
+
def logs_url
|
36
|
+
"#{host}/logs/"
|
37
|
+
end
|
24
38
|
end
|
25
39
|
end
|
data/lib/lucid_works.rb
CHANGED
@@ -25,11 +25,18 @@ require 'lucid_works/associations/has_many'
|
|
25
25
|
require 'lucid_works/server'
|
26
26
|
require 'lucid_works/base'
|
27
27
|
require 'lucid_works/schema'
|
28
|
+
require 'lucid_works/schema/attribute'
|
29
|
+
require 'lucid_works/schema/boolean_attribute'
|
30
|
+
require 'lucid_works/schema/custom_attribute'
|
31
|
+
require 'lucid_works/schema/integer_attribute'
|
32
|
+
require 'lucid_works/schema/iso8601_attribute'
|
33
|
+
require 'lucid_works/schema/string_attribute'
|
28
34
|
|
29
35
|
require 'lucid_works/collection'
|
30
36
|
require 'lucid_works/collection/info'
|
31
37
|
require 'lucid_works/collection/index'
|
32
38
|
require 'lucid_works/collection/settings'
|
39
|
+
require 'lucid_works/collection/click'
|
33
40
|
require 'lucid_works/activity'
|
34
41
|
require 'lucid_works/activity/status'
|
35
42
|
require 'lucid_works/activity/history'
|
@@ -41,7 +48,12 @@ require 'lucid_works/datasource/history'
|
|
41
48
|
require 'lucid_works/datasource/schedule'
|
42
49
|
require 'lucid_works/datasource/crawldata'
|
43
50
|
require 'lucid_works/datasource/job'
|
51
|
+
require 'lucid_works/datasource_type'
|
52
|
+
require 'lucid_works/datasource_property'
|
44
53
|
require 'lucid_works/field'
|
54
|
+
require 'lucid_works/fieldtype'
|
55
|
+
require 'lucid_works/jdbcdriver'
|
56
|
+
require 'lucid_works/role'
|
45
57
|
require 'lucid_works/synonym'
|
46
58
|
require 'lucid_works/logs'
|
47
59
|
require 'lucid_works/logs/query'
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -129,22 +129,23 @@ describe LucidWorks::Associations::HasMany do
|
|
129
129
|
context "when save fails" do
|
130
130
|
before do
|
131
131
|
@mock_target.should_receive(:save).and_return(false)
|
132
|
+
@mock_target.stub_chain(:errors, :full_messages) { ['an error'] }
|
132
133
|
end
|
133
134
|
|
134
135
|
it "should raise an error" do
|
135
136
|
lambda {
|
136
137
|
@owner.targets.create!(:foo => :bar)
|
137
|
-
}.should raise_error
|
138
|
+
}.should raise_error(LucidWorks::RecordInvalid)
|
138
139
|
end
|
139
140
|
end
|
140
141
|
end
|
141
142
|
|
142
|
-
context "with options :
|
143
|
+
context "with options :retrieveable_en_masse => true" do
|
143
144
|
before :all do
|
144
145
|
class ::AllableTarget < LucidWorks::Base
|
145
146
|
end
|
146
147
|
class ::Owner
|
147
|
-
has_many :allable_targets, :
|
148
|
+
has_many :allable_targets, :retrieveable_en_masse => true
|
148
149
|
end
|
149
150
|
end
|
150
151
|
|
@@ -109,12 +109,13 @@ describe LucidWorks::Associations::HasOne do
|
|
109
109
|
context "when save fails" do
|
110
110
|
before do
|
111
111
|
@mock_target.should_receive(:save).and_return(false)
|
112
|
+
@mock_target.stub_chain(:errors, :full_messages) { ['an error'] }
|
112
113
|
end
|
113
114
|
|
114
115
|
it "should raise an error" do
|
115
116
|
lambda {
|
116
117
|
@owner.target.create!(:foo => :bar)
|
117
|
-
}.should raise_error
|
118
|
+
}.should raise_error(LucidWorks::RecordInvalid)
|
118
119
|
end
|
119
120
|
end
|
120
121
|
end
|
@@ -151,12 +152,12 @@ describe LucidWorks::Associations::HasOne do
|
|
151
152
|
end
|
152
153
|
end
|
153
154
|
|
154
|
-
context "with options :
|
155
|
+
context "with options :retrieveable_en_masse => true" do
|
155
156
|
before :all do
|
156
157
|
class ::TargetWithAll < LucidWorks::Base
|
157
158
|
end
|
158
159
|
class ::Owner
|
159
|
-
has_one :target_with_all, :
|
160
|
+
has_one :target_with_all, :retrieveable_en_masse => true
|
160
161
|
end
|
161
162
|
end
|
162
163
|
|
@@ -16,7 +16,7 @@ describe LucidWorks::Base do
|
|
16
16
|
|
17
17
|
class Widget < LucidWorks::Base
|
18
18
|
has_one :singleton_widget
|
19
|
-
has_one :
|
19
|
+
has_one :singleton_widget_that_is_retrieveable_en_masse, :retrieveable_en_masse => true
|
20
20
|
end
|
21
21
|
|
22
22
|
class SingletonWidget < LucidWorks::Base
|
@@ -35,6 +35,10 @@ describe LucidWorks::Base do
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
+
subject { Widget.new(:parent => @server) }
|
39
|
+
|
40
|
+
it_should_behave_like "ActiveModel"
|
41
|
+
|
38
42
|
describe "naming support" do
|
39
43
|
context "for a namespaced model" do
|
40
44
|
class LucidWorks::NamespacedModel < LucidWorks::Base
|
@@ -308,9 +312,9 @@ describe LucidWorks::Base do
|
|
308
312
|
mock_singleton1 = double('singleton widget1')
|
309
313
|
mock_singleton2 = double('singleton widget2')
|
310
314
|
mock_singleton3 = double('singleton widget3')
|
311
|
-
mock_other_widgets_1 = double('other widgets 1', :
|
312
|
-
mock_other_widgets_2 = double('other widgets 2', :
|
313
|
-
mock_other_widgets_3 = double('other widgets 3', :
|
315
|
+
mock_other_widgets_1 = double('other widgets 1', :retrieveable_en_masse? => false)
|
316
|
+
mock_other_widgets_2 = double('other widgets 2', :retrieveable_en_masse? => false)
|
317
|
+
mock_other_widgets_3 = double('other widgets 3', :retrieveable_en_masse? => false)
|
314
318
|
SingletonWidget.should_receive(:find).and_return(mock_singleton1, mock_singleton2, mock_singleton3)
|
315
319
|
OtherWidget.should_receive(:find).and_return(mock_other_widgets_1, mock_other_widgets_2, mock_other_widgets_3)
|
316
320
|
|
@@ -346,56 +350,13 @@ describe LucidWorks::Base do
|
|
346
350
|
end
|
347
351
|
|
348
352
|
context "for a model with a schema" do
|
349
|
-
before :all do
|
350
|
-
class WidgetWithBigSchema < LucidWorks::Base
|
351
|
-
schema do
|
352
|
-
attribute :astring, :string
|
353
|
-
attribute :large_number, :integer
|
354
|
-
attribute :iambool, :boolean
|
355
|
-
#attribute :when, :iso8601
|
356
|
-
end
|
357
|
-
end
|
358
|
-
class TrueClass
|
359
|
-
def to_yesno
|
360
|
-
self ? "yes" : "no"
|
361
|
-
end
|
362
|
-
end
|
363
|
-
end
|
364
|
-
|
365
353
|
describe ".human_attribute_value(attribute, value)" do
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
end
|
372
|
-
|
373
|
-
context "for an attribute described as :integer in the schema" do
|
374
|
-
before do
|
375
|
-
# So we can test without actually needing ActionPack
|
376
|
-
class LucidWorks::Base
|
377
|
-
def self.number_with_delimiter(x)
|
378
|
-
x.to_s.gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1,")
|
379
|
-
end
|
380
|
-
end
|
381
|
-
end
|
382
|
-
|
383
|
-
it "should number_with_delimeter the attribute" do
|
384
|
-
WidgetWithBigSchema.human_attribute_value(:large_number, 12345678).should == "12,345,678"
|
385
|
-
end
|
386
|
-
end
|
387
|
-
|
388
|
-
context "for an attributed described as :string in the schema" do
|
389
|
-
it "should just to_s the attribute" do
|
390
|
-
WidgetWithBigSchema.human_attribute_value(:astring, true).should == "true"
|
391
|
-
end
|
354
|
+
it "should call attribute.human_value with the value" do
|
355
|
+
widget = Widget.new(:myattr => 'foo', :parent => @server)
|
356
|
+
attr = widget.class.send(:schema)[:myattr]
|
357
|
+
attr.should_receive(:human_value).with('foo')
|
358
|
+
Widget.human_attribute_value(:myattr, 'foo')
|
392
359
|
end
|
393
|
-
|
394
|
-
#context "for an attribute described as :iso8601 in the schema" do
|
395
|
-
# it "should convert it to localtime to_s(:short)" do
|
396
|
-
# @widget.human_attribute_value(:when).should == "19 Mar 10:40"
|
397
|
-
# end
|
398
|
-
#end
|
399
360
|
end
|
400
361
|
|
401
362
|
describe ".to_select(attribute)" do
|
@@ -641,12 +602,66 @@ describe LucidWorks::Base do
|
|
641
602
|
end
|
642
603
|
|
643
604
|
describe "#destroy" do
|
644
|
-
|
645
|
-
widget = Widget.new(:parent => @server)
|
646
|
-
widget.id = 27
|
647
|
-
|
648
|
-
|
605
|
+
before do
|
606
|
+
@widget = Widget.new(:parent => @server)
|
607
|
+
@widget.id = 27
|
608
|
+
end
|
609
|
+
|
610
|
+
context "when successfull" do
|
611
|
+
it "should call RestClient.delete with the appropriate URL, and return true" do
|
612
|
+
RestClient.should_receive(:delete).with("#{@fake_server_uri}/widgets/27", {}).and_return("")
|
613
|
+
result = @widget.destroy
|
614
|
+
result.should be_true
|
615
|
+
end
|
616
|
+
end
|
617
|
+
|
618
|
+
describe "exceptions" do
|
619
|
+
context "when it recevies a 409 response" do
|
620
|
+
before do
|
621
|
+
RestClient.stub(:delete) {
|
622
|
+
e = RestClient::Conflict.new
|
623
|
+
e.response = "{\"errors\":[{\"message\":\"Field Type currently in use: text_en\"," +
|
624
|
+
"\"code\":\"error.invalid.value\",\"key\":\"name\"}]," +
|
625
|
+
"\"http_status_name\":\"Conflict\",\"http_status_code\":409}"
|
626
|
+
raise e
|
627
|
+
}
|
628
|
+
end
|
629
|
+
|
630
|
+
it "should attach errors to the model" do
|
631
|
+
@widget.destroy
|
632
|
+
@widget.errors.should == {:name => ["Field Type currently in use: text_en"]}
|
633
|
+
end
|
634
|
+
|
635
|
+
it "should return false" do
|
636
|
+
result = @widget.destroy
|
637
|
+
result.should be_false
|
638
|
+
end
|
639
|
+
end
|
640
|
+
|
641
|
+
context "when it receives an unexpected RestClient exception" do
|
642
|
+
before do
|
643
|
+
RestClient.stub(:delete) { raise RestClient::UnprocessableEntity.new }
|
644
|
+
end
|
645
|
+
|
646
|
+
it "should re-raise the exception" do
|
647
|
+
exception = nil
|
648
|
+
lambda {
|
649
|
+
@widget.destroy
|
650
|
+
}.should raise_error(RestClient::UnprocessableEntity)
|
651
|
+
end
|
652
|
+
|
653
|
+
it "should augment the error message" do
|
654
|
+
exception = nil
|
655
|
+
begin
|
656
|
+
@widget.destroy
|
657
|
+
rescue Exception => e
|
658
|
+
exception = e
|
659
|
+
end
|
660
|
+
e.message.should =~ /^Unprocessable Entity while performing delete http:\/\/127\.0\.0\.1:123456\/api\/widgets\/27/
|
661
|
+
end
|
662
|
+
end
|
649
663
|
end
|
664
|
+
|
650
665
|
end
|
651
666
|
|
652
667
|
describe "#human_attribute_value" do
|
@@ -726,7 +741,8 @@ describe LucidWorks::Base do
|
|
726
741
|
|
727
742
|
it "should add attributes to the schema as it loads them" do
|
728
743
|
model = ModelWithDynamicAttrs.new(:parent => @server)
|
729
|
-
|
744
|
+
mock_attribute = mock('Attribute', :name => 'foo')
|
745
|
+
model.class.schema.should_receive(:add_attribute).with(:foo, :string).and_return(mock_attribute)
|
730
746
|
model.stub(:foo=)
|
731
747
|
model.send(:load_attributes, {:foo => 'bar'})
|
732
748
|
end
|
@@ -771,7 +787,7 @@ describe LucidWorks::Base do
|
|
771
787
|
class ModelToBeEncoded < LucidWorks::Base
|
772
788
|
schema do
|
773
789
|
attribute :time, :iso8601
|
774
|
-
attribute :
|
790
|
+
attribute :blankish, :string, :omit_when_blank => true
|
775
791
|
end
|
776
792
|
end
|
777
793
|
end
|
@@ -785,9 +801,41 @@ describe LucidWorks::Base do
|
|
785
801
|
end
|
786
802
|
|
787
803
|
describe "for a model with an attr with option :omit_when_blank" do
|
788
|
-
|
789
|
-
|
790
|
-
|
804
|
+
|
805
|
+
context "when the attr is nil" do
|
806
|
+
before do
|
807
|
+
@model = ModelToBeEncoded.new(:parent => @server, :time => 123, :blankish => nil)
|
808
|
+
end
|
809
|
+
it "should not encode the attribute" do
|
810
|
+
@model.send(:encode).should == '{"time":123}'
|
811
|
+
end
|
812
|
+
end
|
813
|
+
|
814
|
+
context "when the attr is an empty string" do
|
815
|
+
before do
|
816
|
+
@model = ModelToBeEncoded.new(:parent => @server, :time => 123, :blankish => "")
|
817
|
+
end
|
818
|
+
it "should not encode the attribute" do
|
819
|
+
@model.send(:encode).should == '{"time":123}'
|
820
|
+
end
|
821
|
+
end
|
822
|
+
|
823
|
+
context "when the attr is an empty Array" do
|
824
|
+
before do
|
825
|
+
@model = ModelToBeEncoded.new(:parent => @server, :time => 123, :blankish => [])
|
826
|
+
end
|
827
|
+
it "SHOULD encode the attribute" do
|
828
|
+
@model.send(:encode).should == '{"time":123,"blankish":[]}'
|
829
|
+
end
|
830
|
+
end
|
831
|
+
|
832
|
+
context "when the attr is an empty Hash" do
|
833
|
+
before do
|
834
|
+
@model = ModelToBeEncoded.new(:parent => @server, :time => 123, :blankish => {})
|
835
|
+
end
|
836
|
+
it "should not encode the attribute" do
|
837
|
+
@model.send(:encode).should == '{"time":123,"blankish":{}}'
|
838
|
+
end
|
791
839
|
end
|
792
840
|
end
|
793
841
|
end
|
@@ -20,7 +20,7 @@ describe LucidWorks::Activity::History do
|
|
20
20
|
histories.count.should == 1
|
21
21
|
end
|
22
22
|
|
23
|
-
it "should subtract
|
23
|
+
it "should subtract crawl_started form crawl_stopped and return the difference in seconds" do
|
24
24
|
include ActiveSupport::Duration
|
25
25
|
|
26
26
|
history = LucidWorks::Activity::History.new(:parent => @activity)
|
@@ -56,20 +56,20 @@ describe LucidWorks::Collection do
|
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
|
-
context "with a reserved name" do
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
end
|
59
|
+
#context "with a reserved name" do
|
60
|
+
# before do
|
61
|
+
# logs = @server.collection(LucidWorks::Collection::LOGS_COLLECTION_NAME) rescue nil
|
62
|
+
# logs.destroy if logs
|
63
|
+
# @name = LucidWorks::Collection::LOGS_COLLECTION_NAME
|
64
|
+
# end
|
65
|
+
#
|
66
|
+
# it "should not create" do
|
67
|
+
# c = LucidWorks::Collection.create(:name => @name, :parent => @server)
|
68
|
+
# c.should_not be_persisted
|
69
|
+
# c.errors.should_not be_empty
|
70
|
+
# c.errors[:name].should include "is reserved"
|
71
|
+
# end
|
72
|
+
#end
|
73
73
|
end
|
74
74
|
|
75
75
|
describe ".find" do
|
@@ -284,7 +284,7 @@ describe LucidWorks::Collection do
|
|
284
284
|
begin
|
285
285
|
sleep 1
|
286
286
|
status = @ds1.status!
|
287
|
-
end while status.
|
287
|
+
end while status.crawl_state != 'FINISHED'
|
288
288
|
end
|
289
289
|
rescue Timeout::Error
|
290
290
|
raise "Timed out waiting for collection #{@collection.name} datasource #{@ds1.name} crawl to complete"
|
@@ -338,10 +338,10 @@ describe LucidWorks::Collection do
|
|
338
338
|
datasources = @collection.datasources(:include => [:histories, :status])
|
339
339
|
datasource = datasources.detect { |ds| ds.id == @ds1.id }
|
340
340
|
datasource.histories.first.should be_a(LucidWorks::Datasource::History)
|
341
|
-
datasource.histories.first.
|
341
|
+
datasource.histories.first.crawl_state.should == "FINISHED"
|
342
342
|
status = datasource.status
|
343
343
|
status.should be_a(LucidWorks::Datasource::Status)
|
344
|
-
status.
|
344
|
+
status.crawl_state.should == 'FINISHED'
|
345
345
|
end
|
346
346
|
end
|
347
347
|
end
|
@@ -13,7 +13,7 @@ describe LucidWorks::Datasource::History do
|
|
13
13
|
it "should sum counds of Updated, New and Unchanged" do
|
14
14
|
# History doesn't actually descend drectly from server, but for this test that doesn't matter
|
15
15
|
RestClient.should_receive(:get).
|
16
|
-
with("#{@fake_server_uri}/history").and_return('[{"
|
16
|
+
with("#{@fake_server_uri}/history").and_return('[{"num_updated":11,"num_new":22,"num_unchanged":33}]')
|
17
17
|
histories = LucidWorks::Datasource::History.all(:parent => @fake_server)
|
18
18
|
histories.first.doc_count.should == 66
|
19
19
|
end
|
@@ -21,7 +21,7 @@ describe LucidWorks::Datasource::History do
|
|
21
21
|
|
22
22
|
describe "#crawl_stopped" do
|
23
23
|
it "should convert to a Time with the correct value" do
|
24
|
-
history = LucidWorks::Datasource::History.new(:parent => @fake_server, :
|
24
|
+
history = LucidWorks::Datasource::History.new(:parent => @fake_server, :crawl_stopped => "2011-03-25T21:20:52+0000")
|
25
25
|
history.crawl_stopped.should be_a(Time)
|
26
26
|
# Time.iso8601("2011-03-25T21:20:52+0000").to_yaml # => "--- 2011-03-25 21:20:52 Z\n"
|
27
27
|
history.crawl_stopped.should == YAML.load("--- 2011-03-25 21:20:52 Z")
|
@@ -30,7 +30,7 @@ describe LucidWorks::Datasource::History do
|
|
30
30
|
|
31
31
|
describe "#crawl_started" do
|
32
32
|
it "should convert to a Time with the correct value" do
|
33
|
-
history = LucidWorks::Datasource::History.new(:parent => @fake_server, :
|
33
|
+
history = LucidWorks::Datasource::History.new(:parent => @fake_server, :crawl_started => "2011-03-25T21:20:52+0000")
|
34
34
|
history.crawl_started.should be_a(Time)
|
35
35
|
# Time.iso8601("2011-03-25T21:20:52+0000").to_yaml # => "--- 2011-03-25 21:20:52 Z\n"
|
36
36
|
history.crawl_started.should == YAML.load("--- 2011-03-25 21:20:52 Z")
|
@@ -38,7 +38,7 @@ describe LucidWorks::Datasource::History do
|
|
38
38
|
end
|
39
39
|
|
40
40
|
describe "#duration" do
|
41
|
-
it "should subtract
|
41
|
+
it "should subtract crawl_started form crawl_stopped and return the difference in seconds" do
|
42
42
|
include ActiveSupport::Duration
|
43
43
|
|
44
44
|
history = LucidWorks::Datasource::History.new(:parent => @fake_server)
|