fedora_lens 0.0.11 → 0.0.12
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.
- checksums.yaml +4 -4
- data/lib/fedora_lens.rb +2 -210
- data/lib/fedora_lens/core.rb +220 -0
- data/lib/fedora_lens/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8ddccef7b4b1d4c0bf21e0afe5596f375b79ae40
|
4
|
+
data.tar.gz: f979c71a8daa29d9e291e6c2c06d4c3abd7c9223
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8fef1c7a9b0b4bc6739d003278978791705661bec3dd8722cdbfa1e8c34f8f0b01700fa1bc39da55dc71258a3d82b2ddc74ee1c030b197651809af67b619cd79
|
7
|
+
data.tar.gz: 117fcc9c8a4236d629d2517a77c6b61ee84f004064d4d0c6abd1df77160faa2eb51ad8902c7d2a19c02ddc8f85bfd9cdcafb9d446ddb9b6bc70c4055363063d7
|
data/lib/fedora_lens.rb
CHANGED
@@ -1,222 +1,14 @@
|
|
1
|
-
require 'rdf'
|
2
|
-
require 'ldp'
|
3
|
-
require 'rdf/turtle'
|
4
|
-
require 'nokogiri'
|
5
1
|
require 'active_model'
|
6
|
-
require '
|
7
|
-
require 'active_support/core_ext/object'
|
8
|
-
require 'active_support/core_ext/class/attribute'
|
9
|
-
require 'active_support/core_ext/module/attribute_accessors'
|
10
|
-
require 'active_support/core_ext/hash'
|
11
|
-
require 'fedora_lens/errors'
|
2
|
+
require 'fedora_lens/core'
|
12
3
|
|
13
4
|
module FedoraLens
|
14
5
|
extend ActiveSupport::Concern
|
15
|
-
extend ActiveSupport::Autoload
|
16
|
-
autoload :AttributeMethods
|
17
|
-
|
18
|
-
module AttributeMethods
|
19
|
-
extend ActiveSupport::Autoload
|
20
|
-
|
21
|
-
eager_autoload do
|
22
|
-
autoload :Declarations
|
23
|
-
autoload :Read
|
24
|
-
autoload :Write
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
HOST = "http://localhost:8983/fedora/rest"
|
29
|
-
|
30
|
-
class << self
|
31
|
-
def connection
|
32
|
-
@@connection ||= Ldp::Client.new(host)
|
33
|
-
end
|
34
|
-
|
35
|
-
def host
|
36
|
-
HOST
|
37
|
-
end
|
38
|
-
|
39
|
-
def base_path
|
40
|
-
@@base_path ||= ''
|
41
|
-
end
|
42
|
-
|
43
|
-
# Set a base path if you want to put all your objects below a certain path
|
44
|
-
# example:
|
45
|
-
# FedoraLens.base_path = '/text
|
46
|
-
def base_path= path
|
47
|
-
@@base_path = path
|
48
|
-
end
|
49
|
-
|
50
|
-
def id_to_uri(id)
|
51
|
-
id = "/#{id}" unless id.start_with? '/'
|
52
|
-
id = FedoraLens.base_path + id unless id.start_with? "#{FedoraLens.base_path}/"
|
53
|
-
FedoraLens.host + id
|
54
|
-
end
|
55
|
-
|
56
|
-
def uri_to_id(uri)
|
57
|
-
uri.to_s.sub(FedoraLens.host + FedoraLens.base_path, '')
|
58
|
-
end
|
59
|
-
end
|
60
6
|
|
61
7
|
included do
|
62
8
|
extend ActiveModel::Naming
|
63
9
|
include ActiveModel::Validations
|
64
10
|
include ActiveModel::Conversion
|
65
|
-
include FedoraLens::
|
66
|
-
|
67
|
-
attr_reader :orm
|
68
|
-
end
|
69
|
-
|
70
|
-
def initialize(subject_or_data = {}, data = nil)
|
71
|
-
init_core(subject_or_data, data)
|
72
|
-
end
|
73
|
-
|
74
|
-
def persisted?() false end
|
75
|
-
|
76
|
-
def errors
|
77
|
-
obj = Object.new
|
78
|
-
def obj.[](key) [] end
|
79
|
-
def obj.full_messages() [] end
|
80
|
-
obj
|
81
|
-
end
|
82
|
-
|
83
|
-
def read_attribute_for_validation(key)
|
84
|
-
@attributes[key]
|
85
|
-
end
|
86
|
-
|
87
|
-
def reload
|
88
|
-
@orm = @orm.reload
|
89
|
-
@attributes = get_attributes_from_orm(@orm)
|
90
|
-
end
|
91
|
-
|
92
|
-
def delete
|
93
|
-
@orm.resource.delete
|
94
|
-
end
|
95
|
-
|
96
|
-
def save
|
97
|
-
new_record? ? create_record : update_record
|
98
|
-
end
|
99
|
-
|
100
|
-
def save!
|
101
|
-
save || raise(RecordNotSaved)
|
102
|
-
end
|
103
|
-
|
104
|
-
def new_record?
|
105
|
-
@orm.resource.new?
|
106
|
-
end
|
107
|
-
|
108
|
-
def uri
|
109
|
-
@orm.try(:resource).try(:subject_uri).try(:to_s)
|
110
|
-
end
|
111
|
-
|
112
|
-
def id
|
113
|
-
self.class.uri_to_id(URI.parse(uri)) if uri.present?
|
114
|
-
end
|
115
|
-
|
116
|
-
protected
|
117
|
-
# This allows you to overide the initializer, but still use this behavior
|
118
|
-
def init_core(subject_or_data = {}, data = nil)
|
119
|
-
case subject_or_data
|
120
|
-
when Ldp::Resource::RdfSource
|
121
|
-
@orm = Ldp::Orm.new(subject_or_data)
|
122
|
-
@attributes = get_attributes_from_orm(@orm)
|
123
|
-
when NilClass, Hash
|
124
|
-
data = subject_or_data || {}
|
125
|
-
@orm = Ldp::Orm.new(Ldp::Resource::RdfSource.new(FedoraLens.connection, nil, RDF::Graph.new, FedoraLens.host + FedoraLens.base_path))
|
126
|
-
@attributes = data.with_indifferent_access
|
127
|
-
when String
|
128
|
-
data ||= {}
|
129
|
-
@orm = Ldp::Orm.new(Ldp::Resource::RdfSource.new(FedoraLens.connection, subject_or_data, RDF::Graph.new))
|
130
|
-
@attributes = data.with_indifferent_access
|
131
|
-
else
|
132
|
-
raise ArgumentError, "#{subject_or_data.class} is not acceptable"
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
def create_record
|
137
|
-
push_attributes_to_orm
|
138
|
-
create_and_fetch_attributes
|
139
|
-
true
|
140
|
-
end
|
141
|
-
|
142
|
-
def update_record
|
143
|
-
push_attributes_to_orm
|
144
|
-
update_and_fetch_attributes
|
145
|
-
end
|
146
|
-
|
147
|
-
|
148
|
-
private
|
149
|
-
|
150
|
-
def update_and_fetch_attributes
|
151
|
-
orm.save!.tap do
|
152
|
-
clear_cached_response
|
153
|
-
# This is slow, but it enables us to get attributes like http://fedora.info/definitions/v4/repository#lastModified
|
154
|
-
# TODO perhaps attributes could be lazily fetched
|
155
|
-
@attributes = get_attributes_from_orm(@orm)
|
156
|
-
clear_cached_response
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
def create_and_fetch_attributes
|
161
|
-
@orm = orm.create
|
162
|
-
# This is slow, but it enables us to get attributes like http://fedora.info/definitions/v4/repository#created
|
163
|
-
# TODO perhaps attributes could be lazily fetched
|
164
|
-
@attributes = get_attributes_from_orm(@orm)
|
165
|
-
clear_cached_response
|
166
|
-
end
|
167
|
-
|
168
|
-
# TODO this causes slowness because we're losing the cached GET response. However it prevents ETag exceptions caused when a
|
169
|
-
# subnode is added before an update.
|
170
|
-
def clear_cached_response
|
171
|
-
# This strips the current cached response (and ETag) from the current ORM to avoid ETag exceptions on the next update,
|
172
|
-
# since the etag will change if a child node is added.
|
173
|
-
@orm = Ldp::Orm.new @orm.resource.class.new @orm.resource.client, @orm.resource.subject
|
174
|
-
end
|
175
|
-
|
176
|
-
|
177
|
-
def push_attributes_to_orm
|
178
|
-
@orm = self.class.orm_to_hash.put(@orm, @attributes)
|
179
|
-
end
|
180
|
-
|
181
|
-
def get_attributes_from_orm(orm)
|
182
|
-
self.class.orm_to_hash.get(orm).with_indifferent_access
|
183
|
-
end
|
184
|
-
|
185
|
-
module ClassMethods
|
186
|
-
def find(id)
|
187
|
-
resource = Ldp::Resource::RdfSource.new(FedoraLens.connection, id_to_uri(id))
|
188
|
-
raise Ldp::NotFound if resource.new?
|
189
|
-
self.new(resource)
|
190
|
-
end
|
191
|
-
|
192
|
-
def id_to_uri(id)
|
193
|
-
FedoraLens.id_to_uri(id)
|
194
|
-
end
|
195
|
-
|
196
|
-
def uri_to_id(uri)
|
197
|
-
FedoraLens.uri_to_id(uri)
|
198
|
-
end
|
199
|
-
|
200
|
-
def create(data)
|
201
|
-
model = self.new(data)
|
202
|
-
model.save
|
203
|
-
model
|
204
|
-
end
|
205
|
-
|
206
|
-
def orm_to_hash
|
207
|
-
if @orm_to_hash.nil?
|
208
|
-
aggregate_lens = attributes_as_lenses.inject({}) do |acc, (name, path)|
|
209
|
-
lens = path.inject {|outer, inner| Lenses.compose(outer, inner)}
|
210
|
-
acc.merge(name => lens)
|
211
|
-
end
|
212
|
-
@orm_to_hash = Lenses.orm_to_hash(aggregate_lens)
|
213
|
-
end
|
214
|
-
@orm_to_hash
|
215
|
-
end
|
216
|
-
|
217
|
-
# def has_one(name, scope = nil, options = {})
|
218
|
-
# ActiveRecord::Associations::Builder::HasOne.build(self, name, scope, options)
|
219
|
-
# end
|
11
|
+
include FedoraLens::Core
|
220
12
|
end
|
221
13
|
end
|
222
14
|
|
@@ -0,0 +1,220 @@
|
|
1
|
+
require 'rdf'
|
2
|
+
require 'ldp'
|
3
|
+
require 'active_support/concern'
|
4
|
+
require 'active_support/core_ext/object'
|
5
|
+
require 'active_support/core_ext/class/attribute'
|
6
|
+
require 'active_support/core_ext/module/attribute_accessors'
|
7
|
+
require 'active_support/core_ext/hash'
|
8
|
+
require 'fedora_lens/errors'
|
9
|
+
|
10
|
+
module FedoraLens
|
11
|
+
extend ActiveSupport::Autoload
|
12
|
+
autoload :AttributeMethods
|
13
|
+
|
14
|
+
module AttributeMethods
|
15
|
+
extend ActiveSupport::Autoload
|
16
|
+
|
17
|
+
eager_autoload do
|
18
|
+
autoload :Declarations
|
19
|
+
autoload :Read
|
20
|
+
autoload :Write
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
HOST = "http://localhost:8983/fedora/rest"
|
25
|
+
|
26
|
+
class << self
|
27
|
+
def connection
|
28
|
+
@@connection ||= Ldp::Client.new(host)
|
29
|
+
end
|
30
|
+
|
31
|
+
def host
|
32
|
+
HOST
|
33
|
+
end
|
34
|
+
|
35
|
+
def base_path
|
36
|
+
@@base_path ||= ''
|
37
|
+
end
|
38
|
+
|
39
|
+
# Set a base path if you want to put all your objects below a certain path
|
40
|
+
# example:
|
41
|
+
# FedoraLens.base_path = '/text
|
42
|
+
def base_path= path
|
43
|
+
@@base_path = path
|
44
|
+
end
|
45
|
+
|
46
|
+
def id_to_uri(id)
|
47
|
+
id = "/#{id}" unless id.start_with? '/'
|
48
|
+
id = FedoraLens.base_path + id unless id.start_with? "#{FedoraLens.base_path}/"
|
49
|
+
FedoraLens.host + id
|
50
|
+
end
|
51
|
+
|
52
|
+
def uri_to_id(uri)
|
53
|
+
uri.to_s.sub(FedoraLens.host + FedoraLens.base_path, '')
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
module Core
|
58
|
+
extend ActiveSupport::Concern
|
59
|
+
|
60
|
+
included do
|
61
|
+
include FedoraLens::AttributeMethods
|
62
|
+
attr_reader :orm
|
63
|
+
end
|
64
|
+
|
65
|
+
def initialize(subject_or_data = {}, data = nil)
|
66
|
+
init_core(subject_or_data, data)
|
67
|
+
end
|
68
|
+
|
69
|
+
def persisted?() false end
|
70
|
+
|
71
|
+
def errors
|
72
|
+
obj = Object.new
|
73
|
+
def obj.[](key) [] end
|
74
|
+
def obj.full_messages() [] end
|
75
|
+
obj
|
76
|
+
end
|
77
|
+
|
78
|
+
def read_attribute_for_validation(key)
|
79
|
+
@attributes[key]
|
80
|
+
end
|
81
|
+
|
82
|
+
def reload
|
83
|
+
@orm = @orm.reload
|
84
|
+
@attributes = get_attributes_from_orm(@orm)
|
85
|
+
end
|
86
|
+
|
87
|
+
def delete
|
88
|
+
@orm.resource.delete
|
89
|
+
end
|
90
|
+
|
91
|
+
def save
|
92
|
+
new_record? ? create_record : update_record
|
93
|
+
end
|
94
|
+
|
95
|
+
def save!
|
96
|
+
save || raise(RecordNotSaved)
|
97
|
+
end
|
98
|
+
|
99
|
+
def new_record?
|
100
|
+
@orm.resource.new?
|
101
|
+
end
|
102
|
+
|
103
|
+
def uri
|
104
|
+
@orm.try(:resource).try(:subject_uri).try(:to_s)
|
105
|
+
end
|
106
|
+
|
107
|
+
def id
|
108
|
+
self.class.uri_to_id(URI.parse(uri)) if uri.present?
|
109
|
+
end
|
110
|
+
|
111
|
+
protected
|
112
|
+
# This allows you to overide the initializer, but still use this behavior
|
113
|
+
def init_core(subject_or_data = {}, data = nil)
|
114
|
+
case subject_or_data
|
115
|
+
when Ldp::Resource::RdfSource
|
116
|
+
@orm = Ldp::Orm.new(subject_or_data)
|
117
|
+
@attributes = get_attributes_from_orm(@orm)
|
118
|
+
when NilClass, Hash
|
119
|
+
data = subject_or_data || {}
|
120
|
+
@orm = Ldp::Orm.new(Ldp::Resource::RdfSource.new(FedoraLens.connection, nil, RDF::Graph.new, FedoraLens.host + FedoraLens.base_path))
|
121
|
+
@attributes = data.with_indifferent_access
|
122
|
+
when String
|
123
|
+
data ||= {}
|
124
|
+
@orm = Ldp::Orm.new(Ldp::Resource::RdfSource.new(FedoraLens.connection, subject_or_data, RDF::Graph.new))
|
125
|
+
@attributes = data.with_indifferent_access
|
126
|
+
else
|
127
|
+
raise ArgumentError, "#{subject_or_data.class} is not acceptable"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def create_record
|
132
|
+
push_attributes_to_orm
|
133
|
+
create_and_fetch_attributes
|
134
|
+
true
|
135
|
+
end
|
136
|
+
|
137
|
+
def update_record
|
138
|
+
push_attributes_to_orm
|
139
|
+
update_and_fetch_attributes
|
140
|
+
end
|
141
|
+
|
142
|
+
|
143
|
+
private
|
144
|
+
|
145
|
+
def update_and_fetch_attributes
|
146
|
+
orm.save!.tap do
|
147
|
+
clear_cached_response
|
148
|
+
# This is slow, but it enables us to get attributes like http://fedora.info/definitions/v4/repository#lastModified
|
149
|
+
# TODO perhaps attributes could be lazily fetched
|
150
|
+
@attributes = get_attributes_from_orm(@orm)
|
151
|
+
clear_cached_response
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
def create_and_fetch_attributes
|
156
|
+
@orm = orm.create
|
157
|
+
# This is slow, but it enables us to get attributes like http://fedora.info/definitions/v4/repository#created
|
158
|
+
# TODO perhaps attributes could be lazily fetched
|
159
|
+
@attributes = get_attributes_from_orm(@orm)
|
160
|
+
clear_cached_response
|
161
|
+
end
|
162
|
+
|
163
|
+
# TODO this causes slowness because we're losing the cached GET response. However it prevents ETag exceptions caused when a
|
164
|
+
# subnode is added before an update.
|
165
|
+
def clear_cached_response
|
166
|
+
# This strips the current cached response (and ETag) from the current ORM to avoid ETag exceptions on the next update,
|
167
|
+
# since the etag will change if a child node is added.
|
168
|
+
@orm = Ldp::Orm.new @orm.resource.class.new @orm.resource.client, @orm.resource.subject
|
169
|
+
end
|
170
|
+
|
171
|
+
|
172
|
+
def push_attributes_to_orm
|
173
|
+
@orm = self.class.orm_to_hash.put(@orm, @attributes)
|
174
|
+
end
|
175
|
+
|
176
|
+
def get_attributes_from_orm(orm)
|
177
|
+
self.class.orm_to_hash.get(orm).with_indifferent_access
|
178
|
+
end
|
179
|
+
|
180
|
+
module ClassMethods
|
181
|
+
def find(id)
|
182
|
+
resource = Ldp::Resource::RdfSource.new(FedoraLens.connection, id_to_uri(id))
|
183
|
+
raise Ldp::NotFound if resource.new?
|
184
|
+
self.new(resource)
|
185
|
+
end
|
186
|
+
|
187
|
+
def id_to_uri(id)
|
188
|
+
FedoraLens.id_to_uri(id)
|
189
|
+
end
|
190
|
+
|
191
|
+
def uri_to_id(uri)
|
192
|
+
FedoraLens.uri_to_id(uri)
|
193
|
+
end
|
194
|
+
|
195
|
+
def create(data)
|
196
|
+
model = self.new(data)
|
197
|
+
model.save
|
198
|
+
model
|
199
|
+
end
|
200
|
+
|
201
|
+
def orm_to_hash
|
202
|
+
if @orm_to_hash.nil?
|
203
|
+
aggregate_lens = attributes_as_lenses.inject({}) do |acc, (name, path)|
|
204
|
+
lens = path.inject {|outer, inner| Lenses.compose(outer, inner)}
|
205
|
+
acc.merge(name => lens)
|
206
|
+
end
|
207
|
+
@orm_to_hash = Lenses.orm_to_hash(aggregate_lens)
|
208
|
+
end
|
209
|
+
@orm_to_hash
|
210
|
+
end
|
211
|
+
|
212
|
+
# def has_one(name, scope = nil, options = {})
|
213
|
+
# ActiveRecord::Associations::Builder::HasOne.build(self, name, scope, options)
|
214
|
+
# end
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
require 'fedora_lens/lenses'
|
220
|
+
|
data/lib/fedora_lens/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fedora_lens
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Coyne
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-07-
|
12
|
+
date: 2014-07-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -151,6 +151,7 @@ files:
|
|
151
151
|
- lib/fedora_lens/attribute_methods/declarations.rb
|
152
152
|
- lib/fedora_lens/attribute_methods/read.rb
|
153
153
|
- lib/fedora_lens/attribute_methods/write.rb
|
154
|
+
- lib/fedora_lens/core.rb
|
154
155
|
- lib/fedora_lens/errors.rb
|
155
156
|
- lib/fedora_lens/lens.rb
|
156
157
|
- lib/fedora_lens/lens_tests.rb
|