lucid_works 0.6.4 → 0.6.5

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -261,7 +261,7 @@ A class may have a schema defined as follows:
261
261
  end
262
262
 
263
263
  Classes with a schema may have validations applied to its attributes.
264
- The default attribute type is :string.
264
+ The default attribute type is :string. See LucidWorks::Schema for more details.
265
265
 
266
266
  == Rationale
267
267
 
@@ -93,7 +93,7 @@ en:
93
93
  datasource:
94
94
  type: Type
95
95
  commitWithin: Commit within
96
- deleteAfter: Delete after
96
+ deleteAfter: Delete logs after
97
97
  bounds: Constrain to
98
98
  max_bytes: Skip files larger than
99
99
  history:
@@ -265,11 +265,10 @@ module LucidWorks
265
265
  end
266
266
 
267
267
  # For attributes listed in the schema as having :values, this will create an array-of-arrays
268
- # suitable for use as options_for_select. The
268
+ # suitable for use as options_for_select.
269
269
 
270
270
  def to_select(attribute)
271
271
  raise "Can't to_select for #{attribute} as it has no values" unless schema[attribute][:values]
272
- l10n_scope = %w{activemodel models} + self.name.underscore.split('/') + [attribute]
273
272
  schema[attribute][:values].map do |value|
274
273
  [human_attribute_value(attribute, value), value]
275
274
  end
@@ -421,10 +420,11 @@ module LucidWorks
421
420
  omit_attrs += self.class.schema.attrs_to_omit_during_update if persisted?
422
421
  attrs_as_json = @attributes.inject({}) do |memo, kv|
423
422
  attr, value = kv
424
- unless omit_attrs.include?(attr.to_s)
423
+ unless (value.blank? && self.class.schema[attr][:omit_when_blank]) ||
424
+ omit_attrs.include?(attr.to_s)
425
425
  case self.class.schema[attr][:type]
426
- when :iso8601
427
- memo[attr] = value.iso8601
426
+ when :iso8601
427
+ memo[attr] = value.iso8601 rescue value
428
428
  else
429
429
  memo[attr] = value
430
430
  end
@@ -7,7 +7,7 @@ module LucidWorks
7
7
 
8
8
  schema do
9
9
  attribute :period
10
- attribute :start_time
10
+ attribute :start_time, :iso8601
11
11
  attribute :active
12
12
  attribute :type
13
13
  end
@@ -22,15 +22,24 @@ module LucidWorks
22
22
  end
23
23
  end
24
24
 
25
+ def frequency=(frequency)
26
+ self.period = case frequency
27
+ when 'hourly' then 1.hours.seconds
28
+ when 'daily' then 1.days.seconds
29
+ when 'weekly' then 1.weeks.seconds
30
+ else raise "unknown frequency"
31
+ end
32
+ end
33
+
25
34
  def time_of_day
26
35
  Time.now
27
36
  end
28
37
 
29
38
  # predict when action will occur next if active at that time
30
39
  def next_start
31
- return start_at if reference_time <= start_at
40
+ return start_time if reference_time <= start_time
32
41
  # require 'ruby-debug'; debugger
33
- time_since_start = reference_time - start_at
42
+ time_since_start = reference_time - start_time
34
43
  last_interval_num = (time_since_start / period).to_i
35
44
  next_interval_num = if (time_since_start % period) == 0
36
45
  # this is sort of a stupid condition b/c time precision is millisecond or less
@@ -40,19 +49,9 @@ module LucidWorks
40
49
  else
41
50
  last_interval_num + 1
42
51
  end
43
- start_at + period * next_interval_num
44
- end
45
-
46
- # Ruby Time objects for start_time
47
- def start_at
48
- Time.iso8601(start_time)
52
+ start_time + period * next_interval_num
49
53
  end
50
-
51
- def start_at=(time)
52
-
53
- self.start_time = time.iso8601
54
- end
55
-
54
+
56
55
  # Provide ability to override "now" explicitly for testing purposes
57
56
  def reference_time=(time); @reference_time = time; end
58
57
  def reference_time; @reference_time || Time.now.utc; end
@@ -63,7 +62,8 @@ module LucidWorks
63
62
  all_attributes['start'].to_options!
64
63
  all_attributes['start'].each{|k,v| all_attributes['start'][k]=v.to_i}
65
64
 
66
- self.start_at =
65
+ self.frequency = all_attributes['frequency']
66
+ self.start_time =
67
67
  case all_attributes['frequency']
68
68
  when 'weekly'
69
69
  # require 'ruby-debug'; debugger
@@ -10,8 +10,9 @@ module LucidWorks
10
10
  schema do
11
11
  # common
12
12
  attributes :name, :type, :crawler
13
- attributes :crawl_depth, :max_bytes, :max_docs, :commitWithin, :type => :integer
14
- #attribute :commitWithin, :integer
13
+ attributes :crawl_depth, :max_docs, :type => :integer
14
+ attributes :max_bytes, :commitWithin, :type => :integer, :omit_when_blank => true
15
+ attribute :commit_within_min, :custom
15
16
  attribute :include_paths
16
17
  attribute :exclude_paths
17
18
  attribute :mapping # Hash
@@ -39,7 +40,8 @@ module LucidWorks
39
40
  attribute :source
40
41
  attribute :source_type
41
42
  # lwelogs
42
- attribute :deleteAfter, :integer
43
+ attribute :deleteAfter, :integer, :omit_when_blank => true
44
+ attribute :delete_after_days, :custom
43
45
  end
44
46
 
45
47
  validates_presence_of :type, :crawler, :name
@@ -47,8 +49,6 @@ module LucidWorks
47
49
  validates_numericality_of :max_bytes, :allow_blank => true
48
50
  validates_presence_of :url, :if => lambda { |d| d.type == 'web' }
49
51
 
50
- before_save :remove_blank_max_bytes
51
-
52
52
  TYPES = %w{ external file lwelogs web solrxml jdbc sharepoint }
53
53
  BOUNDS = %w{ tree none }
54
54
  CRAWLERS = {
@@ -64,6 +64,20 @@ module LucidWorks
64
64
  }.with_indifferent_access
65
65
 
66
66
 
67
+ # Fake attributes to ease UI implementation
68
+ def commit_within_min
69
+ commitWithin.blank? ? nil : commitWithin / 1.second.milliseconds / 1.minute.seconds
70
+ end
71
+ def commit_within_min=(mins)
72
+ self.commitWithin = mins.blank? ? nil : mins.to_i.minutes.milliseconds
73
+ end
74
+ def delete_after_days
75
+ deleteAfter.blank? ? nil : deleteAfter / 1.second.milliseconds / 1.day.seconds
76
+ end
77
+ def delete_after_days=(days)
78
+ self.deleteAfter = days.blank? ? nil : days.to_i.days.milliseconds
79
+ end
80
+
67
81
  def empty!
68
82
  build_index.destroy
69
83
  end
@@ -94,12 +108,5 @@ module LucidWorks
94
108
  def t_type
95
109
  I18n.t(type, :scope => 'activemodel.models.lucid_works.datasource.type')
96
110
  end
97
-
98
- private
99
-
100
- def remove_blank_max_bytes # :nodoc:
101
- # API can't handle a blank max_bytes. Send nothing to select 'unlimited'
102
- @attributes.delete :max_bytes if self.max_bytes.blank?
103
- end
104
111
  end
105
112
  end
@@ -12,8 +12,20 @@ class Time #:nodoc:
12
12
  end
13
13
 
14
14
  def iso8601_with_support_for_timezones_without_colons
15
- self.iso8601_without_support_for_timezones_without_colons.gsub /([+-])(\d\d):(\d\d)$/, '\1\2\3'
15
+ unfixed_string = self.iso8601_without_support_for_timezones_without_colons
16
+ if unfixed_string =~ /Z$/
17
+ unfixed_string.gsub /Z$/, '+0000'
18
+ else
19
+ unfixed_string.gsub /([+-])(\d\d):(\d\d)$/, '\1\2\3'
20
+ end
16
21
  end
17
22
 
18
23
  alias_method_chain :iso8601, :support_for_timezones_without_colons
19
24
  end
25
+
26
+ class Fixnum
27
+ def milliseconds
28
+ # so we can say 1.second.milliseconds
29
+ self * 1000
30
+ end
31
+ end
@@ -1,9 +1,27 @@
1
1
  module LucidWorks
2
2
 
3
- # Specify an attributes for a model.
3
+ # Schema is used to delare attributes for a model.
4
+
4
5
  class Schema < ActiveSupport::HashWithIndifferentAccess
5
- ATTRIBUTES_TYPES = [ :string, :integer, :boolean, :iso8601 ]
6
+ ATTRIBUTES_TYPES = [ :string, :integer, :boolean, :iso8601, :custom ]
6
7
 
8
+ # Initializes the schema, taking a block of schema declarations.
9
+ # Typically it is called from LucidWorks::Base, e.g.:
10
+ #
11
+ # class MyModel < LucidWorks::Base
12
+ # schema do
13
+ # attribute :string1, :string
14
+ # attribute :bool1, :boolean
15
+ # attribute :integer1, :integer
16
+ # attributes :string2, :string3, :string4
17
+ # attributes :bool2, :bool3, :type => :boolean
18
+ # attributes :int2, :int3, :type => :integer
19
+ # attribute :string_with_values, :values => ['one', 'two']
20
+ # attribute :dontsendme, :omit_during_update => true
21
+ # attribute :sendnull, :string, :nil_when_blank => true
22
+ # end
23
+ # end
24
+ #
7
25
  def initialize
8
26
  @primary_key = :id
9
27
  @dynamic_attributes = true
@@ -14,16 +32,39 @@ module LucidWorks
14
32
  @primary_key
15
33
  end
16
34
 
17
- # Specify whether attributes unrecognized during retrieval should raise an error (false)
18
- # or cause a new attribute to be added to the schema (true) [default].
19
- #
35
+ # If called with _true_ (the default), attributes will be added to the schema
36
+ # when the model is first retrieved from the server. If set to _false_
37
+ # only the attributes defined in the schema will be allowed and anything
38
+ # else will raise an exception.
39
+
20
40
  def dynamic_attributes(on=nil)
21
41
  @dynamic_attributes = !!on unless on.nil?
22
42
  @dynamic_attributes
23
43
  end
24
44
 
25
45
  alias :dynamic_attributes? :dynamic_attributes
26
-
46
+
47
+ # Declare a single attribute.
48
+ #
49
+ # Attributes may be of the following types:
50
+ #
51
+ # [:string ] The default type, incurrs no special processing.
52
+ # [:integer] Setter will attempt cast to_i. Will be sent to server as integer.
53
+ # [:boolean] Besides true/false, the setter will accept 0, 1 and strings true, false, t, f, 0, 1, yes and no.
54
+ # [:iso8601] An ISO 8601 formatted datetime. Automatically converts to/from strings when sent / received.
55
+ # [:custom] Developer will write their own setter/getter.
56
+ #
57
+ # Attributes behavior may also be modified using the following options:
58
+ #
59
+ # [:type => _type_] Use to set the type of a group of attributes when using \#attributes.
60
+ # [:values => \[array\]] Provides a set of values that to_select will use to generate options_for_select.
61
+ # [:omit_during_update => true] Some resources have attributes that may be set during creation,
62
+ # but will cause an error if sent during an update.
63
+ # Setting the <em>option</em> to true will skip the attribute when saving
64
+ # the model during update.
65
+ # [:nil_when_blank => true] When this attribute is blank?, send nil (actually JSON null) during save.
66
+ # [:omit_when_blank => true] When this attribute is blank?, don't send it to the server during save.
67
+
27
68
  def attribute(name, type=:string, options={})
28
69
  raise "Unknown attribute type: #{type.inspect}" unless ATTRIBUTES_TYPES.include?(type)
29
70
  primary_key name if options.delete(:primary_key)
@@ -37,10 +78,11 @@ module LucidWorks
37
78
  # end
38
79
  #
39
80
  def attributes(*attributes_and_options)
40
- options = attributes_and_options.last.is_a?(Hash) ? attributes_and_options.pop : {}
81
+ options = attributes_and_options.last.is_a?(Hash) ? attributes_and_options.pop : {}
41
82
  attributes = attributes_and_options
83
+ type = options.delete(:type) || :string
42
84
  attributes.each do |name|
43
- self[name] = { :type => options[:type] || :string }
85
+ attribute name, type, options
44
86
  end
45
87
  end
46
88
 
@@ -96,8 +138,13 @@ module LucidWorks
96
138
  when :integer
97
139
  klass.class_eval <<-EOF, __FILE__, __LINE__+1
98
140
  def #{attribute}=(new_value)
99
- new_value = nil if new_value.blank? && self.class.schema[:#{attribute}][:nil_when_blank]
100
- @attributes[:#{attribute}] = new_value.to_i
141
+ if new_value.blank? && (self.class.schema[:#{attribute}][:nil_when_blank] ||
142
+ self.class.schema[:#{attribute}][:omit_when_blank])
143
+ new_value = nil
144
+ else
145
+ new_value = new_value.to_i
146
+ end
147
+ @attributes[:#{attribute}] = new_value
101
148
  end
102
149
  EOF
103
150
  when :iso8601
@@ -105,13 +152,13 @@ module LucidWorks
105
152
  def #{attribute}=(new_value)
106
153
  if new_value.kind_of?(String)
107
154
  @attributes[:#{attribute}] = Time.iso8601(new_value)
108
- elsif new_value.kind_of?(Time)
109
- @attributes[:#{attribute}] = new_value
110
155
  else
111
- raise "iso8601 attribute= only accepts String or Time"
156
+ @attributes[:#{attribute}] = new_value
112
157
  end
113
158
  end
114
159
  EOF
160
+ when :custom
161
+ # Do nothing. Developer will provide own accessors.
115
162
  else
116
163
  klass.class_eval <<-EOF, __FILE__, __LINE__+1
117
164
  def #{attribute}=(new_value) # def foo=(new_value)
@@ -1,3 +1,3 @@
1
1
  module LucidWorks
2
- VERSION = "0.6.4"
2
+ VERSION = "0.6.5"
3
3
  end
@@ -709,15 +709,26 @@ describe LucidWorks::Base do
709
709
 
710
710
  describe "#encode" do
711
711
  before do
712
- # reuse ModelWithTimeAttr
713
- # Yes this will fail if we start running tests in random order or bottom up
712
+ class ModelToBeEncoded < LucidWorks::Base
713
+ schema do
714
+ attribute :time, :iso8601
715
+ attribute :blanktime, :iso8601, :omit_when_blank => true
716
+ end
717
+ end
714
718
  end
715
719
 
716
720
  describe "for a model with an attr described as :iso8601" do
717
721
  it "should convert :iso8601 attributes to strings" do
718
- time = Time.utc(2011,12,13,14,15,16)
719
- model = ModelWithTimeAttr.new(:parent => @server, :time => time)
720
- model.send(:encode).should == '{"time":"2011-12-13T14:15:16Z"}'
722
+ time = Time.local(2011,12,13,14,15,16)
723
+ model = ModelToBeEncoded.new(:parent => @server, :time => time)
724
+ model.send(:encode).should =~ /"time":"2011-12-13T14:15:16-\d\d\d\d"/
725
+ end
726
+ end
727
+
728
+ describe "for a model with an attr with option :omit_when_blank" do
729
+ it "should not encode the attribute" do
730
+ model = ModelToBeEncoded.new(:parent => @server, :time => 123, :blanktime => nil)
731
+ model.send(:encode).should == '{"time":123}'
721
732
  end
722
733
  end
723
734
  end
@@ -89,7 +89,7 @@ describe LucidWorks::Collection do
89
89
 
90
90
  describe "#activities" do
91
91
  before do
92
- @collection = LucidWorks::Collection.first(:parent => @server)
92
+ @collection = @server.collection('collection1')
93
93
  end
94
94
 
95
95
  context "for a collection with some activities" do
@@ -179,7 +179,7 @@ describe LucidWorks::Collection do
179
179
  # Schedule a crawl to create some history
180
180
  @schedule = @ds1.build_schedule
181
181
  @schedule.period = '0'
182
- @schedule.start_time = '0'
182
+ @schedule.start_time = 0
183
183
  @schedule.active = true
184
184
  @schedule.type = 'index'
185
185
  @schedule.save
@@ -44,8 +44,8 @@ describe LucidWorks::Datasource::Schedule do
44
44
  describe 'start_time is in the future' do
45
45
  it 'should return start_time' do
46
46
  @schedule.reference_time = Time.now.utc
47
- @schedule.start_time = (@schedule.reference_time + 30.minutes).iso8601
48
- @schedule.next_start.should == Time.iso8601(@schedule.start_time)
47
+ @schedule.start_time = @schedule.reference_time + 30.minutes
48
+ @schedule.next_start.should == @schedule.start_time
49
49
  end
50
50
  end
51
51
 
@@ -64,7 +64,7 @@ describe LucidWorks::Datasource::Schedule do
64
64
  it 'should return now' do
65
65
  # get current time after rounding error
66
66
  @schedule.reference_time = @now
67
- @schedule.start_time = (@now - 30.minutes).iso8601
67
+ @schedule.start_time = @now - 30.minutes
68
68
  @schedule.period = 10.minutes
69
69
  @schedule.next_start.should == @now
70
70
  end
@@ -73,7 +73,7 @@ describe LucidWorks::Datasource::Schedule do
73
73
  context 'Time since self.start_time is not even multiple of self.period' do
74
74
  describe 'one interval has passed' do
75
75
  before do
76
- @schedule.start_time = (@now - 11.minutes).iso8601
76
+ @schedule.start_time = @now - 11.minutes
77
77
  @schedule.period = 10.minutes
78
78
  end
79
79
 
@@ -88,12 +88,12 @@ describe LucidWorks::Datasource::Schedule do
88
88
 
89
89
  describe 'several (e.g. 4) intervals have passed' do
90
90
  before do
91
- @schedule.start_time = (@now - 45.minutes).iso8601
91
+ @schedule.start_time = @now - 45.minutes
92
92
  @schedule.period = 10.minutes
93
93
  end
94
94
 
95
- it 'should return a time between 4 and 6 intervals from start_at' do
96
- @schedule.next_start.should > @schedule.start_at + (4 * @schedule.period)
95
+ it 'should return a time between 4 and 6 intervals from start_time' do
96
+ @schedule.next_start.should > @schedule.start_time + (4 * @schedule.period)
97
97
  end
98
98
 
99
99
  it 'should return a start time within 1 period from now' do
@@ -111,7 +111,7 @@ describe LucidWorks::Datasource::Schedule do
111
111
  it "should advance the start time" do
112
112
  half_past_midnight = Time.iso8601("2011-05-09T00:30:00Z")
113
113
  hourly_at_quarter_past = {"frequency"=>"hourly", "start"=>{"minutes"=>"15"}}
114
- quarter_past_1_am = '2011-05-09T01:15:00Z'
114
+ quarter_past_1_am = Time.iso8601('2011-05-09T01:15:00Z')
115
115
 
116
116
  @schedule.reference_time = half_past_midnight
117
117
  @schedule.start_time.should_not == quarter_past_1_am
@@ -123,7 +123,7 @@ describe LucidWorks::Datasource::Schedule do
123
123
  describe 'with daily frequency' do
124
124
  it "should advance the start time" do
125
125
  today_at_noon = Time.iso8601("2011-05-09T12:00:00Z")
126
- tomorrow_at_eleven_am = '2011-05-10T11:00:00Z'
126
+ tomorrow_at_eleven_am = Time.iso8601('2011-05-10T11:00:00Z')
127
127
  daily_at_11_am = {"frequency"=>"daily", "start"=>{"hours" => "11", "minutes"=>"00"}}
128
128
 
129
129
  @schedule.reference_time = today_at_noon
@@ -137,7 +137,7 @@ describe LucidWorks::Datasource::Schedule do
137
137
  it "should advance the start time" do
138
138
  # note: Rails week starts on Monday
139
139
  friday_of_this_week = Time.iso8601("2011-05-13T00:00:00Z")
140
- wednesday_of_next_week = '2011-05-18T00:00:00Z'
140
+ wednesday_of_next_week = Time.iso8601('2011-05-18T00:00:00Z')
141
141
  weekly_on_wednesday = {"frequency"=>"weekly", "start"=>{"days" => "2", "hours" => "0", "minutes"=>"00"}}
142
142
 
143
143
  # just make sure I'm not on crack
@@ -156,27 +156,33 @@ describe LucidWorks::Datasource::Schedule do
156
156
  describe 'with hourly frequency' do
157
157
  it "should not advance the start time" do
158
158
  half_past_midnight = Time.iso8601("2011-05-09T00:30:00Z")
159
- three_quarters_past_midnight = '2011-05-09T00:45:00Z'
159
+ three_quarters_past_midnight = Time.iso8601('2011-05-09T00:45:00Z')
160
160
  hourly_at_three_quarters_past = {"frequency"=>"hourly", "start"=>{"minutes"=>"45"}}
161
161
 
162
162
  @schedule.reference_time = half_past_midnight
163
163
 
164
164
  @schedule.start_time.should_not == three_quarters_past_midnight
165
+ @schedule.frequency.should_not == 'hourly'
166
+
165
167
  @schedule.schedule = hourly_at_three_quarters_past
166
168
  @schedule.start_time.should == three_quarters_past_midnight
169
+ @schedule.frequency.should == 'hourly'
167
170
  end
168
171
  end
169
172
 
170
173
  describe 'with daily frequency' do
171
174
  it "should not advance the start time" do
172
175
  today_at_noon = Time.iso8601("2011-05-09T12:00:00Z")
173
- today_at_1pm = '2011-05-09T13:00:00Z'
176
+ today_at_1pm = Time.iso8601('2011-05-09T13:00:00Z')
174
177
  daily_at_1pm = {"frequency"=>"daily", "start"=>{"hours" => "13", "minutes"=>"00"}}
175
178
 
176
179
  @schedule.reference_time = today_at_noon
177
180
  @schedule.start_time.should_not == today_at_1pm
181
+ @schedule.frequency.should_not == 'daily'
182
+
178
183
  @schedule.schedule = daily_at_1pm
179
184
  @schedule.start_time.should == today_at_1pm
185
+ @schedule.frequency.should == 'daily'
180
186
  end
181
187
  end
182
188
 
@@ -184,7 +190,7 @@ describe LucidWorks::Datasource::Schedule do
184
190
  it "should not advance the start time" do
185
191
  # note: Rails week starts on Monday
186
192
  wednesday_of_this_week = Time.iso8601("2011-05-11T00:00:00Z")
187
- thursday_of_this_week = '2011-05-12T00:00:00Z'
193
+ thursday_of_this_week = Time.iso8601('2011-05-12T00:00:00Z')
188
194
  weekly_on_thursday = {"frequency"=>"weekly", "start"=>{"days" => "3", "hours" => "0", "minutes"=>"00"}}
189
195
 
190
196
  # just make sure I'm not on crack
@@ -193,8 +199,11 @@ describe LucidWorks::Datasource::Schedule do
193
199
 
194
200
  @schedule.reference_time = wednesday_of_this_week
195
201
  @schedule.start_time.should_not == thursday_of_this_week
202
+ @schedule.frequency.should_not == 'weekly'
203
+
196
204
  @schedule.schedule = weekly_on_thursday
197
205
  @schedule.start_time.should == thursday_of_this_week
206
+ @schedule.frequency.should == 'weekly'
198
207
  end
199
208
  end
200
209
  end
@@ -4,7 +4,7 @@ describe LucidWorks::Datasource do
4
4
  before :all do
5
5
  @server = connect_to_live_server
6
6
  @server.reset_collections!
7
- @collection = @server.collections!.first
7
+ @collection = @server.collection('collection1')
8
8
  end
9
9
 
10
10
  describe "CRUD" do
@@ -60,7 +60,7 @@ describe LucidWorks::Datasource do
60
60
  :crawler => LucidWorks::Datasource::CRAWLERS['web'],
61
61
  :type => 'web',
62
62
  :url => "invalid url",
63
- :crawl_depth => "invalid crawl depth"
63
+ :crawl_depth => 1
64
64
  }
65
65
  end
66
66
 
@@ -70,7 +70,6 @@ describe LucidWorks::Datasource do
70
70
  d = LucidWorks::Datasource.create(@parameters)
71
71
  }.should_not change(self, :datasource_count)
72
72
  d.errors[:url].should_not be_empty
73
- d.errors[:crawl_depth].should_not be_empty
74
73
  d.errors[:base].should be_blank
75
74
  end
76
75
  end
@@ -8,8 +8,16 @@ describe Time do
8
8
  end
9
9
 
10
10
  describe "#iso8601" do
11
- it "should generate a time with a 4 digit timezone" do
12
- Time.new(2011, 4, 15, 13, 11, 56, "-07:00").iso8601.should == "2011-04-15T13:11:56-0700"
11
+ context "when time is a UTC time" do
12
+ it "should end in +0000" do
13
+ Time.utc(2011, 4, 15, 13, 11, 56).iso8601.should == "2011-04-15T13:11:56+0000"
14
+ end
15
+ end
16
+
17
+ context "when time is non-UTC" do
18
+ it "should generate a time with a 4 digit timezone" do
19
+ Time.new(2011, 4, 15, 13, 11, 56, "-07:00").iso8601.should == "2011-04-15T13:11:56-0700"
20
+ end
13
21
  end
14
22
  end
15
23
  end
@@ -144,6 +144,23 @@ describe LucidWorks::Schema do
144
144
  end
145
145
  end
146
146
  end
147
+
148
+ context "for an iso8601 attribute" do
149
+ it "setter should just store a Time" do
150
+ @model.time = Time.utc(2011)
151
+ @model.time.should be_a(Time)
152
+ end
153
+
154
+ it "setter should assume string is ISO8601 and convert to Time" do
155
+ @model.time = "2011-05-12T13:33:55-0500"
156
+ @model.time.should == Time.utc(2011,05,12,18,33,55)
157
+ end
158
+
159
+ it "setter should just store an integer" do
160
+ @model.time = 12345678
161
+ @model.time.should == 12345678
162
+ end
163
+ end
147
164
  end
148
165
 
149
166
  describe "#has_attribute?" do
data/spec/spec_helper.rb CHANGED
@@ -36,8 +36,12 @@ class LucidWorks::Server
36
36
  end
37
37
 
38
38
  collections.each do |c|
39
- c.destroy
40
- notes << "Deleted collection '#{c.name}'"
39
+ # TODO: figure out how to delete and recreate lwelogs
40
+ # For now just don't delete it
41
+ unless c.name == 'lwelogs'
42
+ c.destroy
43
+ notes << "Deleted collection '#{c.name}'"
44
+ end
41
45
  end
42
46
 
43
47
  default_collection = self.create_collection(:name => DEFAULT_COLLECTION_NAME)
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: lucid_works
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.6.4
5
+ version: 0.6.5
6
6
  platform: ruby
7
7
  authors:
8
8
  - Sam Pierson
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-05-13 00:00:00 -07:00
13
+ date: 2011-05-16 00:00:00 -07:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency