lucid_works 0.6.3 → 0.6.4

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.
@@ -92,6 +92,8 @@ en:
92
92
  update_server_list: Update server list
93
93
  datasource:
94
94
  type: Type
95
+ commitWithin: Commit within
96
+ deleteAfter: Delete after
95
97
  bounds: Constrain to
96
98
  max_bytes: Skip files larger than
97
99
  history:
data/lib/lucid_works.rb CHANGED
@@ -4,9 +4,7 @@ module LucidWorks
4
4
  end
5
5
 
6
6
  require 'active_model'
7
- require 'active_support/core_ext/module/attr_accessor_with_default'
8
- require 'active_support/core_ext/module/aliasing'
9
- require 'active_support/core_ext/hash/indifferent_access'
7
+ require 'active_support/core_ext'
10
8
  require 'active_support/inflector'
11
9
  begin
12
10
  require 'action_view/helpers/number_helper' # Optional formatter support
@@ -419,7 +419,19 @@ module LucidWorks
419
419
  def encode # :nodoc:
420
420
  omit_attrs = [ 'id' ]
421
421
  omit_attrs += self.class.schema.attrs_to_omit_during_update if persisted?
422
- @attributes.reject { |k,v| omit_attrs.include?(k.to_s) }.to_json
422
+ attrs_as_json = @attributes.inject({}) do |memo, kv|
423
+ attr, value = kv
424
+ unless omit_attrs.include?(attr.to_s)
425
+ case self.class.schema[attr][:type]
426
+ when :iso8601
427
+ memo[attr] = value.iso8601
428
+ else
429
+ memo[attr] = value
430
+ end
431
+ end
432
+ memo
433
+ end
434
+ attrs_as_json.to_json
423
435
  end
424
436
 
425
437
  def load_attributes(attributes_and_values) # :nodoc:
@@ -10,7 +10,7 @@ module LucidWorks
10
10
  schema do
11
11
  # common
12
12
  attributes :name, :type, :crawler
13
- attributes :crawl_depth, :max_bytes, :max_docs, :type => :integer
13
+ attributes :crawl_depth, :max_bytes, :max_docs, :commitWithin, :type => :integer
14
14
  #attribute :commitWithin, :integer
15
15
  attribute :include_paths
16
16
  attribute :exclude_paths
@@ -38,10 +38,12 @@ module LucidWorks
38
38
  # external
39
39
  attribute :source
40
40
  attribute :source_type
41
+ # lwelogs
42
+ attribute :deleteAfter, :integer
41
43
  end
42
44
 
43
45
  validates_presence_of :type, :crawler, :name
44
- validates_presence_of :crawl_depth, :unless => lambda { |d| %w{external sharepoint}.include?(d.type) }
46
+ validates_presence_of :crawl_depth, :if => lambda { |d| %w{web file}.include?(d.type) }
45
47
  validates_numericality_of :max_bytes, :allow_blank => true
46
48
  validates_presence_of :url, :if => lambda { |d| d.type == 'web' }
47
49
 
@@ -11,6 +11,75 @@ module LucidWorks
11
11
  attribute :active
12
12
  attribute :type
13
13
  end
14
+
15
+ def frequency
16
+ case period
17
+ when 1.weeks.seconds then 'weekly'
18
+ when 1.days.seconds then 'daily'
19
+ when 1.hours.seconds then 'hourly'
20
+ when 0 then nil
21
+ else 'custom'
22
+ end
23
+ end
24
+
25
+ def time_of_day
26
+ Time.now
27
+ end
28
+
29
+ # predict when action will occur next if active at that time
30
+ def next_start
31
+ return start_at if reference_time <= start_at
32
+ # require 'ruby-debug'; debugger
33
+ time_since_start = reference_time - start_at
34
+ last_interval_num = (time_since_start / period).to_i
35
+ next_interval_num = if (time_since_start % period) == 0
36
+ # this is sort of a stupid condition b/c time precision is millisecond or less
37
+ # for human purposes we wouldn't care if the result were as though the call
38
+ # happened a millisecond later. But whatever.
39
+ last_interval_num # the next interval *is* the last interval if it is exactly now
40
+ else
41
+ last_interval_num + 1
42
+ 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)
49
+ end
50
+
51
+ def start_at=(time)
52
+
53
+ self.start_time = time.iso8601
54
+ end
55
+
56
+ # Provide ability to override "now" explicitly for testing purposes
57
+ def reference_time=(time); @reference_time = time; end
58
+ def reference_time; @reference_time || Time.now.utc; end
59
+
60
+ # phantom attribute for compiling real start time and frequency from appropriate form data
61
+ def schedule=(all_attributes)
62
+ # convert to format accepted by Time.advance
63
+ all_attributes['start'].to_options!
64
+ all_attributes['start'].each{|k,v| all_attributes['start'][k]=v.to_i}
65
+
66
+ self.start_at =
67
+ case all_attributes['frequency']
68
+ when 'weekly'
69
+ # require 'ruby-debug'; debugger
70
+ start = self.reference_time.beginning_of_week.advance(all_attributes['start'])
71
+ start < self.reference_time ? start.advance(:weeks => 1) : start
72
+ when 'daily'
73
+ start = self.reference_time.beginning_of_day.advance(all_attributes['start'])
74
+ start < self.reference_time ? start.advance(:days => 1) : start
75
+ when 'hourly'
76
+ start = self.reference_time.change(:min => 0).advance(all_attributes['start'])
77
+ start < self.reference_time ? start.advance(:hours => 1) : start
78
+ else
79
+ puts "*** frequency: <#{all_attributes[:frequency]}>"
80
+ raise "unexpected frequency encountered"
81
+ end
82
+ end
14
83
  end
15
84
  end
16
85
  end
@@ -2,7 +2,7 @@ module LucidWorks
2
2
 
3
3
  # Specify an attributes for a model.
4
4
  class Schema < ActiveSupport::HashWithIndifferentAccess
5
- ATTRIBUTES_TYPES = [ :string, :integer, :boolean ]
5
+ ATTRIBUTES_TYPES = [ :string, :integer, :boolean, :iso8601 ]
6
6
 
7
7
  def initialize
8
8
  @primary_key = :id
@@ -93,6 +93,25 @@ module LucidWorks
93
93
  @attributes[:#{attribute}] = new_value # @attributes[:foo] = new_value
94
94
  end # end
95
95
  EOF
96
+ when :integer
97
+ klass.class_eval <<-EOF, __FILE__, __LINE__+1
98
+ 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
101
+ end
102
+ EOF
103
+ when :iso8601
104
+ klass.class_eval <<-EOF, __FILE__, __LINE__+1
105
+ def #{attribute}=(new_value)
106
+ if new_value.kind_of?(String)
107
+ @attributes[:#{attribute}] = Time.iso8601(new_value)
108
+ elsif new_value.kind_of?(Time)
109
+ @attributes[:#{attribute}] = new_value
110
+ else
111
+ raise "iso8601 attribute= only accepts String or Time"
112
+ end
113
+ end
114
+ EOF
96
115
  else
97
116
  klass.class_eval <<-EOF, __FILE__, __LINE__+1
98
117
  def #{attribute}=(new_value) # def foo=(new_value)
@@ -1,3 +1,3 @@
1
1
  module LucidWorks
2
- VERSION = "0.6.3"
2
+ VERSION = "0.6.4"
3
3
  end
@@ -374,14 +374,14 @@ describe LucidWorks::Base do
374
374
 
375
375
  describe "instance methods" do
376
376
 
377
- describe "collection_url" do
377
+ describe "#collection_url" do
378
378
  it "should generate a url from the server and its name" do
379
379
  widget = Widget.new(:parent => @server, :id => 1234)
380
380
  widget.collection_url.should == "#{@fake_server_uri}/widgets"
381
381
  end
382
382
  end
383
383
 
384
- describe "member_url" do
384
+ describe "#member_url" do
385
385
  it "should generate a url from the server, its name and its id" do
386
386
  widget = Widget.new(:parent => @server, :id => 1234)
387
387
  widget.member_url.should == "#{@fake_server_uri}/widgets/1234"
@@ -597,33 +597,128 @@ describe LucidWorks::Base do
597
597
  widget.human_attribute_value(:myattr)
598
598
  end
599
599
  end
600
- end
601
600
 
602
- describe "for a model with primary key other than 'id'" do
603
- before :all do
604
- class NamedWidget < LucidWorks::Base
605
- schema do
606
- primary_key :name
601
+ context "for a model with primary key other than 'id'" do
602
+ before :all do
603
+ class NamedWidget < LucidWorks::Base
604
+ schema do
605
+ primary_key :name
606
+ end
607
+ end
608
+ NAMED_WIDGET1_JSON = '{"name":"widget1","size":"small"}'
609
+ NAMED_WIDGET2_JSON = '{"name":"widget2","size":"medium"}'
610
+ NAMED_WIDGETS_JSON = "[#{WIDGET1_JSON},#{WIDGET2_JSON}]"
611
+ end
612
+
613
+ describe "#id" do
614
+ it "should return the primary key's value" do
615
+ w = NamedWidget.new(:name => 'fake_name', :parent => @server)
616
+ w.id.should == 'fake_name'
617
+ end
618
+ end
619
+
620
+ describe "#id=" do
621
+ it "should set the primary key's value" do
622
+ w = NamedWidget.new(:name => 'fake_name', :parent => @server)
623
+ w.id = 'new_name'
624
+ w.id.should == 'new_name'
625
+ w.name.should == 'new_name'
607
626
  end
608
627
  end
609
- NAMED_WIDGET1_JSON = '{"name":"widget1","size":"small"}'
610
- NAMED_WIDGET2_JSON = '{"name":"widget2","size":"medium"}'
611
- NAMED_WIDGETS_JSON = "[#{WIDGET1_JSON},#{WIDGET2_JSON}]"
612
628
  end
629
+ end
630
+
631
+ describe "private methods" do
632
+ describe "#load_attributes" do
633
+ it "should set id using it's accessor and not set it directly in @attributes" do
634
+ class ModelToTestId < LucidWorks::Base
635
+ end
636
+ model = ModelToTestId.new(:parent => @server)
637
+ model.should_receive(:id=).with(123)
638
+ model.send(:load_attributes, {:foo => 'bar', :id => 123})
639
+ end
613
640
 
614
- describe "#id" do
615
- it "should return the primary key's value" do
616
- w = NamedWidget.new(:name => 'fake_name', :parent => @server)
617
- w.id.should == 'fake_name'
641
+ context "for a class that belongs_to another object" do
642
+ before do
643
+ class ModelThatHas < LucidWorks::Base
644
+ has_one :model_that_belongs
645
+ end
646
+ class ModelThatBelongs < LucidWorks::Base
647
+ belongs_to :model_that_has
648
+ end
649
+ end
650
+
651
+ it "should ignore attempts to set the belongs_to object" do
652
+ parent = ModelThatHas.new(:parent => @server)
653
+ model = ModelThatBelongs.new(:parent => parent)
654
+ model.class.schema.should_not_receive(:add_attribute)
655
+ model.send(:load_attributes, :model_that_has => "foo")
656
+ end
657
+ end
658
+
659
+ context "for a class with dynamic_attributes = true" do
660
+ before do
661
+ class ModelWithDynamicAttrs < LucidWorks::Base
662
+ schema do
663
+ dynamic_attributes true
664
+ end
665
+ end
666
+ end
667
+
668
+ it "should add attributes to the schema as it loads them" do
669
+ model = ModelWithDynamicAttrs.new(:parent => @server)
670
+ model.class.schema.should_receive(:add_attribute).with(ModelWithDynamicAttrs, :foo, :string)
671
+ model.stub(:foo=)
672
+ model.send(:load_attributes, {:foo => 'bar'})
673
+ end
674
+ end
675
+
676
+ context "for a class with dynamic_attributes = false" do
677
+ before do
678
+ class ModelWithStaticAttrs < LucidWorks::Base
679
+ schema do
680
+ dynamic_attributes false
681
+ end
682
+ end
683
+ end
684
+
685
+ it "should raise an error for unknown attributes" do
686
+ model = ModelWithStaticAttrs.new(:parent => @server)
687
+ lambda {
688
+ model.send(:load_attributes, {:foo => 'bar'})
689
+ }.should raise_error
690
+ end
691
+ end
692
+
693
+ describe "for a model with an attr described as :iso8601" do
694
+ before do
695
+ class ModelWithTimeAttr < LucidWorks::Base
696
+ schema do
697
+ attribute :time, :iso8601
698
+ end
699
+ end
700
+ end
701
+
702
+ it "should convert :iso8601 attributes to a Time object" do
703
+ model = ModelWithTimeAttr.new(:parent => @server)
704
+ model.send(:load_attributes, {:time => "2011-05-12T13:33:55-0500"})
705
+ model.time.should == Time.utc(2011,05,12,18,33,55)
706
+ end
618
707
  end
619
708
  end
620
-
621
- describe "#id=" do
622
- it "should set the primary key's value" do
623
- w = NamedWidget.new(:name => 'fake_name', :parent => @server)
624
- w.id = 'new_name'
625
- w.id.should == 'new_name'
626
- w.name.should == 'new_name'
709
+
710
+ describe "#encode" do
711
+ before do
712
+ # reuse ModelWithTimeAttr
713
+ # Yes this will fail if we start running tests in random order or bottom up
714
+ end
715
+
716
+ describe "for a model with an attr described as :iso8601" do
717
+ 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"}'
721
+ end
627
722
  end
628
723
  end
629
724
  end
@@ -0,0 +1,202 @@
1
+ require 'spec_helper'
2
+
3
+ class String
4
+ def weekday
5
+ Time.iso8601(self).strftime('%A')
6
+ end
7
+ end
8
+
9
+ class Time
10
+ def weekday
11
+ self.strftime('%A')
12
+ end
13
+ end
14
+
15
+ describe LucidWorks::Datasource::Schedule do
16
+ before do
17
+ @server = connect_to_live_server
18
+ @schedule = LucidWorks::Datasource::Schedule.new(:parent => @server)
19
+ end
20
+
21
+ describe '#frequency' do
22
+ it "should return 'daily'" do
23
+ @schedule.period = 86400
24
+ @schedule.frequency.should == 'daily'
25
+ end
26
+
27
+ it "should return 'hourly'" do
28
+ @schedule.period = 3600
29
+ @schedule.frequency.should == 'hourly'
30
+ end
31
+
32
+ it "should return 'custom'" do
33
+ @schedule.period = 1
34
+ @schedule.frequency.should == 'custom'
35
+ end
36
+
37
+ it "should return nil" do
38
+ @schedule.period = 0
39
+ @schedule.frequency.should == nil
40
+ end
41
+ end
42
+
43
+ describe '#next_start' do
44
+ describe 'start_time is in the future' do
45
+ it 'should return start_time' do
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)
49
+ end
50
+ end
51
+
52
+ #
53
+ # some of these are a little sketchy b/c comparing time equality is tricky
54
+ # Time objects are precise to the millisecond
55
+ # we cheat by converting to string, which is only accurate to the second
56
+ # but if these test are run on a second boundary, they might wrongly fail
57
+ #
58
+ context 'start_time is in the past' do
59
+ before do
60
+ @now = Time.iso8601(Time.now.utc.iso8601)
61
+ end
62
+
63
+ describe 'and it is an exact multiple of self.periods until now' do
64
+ it 'should return now' do
65
+ # get current time after rounding error
66
+ @schedule.reference_time = @now
67
+ @schedule.start_time = (@now - 30.minutes).iso8601
68
+ @schedule.period = 10.minutes
69
+ @schedule.next_start.should == @now
70
+ end
71
+ end
72
+
73
+ context 'Time since self.start_time is not even multiple of self.period' do
74
+ describe 'one interval has passed' do
75
+ before do
76
+ @schedule.start_time = (@now - 11.minutes).iso8601
77
+ @schedule.period = 10.minutes
78
+ end
79
+
80
+ it 'should return a time less than one interval in the future' do
81
+ @schedule.next_start.should < @now + @schedule.period
82
+ end
83
+
84
+ it 'should return a time one interval from the start_time' do
85
+ @schedule.next_start.to_s.should == (@now + 9.minutes).to_s
86
+ end
87
+ end
88
+
89
+ describe 'several (e.g. 4) intervals have passed' do
90
+ before do
91
+ @schedule.start_time = (@now - 45.minutes).iso8601
92
+ @schedule.period = 10.minutes
93
+ end
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)
97
+ end
98
+
99
+ it 'should return a start time within 1 period from now' do
100
+ @schedule.next_start.should < @now + @schedule.period
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+
107
+ describe '#schedule=' do
108
+ context 'supplied start time has elapsed w/rt current interval' do
109
+
110
+ describe 'with hourly frequency' do
111
+ it "should advance the start time" do
112
+ half_past_midnight = Time.iso8601("2011-05-09T00:30:00Z")
113
+ hourly_at_quarter_past = {"frequency"=>"hourly", "start"=>{"minutes"=>"15"}}
114
+ quarter_past_1_am = '2011-05-09T01:15:00Z'
115
+
116
+ @schedule.reference_time = half_past_midnight
117
+ @schedule.start_time.should_not == quarter_past_1_am
118
+ @schedule.schedule = hourly_at_quarter_past
119
+ @schedule.start_time.should == quarter_past_1_am
120
+ end
121
+ end
122
+
123
+ describe 'with daily frequency' do
124
+ it "should advance the start time" do
125
+ today_at_noon = Time.iso8601("2011-05-09T12:00:00Z")
126
+ tomorrow_at_eleven_am = '2011-05-10T11:00:00Z'
127
+ daily_at_11_am = {"frequency"=>"daily", "start"=>{"hours" => "11", "minutes"=>"00"}}
128
+
129
+ @schedule.reference_time = today_at_noon
130
+ @schedule.start_time.should_not == tomorrow_at_eleven_am
131
+ @schedule.schedule = daily_at_11_am
132
+ @schedule.start_time.should == tomorrow_at_eleven_am
133
+ end
134
+ end
135
+
136
+ describe 'with weekly frequency' do
137
+ it "should advance the start time" do
138
+ # note: Rails week starts on Monday
139
+ friday_of_this_week = Time.iso8601("2011-05-13T00:00:00Z")
140
+ wednesday_of_next_week = '2011-05-18T00:00:00Z'
141
+ weekly_on_wednesday = {"frequency"=>"weekly", "start"=>{"days" => "2", "hours" => "0", "minutes"=>"00"}}
142
+
143
+ # just make sure I'm not on crack
144
+ friday_of_this_week.weekday.should == 'Friday'
145
+ wednesday_of_next_week.weekday.should == 'Wednesday'
146
+
147
+ @schedule.reference_time = friday_of_this_week
148
+ @schedule.start_time.should_not == wednesday_of_next_week
149
+ @schedule.schedule = weekly_on_wednesday
150
+ @schedule.start_time.should == wednesday_of_next_week
151
+ end
152
+ end
153
+ end
154
+
155
+ context 'supplied time has not elapsed w/rt current interval' do
156
+ describe 'with hourly frequency' do
157
+ it "should not advance the start time" do
158
+ half_past_midnight = Time.iso8601("2011-05-09T00:30:00Z")
159
+ three_quarters_past_midnight = '2011-05-09T00:45:00Z'
160
+ hourly_at_three_quarters_past = {"frequency"=>"hourly", "start"=>{"minutes"=>"45"}}
161
+
162
+ @schedule.reference_time = half_past_midnight
163
+
164
+ @schedule.start_time.should_not == three_quarters_past_midnight
165
+ @schedule.schedule = hourly_at_three_quarters_past
166
+ @schedule.start_time.should == three_quarters_past_midnight
167
+ end
168
+ end
169
+
170
+ describe 'with daily frequency' do
171
+ it "should not advance the start time" do
172
+ today_at_noon = Time.iso8601("2011-05-09T12:00:00Z")
173
+ today_at_1pm = '2011-05-09T13:00:00Z'
174
+ daily_at_1pm = {"frequency"=>"daily", "start"=>{"hours" => "13", "minutes"=>"00"}}
175
+
176
+ @schedule.reference_time = today_at_noon
177
+ @schedule.start_time.should_not == today_at_1pm
178
+ @schedule.schedule = daily_at_1pm
179
+ @schedule.start_time.should == today_at_1pm
180
+ end
181
+ end
182
+
183
+ describe 'with weekly frequency' do
184
+ it "should not advance the start time" do
185
+ # note: Rails week starts on Monday
186
+ wednesday_of_this_week = Time.iso8601("2011-05-11T00:00:00Z")
187
+ thursday_of_this_week = '2011-05-12T00:00:00Z'
188
+ weekly_on_thursday = {"frequency"=>"weekly", "start"=>{"days" => "3", "hours" => "0", "minutes"=>"00"}}
189
+
190
+ # just make sure I'm not on crack
191
+ wednesday_of_this_week.weekday.should == 'Wednesday'
192
+ thursday_of_this_week.weekday.should == 'Thursday'
193
+
194
+ @schedule.reference_time = wednesday_of_this_week
195
+ @schedule.start_time.should_not == thursday_of_this_week
196
+ @schedule.schedule = weekly_on_thursday
197
+ @schedule.start_time.should == thursday_of_this_week
198
+ end
199
+ end
200
+ end
201
+ end
202
+ end
@@ -9,7 +9,7 @@ describe Time do
9
9
 
10
10
  describe "#iso8601" do
11
11
  it "should generate a time with a 4 digit timezone" do
12
- Time.utc(2011, 4, 15, 20, 11, 56).localtime.iso8601.should == "2011-04-15T13:11:56-0700"
12
+ Time.new(2011, 4, 15, 13, 11, 56, "-07:00").iso8601.should == "2011-04-15T13:11:56-0700"
13
13
  end
14
14
  end
15
15
  end
@@ -6,8 +6,9 @@ describe LucidWorks::Schema do
6
6
  @schema.instance_eval do
7
7
  attribute :astring, :string, :primary_key => true
8
8
  attribute :abool, :boolean
9
- attributes :bar, :baz, :type => :integer
9
+ attributes :anint, :baz, :type => :integer
10
10
  attribute :nullstring, :string, :nil_when_blank => true
11
+ attribute :time, :iso8601
11
12
  end
12
13
  end
13
14
 
@@ -29,7 +30,7 @@ describe LucidWorks::Schema do
29
30
  end
30
31
  end
31
32
 
32
- [:string, :integer, :boolean].each do |attr_type|
33
+ [:string, :integer, :boolean, :iso8601].each do |attr_type|
33
34
  it "should allow type #{attr_type}" do
34
35
  @schema.attribute :foo, attr_type
35
36
  @schema[:foo][:type].should == attr_type
@@ -41,10 +42,11 @@ describe LucidWorks::Schema do
41
42
  it "should process the block in its context and create an attribute list" do
42
43
  @schema.should == {
43
44
  'astring' => {'type' => :string},
44
- 'bar' => {'type' => :integer},
45
+ 'anint' => {'type' => :integer},
45
46
  'baz' => {'type' => :integer},
46
47
  'abool' => {'type' => :boolean},
47
- 'nullstring' => {'type' => :string, 'nil_when_blank' => true}
48
+ 'nullstring' => {'type' => :string, 'nil_when_blank' => true},
49
+ 'time' => {'type' => :iso8601}
48
50
  }
49
51
  @schema.primary_key.should == :astring
50
52
  end
@@ -98,7 +100,7 @@ describe LucidWorks::Schema do
98
100
 
99
101
  it "should add readers and writers for all attributes" do
100
102
  ClassWithAddedAccessors.new.should respond_to(:astring, :astring=)
101
- ClassWithAddedAccessors.new.should respond_to(:bar, :bar=)
103
+ ClassWithAddedAccessors.new.should respond_to(:anint, :anint=)
102
104
  ClassWithAddedAccessors.new.should respond_to(:abool, :abool=)
103
105
  end
104
106
 
@@ -121,6 +123,13 @@ describe LucidWorks::Schema do
121
123
  end
122
124
  end
123
125
 
126
+ context "for an integer attribute" do
127
+ it "setter should convert strings to integers" do
128
+ @model.anint = "1234"
129
+ @model.anint.should == 1234
130
+ end
131
+ end
132
+
124
133
  context "for a string attribute" do
125
134
  context "without :nil_when_blank => true" do
126
135
  it "setter save the empty string" do
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.3
5
+ version: 0.6.4
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-06 00:00:00 -07:00
13
+ date: 2011-05-13 00:00:00 -07:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -144,6 +144,7 @@ files:
144
144
  - spec/lib/lucid_works/collection/prime_activities_spec.rb
145
145
  - spec/lib/lucid_works/collection_spec.rb
146
146
  - spec/lib/lucid_works/datasource/history_spec.rb
147
+ - spec/lib/lucid_works/datasource/schedule_spec.rb
147
148
  - spec/lib/lucid_works/datasource/status_spec.rb
148
149
  - spec/lib/lucid_works/datasource_spec.rb
149
150
  - spec/lib/lucid_works/field_spec.rb
@@ -191,6 +192,7 @@ test_files:
191
192
  - spec/lib/lucid_works/collection/prime_activities_spec.rb
192
193
  - spec/lib/lucid_works/collection_spec.rb
193
194
  - spec/lib/lucid_works/datasource/history_spec.rb
195
+ - spec/lib/lucid_works/datasource/schedule_spec.rb
194
196
  - spec/lib/lucid_works/datasource/status_spec.rb
195
197
  - spec/lib/lucid_works/datasource_spec.rb
196
198
  - spec/lib/lucid_works/field_spec.rb