lucid_works 0.7.18 → 0.9.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.
Files changed (68) hide show
  1. data/.rvmrc +2 -3
  2. data/Gemfile +2 -8
  3. data/Gemfile.lock +45 -53
  4. data/README.rdoc +2 -6
  5. data/Rakefile +1 -1
  6. data/config/locales/en.yml +221 -239
  7. data/lib/lucid_works/activity.rb +8 -5
  8. data/lib/lucid_works/base.rb +27 -16
  9. data/lib/lucid_works/cache.rb +13 -0
  10. data/lib/lucid_works/cluster.rb +84 -0
  11. data/lib/lucid_works/collection/settings.rb +15 -6
  12. data/lib/lucid_works/collection.rb +62 -92
  13. data/lib/lucid_works/datasource/history.rb +2 -1
  14. data/lib/lucid_works/datasource/mapping.rb +12 -0
  15. data/lib/lucid_works/datasource/schedule.rb +5 -2
  16. data/lib/lucid_works/datasource/status.rb +3 -2
  17. data/lib/lucid_works/datasource.rb +31 -48
  18. data/lib/lucid_works/datasource_property.rb +2 -1
  19. data/lib/lucid_works/datasource_type.rb +14 -0
  20. data/lib/lucid_works/dynamicfield.rb +12 -0
  21. data/lib/lucid_works/elevation.rb +93 -0
  22. data/lib/lucid_works/exceptions.rb +0 -4
  23. data/lib/lucid_works/field.rb +31 -111
  24. data/lib/lucid_works/field_commons.rb +133 -0
  25. data/lib/lucid_works/gem_version.rb +1 -1
  26. data/lib/lucid_works/inflections.rb +3 -0
  27. data/lib/lucid_works/patch_time.rb +4 -0
  28. data/lib/lucid_works/request_handler.rb +16 -0
  29. data/lib/lucid_works/role.rb +23 -8
  30. data/lib/lucid_works/schema/attribute.rb +1 -1
  31. data/lib/lucid_works/schema/boolean_attribute.rb +1 -1
  32. data/lib/lucid_works/schema/integer_attribute.rb +3 -4
  33. data/lib/lucid_works/server/crawlers_status.rb +15 -0
  34. data/lib/lucid_works/server.rb +35 -14
  35. data/lib/lucid_works/simple_naming.rb +1 -7
  36. data/lib/lucid_works/synonym.rb +1 -1
  37. data/lib/lucid_works/version.rb +1 -0
  38. data/lib/lucid_works.rb +8 -1
  39. data/lucid_works.gemspec +8 -9
  40. data/spec/fixtures/zookeeper/clusterstate.json +30 -0
  41. data/spec/fixtures/zookeeper/clusterstate_broken_shard.json +29 -0
  42. data/spec/fixtures/zookeeper/live_nodes.json +28 -0
  43. data/spec/fixtures/zookeeper/live_nodes_no_children.json +26 -0
  44. data/spec/fixtures/zookeeper/live_nodes_one_child.json +36 -0
  45. data/spec/lib/lucid_works/base_spec.rb +33 -24
  46. data/spec/lib/lucid_works/cache_spec.rb +44 -0
  47. data/spec/lib/lucid_works/cluster_spec.rb +109 -0
  48. data/spec/lib/lucid_works/collection/activity_spec.rb +29 -0
  49. data/spec/lib/lucid_works/collection/prime_activities_spec.rb +1 -1
  50. data/spec/lib/lucid_works/collection/settings_spec.rb +31 -0
  51. data/spec/lib/lucid_works/collection_spec.rb +166 -107
  52. data/spec/lib/lucid_works/datasource/schedule_spec.rb +75 -46
  53. data/spec/lib/lucid_works/datasource/status_spec.rb +5 -5
  54. data/spec/lib/lucid_works/datasource_property_spec.rb +41 -0
  55. data/spec/lib/lucid_works/datasource_spec.rb +40 -12
  56. data/spec/lib/lucid_works/datasource_type_spec.rb +31 -0
  57. data/spec/lib/lucid_works/dynamicfield_spec.rb +214 -0
  58. data/spec/lib/lucid_works/elevation_spec.rb +175 -0
  59. data/spec/lib/lucid_works/field_spec.rb +52 -21
  60. data/spec/lib/lucid_works/fieldtype_spec.rb +0 -1
  61. data/spec/lib/lucid_works/request_handler_spec.rb +11 -0
  62. data/spec/lib/lucid_works/role_spec.rb +77 -0
  63. data/spec/lib/lucid_works/server/crawlers_status_spec.rb +21 -0
  64. data/spec/lib/lucid_works/server_spec.rb +123 -22
  65. data/spec/lib/lucid_works/{collection/synonym_spec.rb → synonym_spec.rb} +23 -22
  66. data/spec/lib/lucid_works/version_spec.rb +6 -0
  67. metadata +132 -64
  68. data/spec/lib/lucid_works/collection/acl_config_spec.rb +0 -212
@@ -6,140 +6,187 @@ en:
6
6
  # and is used by human_attribute_name
7
7
  #
8
8
  attributes:
9
- lucid_works:
10
- collection:
11
- info:
12
- collection_name: Collection name
13
- data_dir: Data directory
14
- free_disk_bytes: Free disk bytes
15
- free_disk_space: Free disk space
16
- index_directory: Index directory
17
- index_has_deletions: Index has deletions
18
- index_is_current: Index is current
19
- index_is_optimized: Optimized
20
- index_last_modified: Index last modified
21
- index_max_doc: Index max doc
22
- index_num_docs: Documents indexed
23
- index_size: Index size
24
- index_size_bytes: Index size
25
- index_version: Index version
26
- instance_dir: Instance directory
27
- root_dir: Root directory
28
- total_disk_bytes: Total disk bytes
29
- total_disk_space: Total disk space
30
- name: Name
31
- settings:
32
- auto_complete: Auto complete
33
- boost_recent: Boost recent
34
- boosts: Boosts
35
- click_boost_data: Click boost data
36
- click_boost_field: Click boost field
37
- click_enabled: Click scoring enabled
38
- de_duplication: De-duplication
39
- default_sort: Default sort
40
- display_facets: Display facets
41
- elevations: elevations
42
- index_time_stopwords: Exclude stop words from index
43
- query_parser: Query parser
44
- query_time_stopwords: Include stop words in searches
45
- query_time_synonyms: Use synonyms
46
- search_server_list: Search server list
47
- show_similar: Show "find similar" links
48
- spellcheck: Spell-check
49
- ssl: SSL
50
- stopword_list: Stopword list
51
- synonym_list: Synonym list
52
- unknown_type_handling: Default field type
53
- unsupervised_feedback: Unsupervised feedback
54
- unsupervised_feedback_emphasis: Unsupervised feedback emphasis
55
- update_server_list: Update server list
56
- datasource:
57
- subtype:
58
- web:
59
- url: Custom legend for url
60
- aliases: Site Aliases Mappings
61
- auth: Authentication credentials
62
- authorization: Authorization
63
- bounds: Constrain to
64
- commit_on_finish: Commit when crawl finishes
65
- commit_within: Commit within
66
- commit_within_min: Commit within (minutes)
67
- connector_type: Connector Type
68
- deleteAfter: Delete logs after
69
- domain: Domain
70
- excluded_urls: Excluded URLs
71
- fail_unsupported_file_types: Fail unsupported file types
72
- history:
73
- crawl_started: Started
74
- crawl_state: State
75
- crawl_stopped: Stopped
76
- num_deleted: Deleted
77
- num_failed: Failed
78
- num_new: New
79
- num_unchanged: Unchanged
80
- num_updated: Updated
81
- host: Domain Name
82
- ignore_robots: Ignore robots.txt
83
- include_datasource_metadata: Include data source metadata
84
- included_urls: Included URLs
85
- kdcserver: Kerberos KDC server
86
- log_extra_detail: Log extra detail
87
- max_bytes: Skip files larger than (bytes)
88
- my_site_base_url: MySite URL
89
- password: Password
90
- proxy_host: Proxy host
91
- proxy_password: Proxy password
92
- proxy_port: Proxy port
93
- proxy_username: Proxy user name
94
- realm: Realm
95
- sharepoint_url: SharePoint URL
96
- status:
97
- crawl_started: Last crawl started
98
- crawl_state: State
99
- crawl_stopped: Last crawl stopped
100
- doc_count: Documents indexed
101
- job_id: Job ID
102
- num_deleted: Deleted docs
103
- num_failed: Failed docs
104
- num_new: New docs
105
- num_total: Total docs
106
- num_unchanged: Unchanged docs
107
- num_updated: Updated docs
108
- type: Type
109
- url: URL
110
- use_sp_search_visibility: Use SP Search Visibility
111
- username: Username
112
- warn_unknown_mime_types: Log warnings for unknown mime types
113
- windowsdomain: Windows domain
114
- field:
115
- copy_fields: Copy this field to fields
116
- default_boost: Default boost
117
- default_value: Default value
118
- dynamic_base: Dynamically generated from
119
- editable: Editable
120
- facet: Facet
121
- field_type: Field type
122
- highlight: Highlight
123
- include_in_results: Include in results
124
- index_for_autocomplete: Index for autocomplete
125
- index_for_spellcheck: Index for spell checking
126
- indexing_options: Index term frequencies and positions
127
- indexed: Indexed
128
- multi_valued: Multi-valued
129
- name: Name
130
- omit_positions: Omit positions
131
- omit_tf: Omit term frequencies and positions
132
- query_time_stopword_handling: Enable stopword handling
133
- search_by_default: Search by default
134
- short_field_boost: Short field boost
135
- stored: Stored
136
- synonym_expasion: Enable synonym expansion
137
- term_vectors: Term vectors
138
- use_for_deduplication: Use for de-duplication
139
- use_in_find_similar: Use in 'find similar'
140
- fieldtype:
141
- name: Name
142
- _class: Class
9
+ collection:
10
+ name: Name
11
+ num_shards: Number of shards
12
+ collection/info:
13
+ collection_name: Collection name
14
+ data_dir: Data directory
15
+ free_disk_bytes: Free disk bytes
16
+ free_disk_space: Free disk space
17
+ index_directory: Index directory
18
+ index_has_deletions: Index has deletions
19
+ index_is_current: Index is current
20
+ index_is_optimized: Optimized
21
+ index_last_modified: Index last modified
22
+ index_max_doc: Index max doc
23
+ index_num_docs: Documents indexed
24
+ index_size: Index size
25
+ index_size_bytes: Index size
26
+ index_version: Index version
27
+ instance_dir: Instance directory
28
+ root_dir: Root directory
29
+ total_disk_bytes: Total disk bytes
30
+ total_disk_space: Total disk space
31
+ collection/settings:
32
+ auto_complete: Auto complete
33
+ boost_recent: Boost recent
34
+ boosts: Boosts
35
+ click_boost_data: Click boost data
36
+ click_boost_field: Click boost field
37
+ click_enabled: Click scoring enabled
38
+ de_duplication: De-duplication
39
+ default_sort: Default sort
40
+ display_facets: Display facets
41
+ elevations: elevations
42
+ index_time_stopwords: Exclude stop words from index
43
+ main_index_ram_buffer_size_mb: RAM buffer size (MB)
44
+ main_index_merge_factor: Merge factor
45
+ query_parser: Query parser
46
+ query_time_stopwords: Include stop words in searches
47
+ query_time_synonyms: Use synonyms
48
+ search_server_list: Search server list
49
+ show_similar: Show "find similar" links
50
+ spellcheck: Spell-check
51
+ ssl: SSL
52
+ stopword_list: Stopword list
53
+ synonym_list: Synonym list
54
+ unknown_type_handling: Default field type
55
+ unsupervised_feedback: Unsupervised feedback
56
+ unsupervised_feedback_emphasis: Unsupervised feedback emphasis
57
+ update_server_list: Update server list
58
+ datasource:
59
+ ad_cache_groups: Cache groups
60
+ ad_credentials: Credentials
61
+ ad_group_filter: Group filter
62
+ ad_url: Active Directory URL
63
+ ad_user_base_dn: User base DN
64
+ ad_user_filter: User filter
65
+ ad_user_principal_name: User principal name
66
+ ad_group_base_dn: Group base DN
67
+ aliases: Site Aliases Mappings
68
+ auth: Authentication credentials
69
+ authorization: Authorization
70
+ bounds: Constrain to
71
+ commit_on_finish: Commit when crawl finishes
72
+ commit_within: Commit within
73
+ commit_within_sec: Commit within (seconds)
74
+ connector_type: Connector Type
75
+ deleteAfter: Delete logs after
76
+ delta_sql_query: Delta SQL query
77
+ domain: Domain
78
+ enable_security_trimming: Enable security trimming
79
+ excluded_urls: Excluded URLs
80
+ fail_unsupported_file_types: Fail unsupported file types
81
+ feed_unpublished_documents: Feed unpublished documents
82
+ groupname_format_in_ace: Group name format in ACE
83
+ host: Domain Name
84
+ ignore_robots: Ignore robots.txt
85
+ include_datasource_metadata: Include data source metadata
86
+ included_urls: Included URLs
87
+ kdcserver: Kerberos KDC server
88
+ ldap_auth_type: LDAP authentication type
89
+ ldap_cache_groups_membership: LDAP cache group membership
90
+ ldap_cache_refresh_interval: LDAP cache refresh interval
91
+ ldap_cache_size: LDAP cache size
92
+ ldap_read_groups_type: LDAP read groups type
93
+ ldap_search_base: LDAP search base
94
+ ldap_server_host_address: LDAP server host
95
+ ldap_server_port_number: LDAP server port
96
+ ldap_server_use_ssl: LDAP server use SSL
97
+ log_extra_detail: Log extra detail
98
+ max_bytes: Skip files larger than (bytes)
99
+ my_site_base_url: MySite URL
100
+ output_args: Output arguments
101
+ output_url: Output URL
102
+ password: Password
103
+ proxy_host: Proxy host
104
+ proxy_password: Proxy password
105
+ proxy_port: Proxy port
106
+ proxy_username: Proxy user name
107
+ push_acls: Push ACLs
108
+ realm: Realm
109
+ sharepoint_url: SharePoint URL
110
+ sleep: Sleep (ms)
111
+ sql_select_statement: SQL SELECT statement
112
+ type: Type
113
+ url: URL
114
+ use_sp_search_visibility: Use SP Search Visibility
115
+ username: Username
116
+ username_format_in_ace: Username format in ACE
117
+ warn_unknown_mime_types: Log warnings for unknown mime types
118
+ windowsdomain: Windows domain
119
+ datasource/history:
120
+ crawl_started: Started
121
+ crawl_state: State
122
+ crawl_stopped: Stopped
123
+ num_deleted: Deleted
124
+ num_failed: Failed
125
+ num_new: New
126
+ num_unchanged: Unchanged
127
+ num_updated: Updated
128
+ num_not_found: Not found
129
+ num_filter_denied: Filter denied
130
+ num_access_denied: Access denied
131
+ num_robots_denied: Robots denied
132
+ datasource/status:
133
+ crawl_started: Last crawl started
134
+ crawl_state: State
135
+ crawl_stopped: Last crawl stopped
136
+ doc_count: Documents indexed
137
+ job_id: Job ID
138
+ num_deleted: Deleted docs
139
+ num_failed: Failed docs
140
+ num_new: New docs
141
+ num_total: Total docs
142
+ num_unchanged: Unchanged docs
143
+ num_updated: Updated docs
144
+ num_not_found: Not found docs
145
+ num_filter_denied: Filter denied docs
146
+ num_access_denied: Access denied docs
147
+ num_robots_denied: Robots denied docs
148
+ field:
149
+ copy_fields: Copy this field to fields
150
+ default_boost: Default boost
151
+ default_value: Default value
152
+ dynamic_base: Dynamically generated from
153
+ editable: Editable
154
+ facet: Facet
155
+ field_type: Field type
156
+ highlight: Highlight
157
+ include_in_results: Include in results
158
+ index_for_autocomplete: Index for autocomplete
159
+ index_for_spellcheck: Index for spell checking
160
+ indexing_options: Index term frequencies and positions
161
+ indexed: Indexed
162
+ multi_valued: Multi-valued
163
+ name: Name
164
+ omit_positions: Omit positions
165
+ omit_tf: Omit term frequencies and positions
166
+ query_time_stopword_handling: Enable stopword handling
167
+ search_by_default: Search by default
168
+ short_field_boost: Short field boost
169
+ stored: Stored
170
+ synonym_expasion: Enable synonym expansion
171
+ term_vectors: Term vectors
172
+ use_for_deduplication: Use for de-duplication
173
+ use_in_find_similar: Use in 'find similar'
174
+ dynamicfield:
175
+ copy_fields: Copy this field to fields
176
+ field_type: Field type
177
+ index_for_autocomplete: Index for autocomplete
178
+ index_for_spellcheck: Index for spell checking
179
+ indexing_options: Index term frequencies and positions
180
+ indexed: Indexed
181
+ multi_valued: Multi-valued
182
+ name: Name
183
+ omit_positions: Omit positions
184
+ omit_tf: Omit term frequencies and positions
185
+ stored: Stored
186
+ term_vectors: Term vectors
187
+ fieldtype:
188
+ name: Name
189
+ _class: Class
143
190
  #
144
191
  # This section containts two things:
145
192
  # Model names wich support ActiveModel <model>.model_name.human
@@ -148,112 +195,47 @@ en:
148
195
  # or from class LucidWorks::Base.human_attribute_value(attribute, value)
149
196
  #
150
197
  models:
151
- lucid_works:
152
- activity:
153
- one: Activity
154
- other: Activities
155
- type:
156
- autocomplete: Generate autocomplete index
157
- click: Process click logs
158
- optimize: Optimize index
159
- collection:
160
- one: Collection
161
- other: Collections
162
- settings:
163
- de_duplication:
164
- 'off': 'Off'
165
- overwrite: Overwrite
166
- tag: Tag
167
- one: Settings
168
- other: Settings
169
- datasource:
170
- one: Data source
171
- other: Data sources
172
- status:
173
- crawl_state:
174
- ABORTED: Aborted
175
- ABORTING: Aborting
176
- EXCEPTION: Exception
177
- FINISHED: Finished
178
- IDLE: Idle
179
- RUNNING: Running
180
- STOPPED: Stopped
181
- STOPPING: Stopping
182
- type:
183
- external: External
184
- file: File system
185
- ftp: FTP
186
- hdfs: Hadoop file system
187
- jdbc: Database
188
- kfs: Kosmos file system
189
- lucidworkslogs: LucidWorks Solr Logs
190
- s3: Hadoop S3 Block FS
191
- s3n: Hadoop S3 Native FS
192
- sharepoint: SharePoint
193
- smb: Windows Share
194
- solrxml: Solr XML
195
- web: Web site
196
- field:
197
- one: Field
198
- other: Fields
199
- indexing_options:
200
- document_only: none
201
- document_termfreq: term frequencies
202
- document_termfreq_termpos: term frequencies and positions
203
- fieldtype:
204
- one: Field type
205
- other: Field types
206
- jdbcdriver:
207
- one: JDBC driver
208
- other: JDBC drivers
209
- #
210
- # These hints appear next to fields in SimpleForm forms
211
- #
212
- simple_form:
213
- hints:
198
+ activity:
199
+ one: Activity
200
+ other: Activities
201
+ type:
202
+ autocomplete: Generate autocomplete index
203
+ click: Process click logs
204
+ optimize: Optimize index
214
205
  collection:
215
- name: ! 'Collection names may use the characters: A-Z, a-z, 0-9, dash and
216
- underscore'
217
-
206
+ one: Collection
207
+ other: Collections
208
+ settings:
209
+ de_duplication:
210
+ 'off': 'Off'
211
+ overwrite: Overwrite
212
+ tag: Tag
213
+ one: Settings
214
+ other: Settings
218
215
  datasource:
219
- crawl_depth: Leave blank or set to -1 to crawl with no depth limit.
220
- exclude_paths: A list of regular expressions, one per line, e.g. .*\.pdf will
221
- ignore filenames ending in .pdf.
222
- include_paths: A list of regular expressions, one per line.
223
- max_bytes: Default = 10 MiB. Set to -1 to indicate no file size limit.
224
-
225
- # Custom datasource hints
226
- external_datasource:
227
- file_datasource:
228
- path: Full pathname to folder
229
- ftp_datasource:
230
- hdfs_datasource:
231
- url: "Please include protocol: hdfs://<hostname>"
232
- jdbc_datasource:
233
- delta_sql_query: "$ in this query will be replaced by the last successful import time."
234
- driver: "Database drivers may be uploaded on the Indexing -> JDBC Drivers page.
235
- Drivers are collection specific.
236
- JDBC4 drivers will appear in the selector automatically.
237
- To use a JDBC3 driver, select \"Other\" and enter the Java class name of the driver."
238
- url: "e.g. jdbc:mysql://hostname/database_name"
239
- kfs_datasource:
240
- lucidworkslogs_datasource:
241
- s3_datasource:
242
- url: "Please include protocol: s3://<hostname>/path/to/filesystem"
243
- s3n_datasource:
244
- url: "Please include protocol: s3n://<hostname>/path/to/filesystem"
245
- sharepoint_datasource:
246
- smb_datasource:
247
- url: "Format: smb://<hostname or ip address>/<path to folder>/"
248
- solrxml:
249
- web_datasource:
250
- include_paths: A list of regular expressions, one per line, e.g. http://example\.com/.*
251
- will match everything within the site only.
252
- url: e.g. http://cnn.com. Please include protocol (http/https).
253
-
216
+ one: Data source
217
+ other: Data sources
218
+ status:
219
+ crawl_state:
220
+ ABORTED: Aborted
221
+ ABORTING: Aborting
222
+ EXCEPTION: Exception
223
+ FINISHED: Finished
224
+ IDLE: Idle
225
+ RUNNING: Running
226
+ STOPPED: Stopped
227
+ STOPPING: Stopping
228
+ UNKNOWN: Unknown
254
229
  field:
255
- copy_fields: A list of fields separated by spaces.
230
+ one: Field
231
+ other: Fields
232
+ indexing_options:
233
+ document_only: none
234
+ document_termfreq: term frequencies
235
+ document_termfreq_termpos: term frequencies and positions
236
+ fieldtype:
237
+ one: Field type
238
+ other: Field types
256
239
  jdbcdriver:
257
- file: select the jar file of your database driver
258
- synonym:
259
- mapping: ! 'Example: car, automobile, auto'
240
+ one: JDBC driver
241
+ other: JDBC drivers
@@ -24,6 +24,7 @@ module LucidWorks
24
24
 
25
25
  def frequency
26
26
  case period
27
+ when 1.minute.seconds..59.minutes.seconds then 'every'
27
28
  when 1.weeks.seconds then 'weekly'
28
29
  when 1.days.seconds then 'daily'
29
30
  when 1.hours.seconds then 'hourly'
@@ -37,6 +38,7 @@ module LucidWorks
37
38
  #
38
39
  def frequency=(frequency)
39
40
  self.period = case frequency
41
+ when 'every' then period
40
42
  when 'hourly' then 1.hours.seconds.to_i
41
43
  when 'daily' then 1.days.seconds.to_i
42
44
  when 'weekly' then 1.weeks.seconds.to_i
@@ -50,7 +52,6 @@ module LucidWorks
50
52
  #
51
53
  def next_start
52
54
  return start_time if (now = Time.now) <= start_time
53
- # require 'ruby-debug'; debugger
54
55
  time_since_start = now - start_time
55
56
  last_interval_num = (time_since_start / period).to_i
56
57
  next_interval_num = if (time_since_start % period) == 0
@@ -104,8 +105,10 @@ module LucidWorks
104
105
  self.frequency = all_attributes['frequency']
105
106
  self.start_time =
106
107
  case all_attributes['frequency']
108
+ when 'every'
109
+ self.period = all_attributes['period'].to_i
110
+ now.ceil(period)
107
111
  when 'weekly'
108
- # require 'ruby-debug'; debugger
109
112
  start = now.beginning_of_week.advance(all_attributes['start'])
110
113
  start < now ? start.advance(:weeks => 1) : start
111
114
  when 'daily'
@@ -115,7 +118,7 @@ module LucidWorks
115
118
  start = now.change(:min => 0).advance(all_attributes['start'])
116
119
  start < now ? start.advance(:hours => 1) : start
117
120
  when 'custom'
118
- # don't change this activity's start_time
121
+ # don't change this schedule's start_time
119
122
  else
120
123
  puts "*** frequency: <#{all_attributes[:frequency]}>"
121
124
  raise "unexpected frequency encountered"
@@ -170,8 +173,8 @@ module LucidWorks
170
173
  end
171
174
  end
172
175
 
173
- def t_type
174
- I18n.t(type, :scope => 'activemodel.models.lucid_works.collection.activity.type')
176
+ def t_type(i18n_options = {})
177
+ I18n.t type, {:scope => 'activemodel.models.collection.activity.type'}.merge(i18n_options)
175
178
  end
176
179
 
177
180
  def start
@@ -47,7 +47,7 @@ module LucidWorks
47
47
 
48
48
  class << self
49
49
  attr_accessor :collection_name # :nodoc:
50
- attr_accessor_with_default :singleton, false
50
+ attr_accessor :singleton
51
51
 
52
52
  # The attributes for a model are ascertained in on of two ways.
53
53
  # Without a schema, the attributes list is automatically generated when the the object is retrieved from the server.
@@ -127,11 +127,11 @@ module LucidWorks
127
127
 
128
128
  url = case kind_of_find
129
129
  when :all; collection_url(parent)
130
- when :one; "#{parent.uri}/#{collection_name}/#{id}"
131
- when :singleton; "#{parent.uri}/#{singleton_name}"
130
+ when :one; member_url(parent, id)
131
+ when :singleton; member_url(parent)
132
132
  end
133
133
 
134
- raw_response = ActiveSupport::Notifications.instrument("lucid_works.request") do |payload|
134
+ raw_response = ActiveSupport::Notifications.instrument("api.lucid_works") do |payload|
135
135
  begin
136
136
  payload[:method] = :get
137
137
  payload[:uri] = url
@@ -178,7 +178,7 @@ module LucidWorks
178
178
 
179
179
  if kind_of_find == :all && association_info[:retrieveable_en_masse]
180
180
  all_targets_path = "#{collection_url(parent)}/all/#{target_name}"
181
- raw_response = ActiveSupport::Notifications.instrument("lucid_works.request") do |payload|
181
+ raw_response = ActiveSupport::Notifications.instrument("api.lucid_works") do |payload|
182
182
  begin
183
183
  payload[:method] = :get
184
184
  payload[:uri] = all_targets_path
@@ -265,6 +265,14 @@ module LucidWorks
265
265
  "#{parent.uri}/#{collection_name}"
266
266
  end
267
267
 
268
+ def member_url(parent, id = nil) # :nodoc:
269
+ if singleton
270
+ "#{parent.uri}/#{singleton_name}"
271
+ else
272
+ "#{parent.uri}/#{collection_name}/#{id}"
273
+ end
274
+ end
275
+
268
276
  def singleton_name # :nodoc:
269
277
  name.underscore.gsub(/^.*\//, '')
270
278
  end
@@ -291,13 +299,14 @@ module LucidWorks
291
299
  @associations = {}
292
300
  @persisted = options.delete(:persisted) || singleton? || false
293
301
  @attributes = {}.with_indifferent_access
302
+ @singleton = false
294
303
  load_attributes(options)
295
304
  end
296
305
 
297
306
  def save
298
307
  return false unless valid?
299
- _run_save_callbacks do
300
- ActiveSupport::Notifications.instrument("lucid_works.request") do |payload|
308
+ run_callbacks :save do
309
+ ActiveSupport::Notifications.instrument("api.lucid_works") do |payload|
301
310
  method, uri = persisted? ? [:put, member_url] : [:post, collection_url]
302
311
  data = encode
303
312
  payload[:method] = method
@@ -324,15 +333,19 @@ module LucidWorks
324
333
  end
325
334
  end
326
335
 
327
- def update_attributes(attrs_and_values)
336
+ def attributes=(attrs_and_values)
328
337
  attrs_and_values.each do |attr,value|
329
338
  self.send("#{attr}=", value)
330
339
  end
340
+ end
341
+
342
+ def update_attributes(attrs_and_values)
343
+ self.attributes = attrs_and_values
331
344
  save
332
345
  end
333
346
 
334
347
  def destroy(options={})
335
- ActiveSupport::Notifications.instrument("lucid_works.request") do |payload|
348
+ ActiveSupport::Notifications.instrument("api.lucid_works") do |payload|
336
349
  begin
337
350
  payload[:method] = :delete
338
351
  payload[:uri] = member_url
@@ -371,11 +384,7 @@ module LucidWorks
371
384
  end
372
385
 
373
386
  def member_url # :nodoc:
374
- if singleton?
375
- "#{parent.uri}/#{self.class.singleton_name}"
376
- else
377
- "#{parent.uri}/#{collection_name}/#{self.id}"
378
- end
387
+ self.class.member_url(parent, self.id)
379
388
  end
380
389
 
381
390
  alias :uri :member_url
@@ -398,7 +407,7 @@ module LucidWorks
398
407
  end
399
408
 
400
409
  def singleton? # :nodoc:
401
- self.class.singleton
410
+ !!self.class.singleton
402
411
  end
403
412
 
404
413
  def collection_name # :nodoc:
@@ -424,6 +433,8 @@ module LucidWorks
424
433
  next
425
434
  elsif self.class.respond_to?(:belongs_to_association_name) && attr.to_sym == self.class.belongs_to_association_name
426
435
  next # Dont overwrite our connection to our parent
436
+ elsif schema.model.associations.keys.include?(attr.to_sym)
437
+ next # There is an association with the same name. The association takes precedence.
427
438
  end
428
439
  attribute = schema.find_or_create_attribute(attr)
429
440
  send "#{attribute.name}=", value
@@ -439,7 +450,7 @@ module LucidWorks
439
450
  data = JSON.parse(response) rescue nil
440
451
  if data.is_a?(Hash) && data['errors']
441
452
  data['errors'].each do |error|
442
- key = error['key'].blank? ? 'base' : error['key']
453
+ key = error['key'].blank? ? 'base' : LucidWorks::Schema::Attribute.sanitize_name(error['key'])
443
454
  # When core implements FOCUS-2262 start checking for error['code'] and lookup a translation.
444
455
  self.errors.add(key, error['message'])
445
456
  end