lucid_works 0.4.9 → 0.5.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +1 -0
- data/config/locales/en.yml +13 -0
- data/lib/lucid_works/base.rb +5 -1
- data/lib/lucid_works/datasource.rb +21 -4
- data/lib/lucid_works/patch_time.rb +6 -0
- data/lib/lucid_works/schema.rb +11 -1
- data/lib/lucid_works/version.rb +1 -1
- data/spec/lib/lucid_works/base_spec.rb +64 -2
- data/spec/lib/lucid_works/patch_time_spec.rb +15 -0
- data/spec/lib/lucid_works/schema_spec.rb +57 -10
- metadata +4 -2
data/README.rdoc
CHANGED
@@ -271,6 +271,7 @@ A class may have a schema defined as follows:
|
|
271
271
|
attributes :int2, :int3, :type => :integer
|
272
272
|
attribute :string_with_values, :values => ['one', 'two']
|
273
273
|
attribute :dontsendme, :omit_during_update => true
|
274
|
+
attribute :sendnull, :string, :nil_when_blank => true
|
274
275
|
end
|
275
276
|
end
|
276
277
|
|
data/config/locales/en.yml
CHANGED
@@ -113,3 +113,16 @@ en:
|
|
113
113
|
numUnchanged: Unchanged docs
|
114
114
|
numFailed: Failed docs
|
115
115
|
numTotal: Total docs
|
116
|
+
sharepointUrl: SharePoint URL
|
117
|
+
connectorType: Connector Type
|
118
|
+
authorization: Authorization
|
119
|
+
username: Username
|
120
|
+
password: Password
|
121
|
+
domain: Domain
|
122
|
+
mySiteBaseURL: MySite URL
|
123
|
+
includedURls: Included URLs
|
124
|
+
excludedURls: Excluded URLs
|
125
|
+
kdcserver: Kerberos KDC server
|
126
|
+
useSPSearchVisibility: Use SP Search Visibility
|
127
|
+
aliases: Site Aliases Mappings
|
128
|
+
|
data/lib/lucid_works/base.rb
CHANGED
@@ -39,6 +39,7 @@ module LucidWorks
|
|
39
39
|
attr_writer :persisted # :nodoc:
|
40
40
|
attr_accessor :raw_response # :nodoc:
|
41
41
|
attr_accessor :response_data # :nodoc:
|
42
|
+
attr_reader :attributes # :nodoc:
|
42
43
|
|
43
44
|
define_model_callbacks :save, :only => [:before, :after]
|
44
45
|
|
@@ -268,7 +269,9 @@ module LucidWorks
|
|
268
269
|
@persisted = true
|
269
270
|
load_attributes_from_json_string(response)
|
270
271
|
true
|
271
|
-
rescue RestClient::
|
272
|
+
rescue RestClient::Conflict, # 409
|
273
|
+
RestClient::UnprocessableEntity, # 422
|
274
|
+
RestClient::InternalServerError => e # 500
|
272
275
|
payload[:exception] = e
|
273
276
|
attach_errors_to_model(e.response)
|
274
277
|
false
|
@@ -381,6 +384,7 @@ module LucidWorks
|
|
381
384
|
if data.is_a?(Hash) && data['errors']
|
382
385
|
data['errors'].each do |error|
|
383
386
|
key = error['key'].blank? ? 'base' : error['key']
|
387
|
+
# When core implements FOCUS-2262 start checking for error['code'] and lookup a translation.
|
384
388
|
self.errors.add(key, error['message'])
|
385
389
|
end
|
386
390
|
end
|
@@ -10,6 +10,7 @@ module LucidWorks
|
|
10
10
|
# common
|
11
11
|
attributes :name, :type, :crawler
|
12
12
|
attributes :crawl_depth, :max_bytes, :max_docs, :type => :integer
|
13
|
+
#attribute :commitWithin, :integer
|
13
14
|
attribute :include_paths
|
14
15
|
attribute :exclude_paths
|
15
16
|
attribute :mapping # Hash
|
@@ -20,12 +21,26 @@ module LucidWorks
|
|
20
21
|
# file
|
21
22
|
attribute :path
|
22
23
|
attribute :follow_links, :boolean
|
23
|
-
|
24
|
-
|
25
|
-
|
24
|
+
# sharepoint
|
25
|
+
attribute :sharepointUrl
|
26
|
+
attribute :connectorType
|
27
|
+
attribute :authorization
|
28
|
+
attribute :username
|
29
|
+
attribute :password
|
30
|
+
attribute :domain
|
31
|
+
attribute :mySiteBaseURL, :string, :nil_when_blank => true
|
32
|
+
attribute :includedURls
|
33
|
+
attribute :excludedURls
|
34
|
+
attribute :kdcserver
|
35
|
+
attribute :useSPSearchVisibility, :boolean
|
36
|
+
attribute :aliases
|
37
|
+
# external
|
38
|
+
attribute :source
|
39
|
+
attribute :source_type
|
26
40
|
end
|
27
41
|
|
28
|
-
validates_presence_of :type, :crawler, :name
|
42
|
+
validates_presence_of :type, :crawler, :name
|
43
|
+
validates_presence_of :crawl_depth, :unless => lambda { |d| %w{external sharepoint}.include?(d.type) }
|
29
44
|
validates_numericality_of :max_bytes, :allow_blank => true
|
30
45
|
validates_presence_of :url, :if => lambda { |d| d.type == 'web' }
|
31
46
|
|
@@ -37,6 +52,8 @@ module LucidWorks
|
|
37
52
|
# Later we may change these to be arrays if we decide to support more than one choice
|
38
53
|
# e.g. :web => ['lucid.aperture', 'nutch']
|
39
54
|
:file => 'lucid.aperture',
|
55
|
+
:lwelogs => 'licid.lwelogs',
|
56
|
+
:external => 'lucid.external',
|
40
57
|
:web => 'lucid.aperture',
|
41
58
|
:solrxml => 'lucid.solrxml',
|
42
59
|
:jdbc => 'lucid.jdbc',
|
@@ -10,4 +10,10 @@ class Time
|
|
10
10
|
|
11
11
|
alias_method_chain :iso8601, :support_for_timezones_without_colons
|
12
12
|
end
|
13
|
+
|
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'
|
16
|
+
end
|
17
|
+
|
18
|
+
alias_method_chain :iso8601, :support_for_timezones_without_colons
|
13
19
|
end
|
data/lib/lucid_works/schema.rb
CHANGED
@@ -2,6 +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
6
|
|
6
7
|
def initialize
|
7
8
|
@primary_key = :id
|
@@ -24,6 +25,7 @@ module LucidWorks
|
|
24
25
|
alias :dynamic_attributes? :dynamic_attributes
|
25
26
|
|
26
27
|
def attribute(name, type=:string, options={})
|
28
|
+
raise "Unknown attribute type: #{type.inspect}" unless ATTRIBUTES_TYPES.include?(type)
|
27
29
|
primary_key name if options.delete(:primary_key)
|
28
30
|
self[name] = options.merge(:type => type)
|
29
31
|
end
|
@@ -73,7 +75,8 @@ module LucidWorks
|
|
73
75
|
end # end
|
74
76
|
EOF
|
75
77
|
|
76
|
-
|
78
|
+
case self[attribute][:type]
|
79
|
+
when :boolean
|
77
80
|
klass.class_eval <<-EOF, __FILE__, __LINE__+1
|
78
81
|
def #{attribute}? # def foo?
|
79
82
|
@attributes[:#{attribute}] # @attributes[:foo]
|
@@ -83,6 +86,13 @@ module LucidWorks
|
|
83
86
|
@attributes[:#{attribute}] = to_bool(new_value) # @attributes[:foo] = to_bool(new_value)
|
84
87
|
end # end
|
85
88
|
EOF
|
89
|
+
when :string
|
90
|
+
klass.class_eval <<-EOF, __FILE__, __LINE__+1
|
91
|
+
def #{attribute}=(new_value) # def foo=(new_value)
|
92
|
+
new_value = nil if new_value.blank? && self.class.schema[:#{attribute}][:nil_when_blank]
|
93
|
+
@attributes[:#{attribute}] = new_value # @attributes[:foo] = new_value
|
94
|
+
end # end
|
95
|
+
EOF
|
86
96
|
else
|
87
97
|
klass.class_eval <<-EOF, __FILE__, __LINE__+1
|
88
98
|
def #{attribute}=(new_value) # def foo=(new_value)
|
data/lib/lucid_works/version.rb
CHANGED
@@ -395,7 +395,6 @@ describe LucidWorks::Base do
|
|
395
395
|
before :all do
|
396
396
|
@widget_attrs = { :name => '', :size => ''}
|
397
397
|
ERROR_422_RESPONSE = '{"errors":[{"message":"name is a required key","key":"name"},{"message":"name must consist of only A-Z a-z 0-9 - _","key":"name"}],"http_status_name":"Unprocessable Entity","http_status_code":422}'
|
398
|
-
# ERROR_500_RESPONSE = '{"errors":[{"message":"The server encountered an unexpected condition which prevented it from fulfilling the request","key":""}],"http_status_name":"Internal Server Error","http_status_code":500}'
|
399
398
|
RestClient.stub(:post) {
|
400
399
|
e = RestClient::UnprocessableEntity.new
|
401
400
|
e.response = ERROR_422_RESPONSE
|
@@ -486,6 +485,67 @@ describe LucidWorks::Base do
|
|
486
485
|
@widget_with_omit.save
|
487
486
|
end
|
488
487
|
end
|
488
|
+
|
489
|
+
describe "error processing" do
|
490
|
+
before do
|
491
|
+
@widget_attrs = { :foo => "bar", :bar => "baz" }
|
492
|
+
@widget = Widget.new @widget_attrs.merge(:parent => @server)
|
493
|
+
end
|
494
|
+
|
495
|
+
context "for an attempt that returns attr errors and global errors" do
|
496
|
+
before do
|
497
|
+
response = '{"errors":[{"message":"foo err 1","key":"foo"},' +
|
498
|
+
'{"message":"foo err 2","key":"foo"},' +
|
499
|
+
'{"message":"bar err 1","key":"bar"},' +
|
500
|
+
'{"message":"global err 1","key":""},' +
|
501
|
+
'{"message":"global err 2","key":""}],' +
|
502
|
+
'"http_status_name":"Unprocessable Entity","http_status_code":422}'
|
503
|
+
RestClient.stub(:post) {
|
504
|
+
e = RestClient::UnprocessableEntity.new
|
505
|
+
e.response = response
|
506
|
+
raise e
|
507
|
+
}
|
508
|
+
@widget.save.should be_false
|
509
|
+
end
|
510
|
+
|
511
|
+
it "should attach the attr errors to their respective attributes" do
|
512
|
+
@widget.errors[:foo].should == ["foo err 1", "foo err 2"]
|
513
|
+
@widget.errors[:bar].should == ["bar err 1"]
|
514
|
+
end
|
515
|
+
|
516
|
+
it "should attach global errors to :base" do
|
517
|
+
@widget.errors[:base].should == ["global err 1", "global err 2"]
|
518
|
+
end
|
519
|
+
end
|
520
|
+
end
|
521
|
+
|
522
|
+
describe "exception handling" do
|
523
|
+
before do
|
524
|
+
@widget_attrs = { :foo => "bar", :bar => "baz" }
|
525
|
+
@widget = Widget.new @widget_attrs.merge(:parent => @server)
|
526
|
+
end
|
527
|
+
|
528
|
+
it "should catch 409 errors" do
|
529
|
+
RestClient.stub(:post) { raise RestClient::Conflict.new }
|
530
|
+
lambda {
|
531
|
+
@widget.save.should be_false
|
532
|
+
}.should_not raise_error
|
533
|
+
end
|
534
|
+
|
535
|
+
it "should catch 422 errors" do
|
536
|
+
RestClient.stub(:post) { raise RestClient::UnprocessableEntity.new }
|
537
|
+
lambda {
|
538
|
+
@widget.save.should be_false
|
539
|
+
}.should_not raise_error
|
540
|
+
end
|
541
|
+
|
542
|
+
it "should catch 500 errors" do
|
543
|
+
RestClient.stub(:post) { raise RestClient::InternalServerError.new }
|
544
|
+
lambda {
|
545
|
+
@widget.save.should be_false
|
546
|
+
}.should_not raise_error
|
547
|
+
end
|
548
|
+
end
|
489
549
|
end
|
490
550
|
|
491
551
|
describe "#update_attributes" do
|
@@ -513,7 +573,9 @@ describe LucidWorks::Base do
|
|
513
573
|
|
514
574
|
describe "#human_attribute_value" do
|
515
575
|
it "should call class.human_attribute_value with attribute name and value" do
|
516
|
-
|
576
|
+
widget = Widget.new(:myattr => 'foo', :parent => @server)
|
577
|
+
Widget.should_receive(:human_attribute_value).with(:myattr, 'foo')
|
578
|
+
widget.human_attribute_value(:myattr)
|
517
579
|
end
|
518
580
|
end
|
519
581
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Time do
|
4
|
+
describe ".iso8601" do
|
5
|
+
it "should be able to parse a time with a 4 digit timezone" do
|
6
|
+
Time.iso8601("2011-04-15T13:11:56-0700").should == Time.utc(2011, 4, 15, 20, 11, 56)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "#iso8601" do
|
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"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -4,21 +4,49 @@ describe LucidWorks::Schema do
|
|
4
4
|
before do
|
5
5
|
@schema = LucidWorks::Schema.new
|
6
6
|
@schema.instance_eval do
|
7
|
-
attribute :
|
7
|
+
attribute :astring, :string, :primary_key => true
|
8
8
|
attribute :abool, :boolean
|
9
9
|
attributes :bar, :baz, :type => :integer
|
10
|
+
attribute :nullstring, :string, :nil_when_blank => true
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "#attribute" do
|
15
|
+
before { @schema = LucidWorks::Schema.new }
|
16
|
+
|
17
|
+
describe "using default type" do
|
18
|
+
it "should create a string attribute" do
|
19
|
+
@schema.attribute :foo
|
20
|
+
@schema[:foo][:type].should == :string
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "with a bad type" do
|
25
|
+
it "should raise an error" do
|
26
|
+
lambda {
|
27
|
+
@schema.attribute :foo, :badtype
|
28
|
+
}.should raise_error
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
[:string, :integer, :boolean].each do |attr_type|
|
33
|
+
it "should allow type #{attr_type}" do
|
34
|
+
@schema.attribute :foo, attr_type
|
35
|
+
@schema[:foo][:type].should == attr_type
|
36
|
+
end
|
10
37
|
end
|
11
38
|
end
|
12
39
|
|
13
40
|
describe "instance_eval" do
|
14
41
|
it "should process the block in its context and create an attribute list" do
|
15
42
|
@schema.should == {
|
16
|
-
'
|
17
|
-
'bar'
|
18
|
-
'baz'
|
19
|
-
'abool'
|
43
|
+
'astring' => {'type' => :string},
|
44
|
+
'bar' => {'type' => :integer},
|
45
|
+
'baz' => {'type' => :integer},
|
46
|
+
'abool' => {'type' => :boolean},
|
47
|
+
'nullstring' => {'type' => :string, 'nil_when_blank' => true}
|
20
48
|
}
|
21
|
-
@schema.primary_key.should == :
|
49
|
+
@schema.primary_key.should == :astring
|
22
50
|
end
|
23
51
|
end
|
24
52
|
|
@@ -30,8 +58,8 @@ describe LucidWorks::Schema do
|
|
30
58
|
context "when given an argument" do
|
31
59
|
it "should set the primary key to the provided value" do
|
32
60
|
schema = LucidWorks::Schema.new
|
33
|
-
schema.primary_key '
|
34
|
-
schema.primary_key.should == :
|
61
|
+
schema.primary_key 'astring'
|
62
|
+
schema.primary_key.should == :astring
|
35
63
|
end
|
36
64
|
end
|
37
65
|
end
|
@@ -55,17 +83,21 @@ describe LucidWorks::Schema do
|
|
55
83
|
before do
|
56
84
|
class ClassWithAddedAccessors
|
57
85
|
include LucidWorks::Utils::BoolConverter
|
86
|
+
class << self
|
87
|
+
attr_accessor :schema
|
88
|
+
end
|
58
89
|
attr_accessor :attributes
|
59
90
|
def initialize
|
60
91
|
@attributes = {}
|
61
92
|
end
|
62
93
|
end
|
94
|
+
ClassWithAddedAccessors.schema = @schema
|
63
95
|
@schema.create_accessors_for_attributes(ClassWithAddedAccessors)
|
64
96
|
@model = ClassWithAddedAccessors.new
|
65
97
|
end
|
66
98
|
|
67
99
|
it "should add readers and writers for all attributes" do
|
68
|
-
ClassWithAddedAccessors.new.should respond_to(:
|
100
|
+
ClassWithAddedAccessors.new.should respond_to(:astring, :astring=)
|
69
101
|
ClassWithAddedAccessors.new.should respond_to(:bar, :bar=)
|
70
102
|
ClassWithAddedAccessors.new.should respond_to(:abool, :abool=)
|
71
103
|
end
|
@@ -88,11 +120,26 @@ describe LucidWorks::Schema do
|
|
88
120
|
end
|
89
121
|
end
|
90
122
|
end
|
123
|
+
|
124
|
+
context "for a string attribute" do
|
125
|
+
context "without :nil_when_blank => true" do
|
126
|
+
it "setter save the empty string" do
|
127
|
+
@model.astring = ""
|
128
|
+
@model.astring.should == ""
|
129
|
+
end
|
130
|
+
end
|
131
|
+
context "with :nil_when_blank => true" do
|
132
|
+
it "setter should convert blank to nil" do
|
133
|
+
@model.nullstring = ""
|
134
|
+
@model.nullstring.should be_nil
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
91
138
|
end
|
92
139
|
|
93
140
|
describe "#has_attribute?" do
|
94
141
|
it "should return true if the schema has that attribute" do
|
95
|
-
@schema.has_attribute?(:
|
142
|
+
@schema.has_attribute?(:astring).should be_true
|
96
143
|
end
|
97
144
|
|
98
145
|
it "should return false if the schema does not have that attribute" 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.
|
5
|
+
version: 0.5.3
|
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-04-
|
13
|
+
date: 2011-04-15 00:00:00 -07:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -142,6 +142,7 @@ files:
|
|
142
142
|
- spec/lib/lucid_works/datasource/status_spec.rb
|
143
143
|
- spec/lib/lucid_works/datasource_spec.rb
|
144
144
|
- spec/lib/lucid_works/field_spec.rb
|
145
|
+
- spec/lib/lucid_works/patch_time_spec.rb
|
145
146
|
- spec/lib/lucid_works/schema_spec.rb
|
146
147
|
- spec/lib/lucid_works/server_spec.rb
|
147
148
|
- spec/lib/lucid_works/utils_spec.rb
|
@@ -186,6 +187,7 @@ test_files:
|
|
186
187
|
- spec/lib/lucid_works/datasource/status_spec.rb
|
187
188
|
- spec/lib/lucid_works/datasource_spec.rb
|
188
189
|
- spec/lib/lucid_works/field_spec.rb
|
190
|
+
- spec/lib/lucid_works/patch_time_spec.rb
|
189
191
|
- spec/lib/lucid_works/schema_spec.rb
|
190
192
|
- spec/lib/lucid_works/server_spec.rb
|
191
193
|
- spec/lib/lucid_works/utils_spec.rb
|