omeka_client 0.0.4 → 1.0.0.a

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2c418f1c4a8a156799af715c94334dbe596f48b5
4
- data.tar.gz: 5f3983cbd7613018f0322870882302c7861dd69f
3
+ metadata.gz: 41f8b24769e781ff8b761f8bd8f9b1147fc7089c
4
+ data.tar.gz: 2d553153c75445fb18e5fefa7fc44c64c2b3040c
5
5
  SHA512:
6
- metadata.gz: 182384179f38915a0159801aceb7245649e48fd3c10bb964f19c8b1c00d267c7278bdc89104b178c868d5aac6434a342374d22a331e954a4bb0d5c00090c4485
7
- data.tar.gz: 6d1169b72dc03c26d3e683be72403b3ae05d401d2a4d325f4605cb1500cd93a10e912b4dd3ee396523613f615ac3d7f0d534b23212ac3fa1245b2baee46bd4a1
6
+ metadata.gz: 17bc07c6be2517e32e5fe92a9f9bde63652088a9a23b8fdc063505bb0d5e5026410241154d5b1e14d5a33a3817d4c4355718de915ef0f81e313677ede63e409f
7
+ data.tar.gz: ff191066700828db989aa72596264a88346422467f8dc6c44f91486d2b488c0e8fc7171e8fd0716947d4abfdbfc70993fd5435fac81203a734c9fe05ea844b87
@@ -1,13 +1,25 @@
1
1
  # Changelog
2
2
 
3
+ ## v1.0.0
4
+
5
+ - DublinCore and ItemTypeMetadata classes now offer access to those
6
+ types of metadata.
7
+ - A helper method now handles building the API requests
8
+
9
+ ## v0.0.4 (August 1, 2013)
10
+
11
+ - Read and set all Dublin Core and Item Type Metadata fields through
12
+ specific methods
13
+ - POST, PUT, and DELETE using OmekaItem instances
14
+
3
15
  ## v0.0.3 (July 30, 2013)
4
16
 
5
- Added low-level POST, PUT, and DELETE methods
17
+ - Added low-level POST, PUT, and DELETE methods
6
18
 
7
19
  ## v0.0.2 (July 15, 2013)
8
20
 
9
- Added OmekaItem class for getting items as a class
21
+ - Added OmekaItem class for getting items as a class
10
22
 
11
23
  ## v0.0.1 (July 13, 2013)
12
24
 
13
- Initial release with GET methods
25
+ - Initial release with GET methods
data/README.md CHANGED
@@ -20,80 +20,109 @@ Or install it yourself:
20
20
 
21
21
  ## Usage
22
22
 
23
- See the [Omeka API documentation][] for information about what is possible with the Omeka's API.
23
+ See the [Omeka API documentation][] for information about what is
24
+ possible with the Omeka's API.
24
25
 
25
26
  First, load the gem in your script:
26
27
 
27
28
  require "omeka_client"
28
29
 
29
- Next, create a client to interact with your Omeka site. You'll need your endpoint and, optionally, an API key.
30
+ Next, create a client to interact with your Omeka site. You'll need your
31
+ endpoint and, optionally, an API key.
30
32
 
31
33
  client = OmekaClient::Client.new("http://localhost/omeka/api", "api_key")
32
34
  # => #<OmekaClient::Client:0x007f4307937aa0>
33
35
 
34
- You can use the convenience methods for easy access to data. The most useful methods return classes that represent OmekaItems.
36
+ ### High Level Methods
35
37
 
36
- item = client.omeka_items(1)
38
+ You can read Omeka items using the following methods:
37
39
 
38
- Now you can access every piece of information returned by the Omeka API through the `data` variable.
40
+ item = client.get_item(1)
41
+ # Returns a single item
42
+
43
+ client.get_all_items
44
+ # Returns an array of all the items
45
+
46
+ Each item is represented by a Ruby object. You can access the Dublin
47
+ Core, Item Type, and basic metadata through methods
39
48
 
40
49
  item.data.id
41
50
  # => 1
51
+
42
52
  item.data.public
43
53
  # => true
54
+
44
55
  item.data.added
45
56
  # => "2013-07-13T04:47:08+00:00"
46
57
 
47
- But since the data you probably want most are the element texts for either the Dublin Core Metadata or the Item Type Metadata, they can be accessed through methods of this type:
58
+ But since the data you probably want most are the element texts for
59
+ either the Dublin Core Metadata or the Item Type Metadata, they can be
60
+ accessed through methods of this type:
48
61
 
49
- item.dc_title
62
+ item.dublin_core.title
50
63
  # => "Questions of the Soul"
51
- item.dc_author
64
+
65
+ item.dublin_core.creator
52
66
  # => "Hecker, Isaac Thomas, 1819-1888."
53
- item.itm_binding
67
+
68
+ item.item_type_metadata.binding
54
69
  # => "cloth"
55
- item.itm_signature
70
+
71
+ item.item_type_metadata.signature
56
72
  # => "signed by author"
57
73
 
58
- There are some helper methods to get other results in other forms:
74
+ There are some helper methods to get other kinds of information from the
75
+ API:
59
76
 
60
- site_info = client.site
61
- puts site_info['title']
62
- # => Omeka RC Dev
77
+ client.get_collection
78
+ client.get_all_collections
63
79
 
64
- items = client.items
65
- puts items[0]['id']
66
- # => 1
67
- puts items[0]['url']
68
- # => http://localhost/omeka/api/items/1
80
+ client.get_site
81
+ client.get_site.data.title
82
+ # => "Omeka Development Site"
69
83
 
70
- Once you have an Omeka item, you can update it on the site, create a new item on the site, or delete it from the site.
84
+ Once you have an Omeka item, you can update it on the site, create a new
85
+ item on the site, or delete it from the site. See the documentation for
86
+ these functions.
71
87
 
72
88
  # Create a new item (your local Ruby item will not point to this new item)
73
89
  client.post_item(item)
74
90
 
75
91
  # Update an item
76
- item.dc_title = "Updated via API"
92
+ item.dublin_core.title = "Updated via API"
77
93
  client.put_item(item)
78
94
 
79
95
  # Delete an item
80
96
  client.delete_item(item)
81
97
 
82
- If you want more flexibility about what you're requesting, you can use the lower-level methods.
98
+ ### Low Level Methods
99
+
100
+ If you want more flexibility about what you're requesting, you can use
101
+ the lower-level methods. These basic PUT, POST, DELETE, and PUT methods
102
+ return wrappers around the HTTP response.
103
+
104
+ client.get('items', 1)
105
+ # => #<Rest::Wrappers::NetHttpPersistentResponseWrapper:0x007fe14ba72ae0 @response=#<Net::HTTPOK 200 OK readbody=true>, @tries=1>
83
106
 
84
- client.get('collections', 1)
107
+ client.get('items', 1).code
108
+ # => 200
85
109
 
86
- client.get_hash('collections', 1)
110
+ client.get('items', 1).body
111
+ # returns the JSON representation of the item
87
112
 
88
- You can send information to the Omeka site using the low-level methods `client.push`, `client.put`, and `client.delete`. These methods each takes a JSON object.
113
+ See the documentation for each method. You can send information to the
114
+ Omeka site using the low-level methods `client.push`, `client.put`, and
115
+ `client.delete`. These methods each takes a JSON object.
89
116
 
90
- If you just want a raw REST connection to Omeka, then you can access the underlying instance from the [Rest gem][].
117
+ If you just want a raw REST connection to Omeka, then you can access the
118
+ underlying instance from the [Rest gem][].
91
119
 
92
120
  client.connection
93
121
 
94
122
  ## Testing and documentation
95
123
 
96
- You can run the tests by running `rake test`. You'll need to have an Omeka site running at least 2.1-RC1 to use the tests.
124
+ You can run the tests by running `rake test`. You'll need to have an
125
+ Omeka site running at least 2.1 to use the tests.
97
126
 
98
127
  You can generate the documentation by running `rake yard`.
99
128
 
@@ -103,7 +132,8 @@ This gem is licensed under the [GPLv3][], the same as Omeka.
103
132
 
104
133
  ## Thanks
105
134
 
106
- This gem is based on Jim Safely's [sample client][] for Python. And of course many thanks to all the amazing [Omeka developers][].
135
+ This gem is based on Jim Safely's [sample client][] for Python. And of
136
+ course many thanks to all the amazing [Omeka developers][].
107
137
 
108
138
  [Omeka]: http://omeka.org
109
139
  [Omeka API documentation]: http://omeka.readthedocs.org/en/latest/Reference/api/
@@ -3,14 +3,17 @@ require "json"
3
3
  require "omeka_client/version"
4
4
  require "omeka_client/client"
5
5
  require "omeka_client/omeka-item"
6
+ require "omeka_client/omeka-site"
7
+ require "omeka_client/omeka-collection"
8
+ require "omeka_client/dublin-core"
9
+ require "omeka_client/item-type-metadata"
6
10
 
7
-
8
- #
11
+ #
9
12
  # The module wrapping the classes that do the work
10
- #
13
+ #
11
14
  # @author Lincoln Mullen
12
15
  # @since 0.0.1
13
- #
16
+ #
14
17
  module OmekaClient
15
18
 
16
19
  end
@@ -1,6 +1,5 @@
1
1
  module OmekaClient
2
2
 
3
- #
4
3
  # A class to create clients that interact with the Omeka API
5
4
  #
6
5
  # @author Lincoln Mullen
@@ -10,23 +9,24 @@ module OmekaClient
10
9
  attr_accessor :endpoint, :api_key, :connection
11
10
 
12
11
  # Sets up a new client to interact with an Omeka site
12
+ #
13
13
  # @param endpoint [String] the URL of the Omeka API endpoint, without a
14
14
  # trailing slash. For example: "{http://localhost/omeka/api}"
15
15
  # @param api_key [String] The API key of the Omeka user. This can
16
16
  # be null for GET requests, but is required for POST, PUT, and DELETE
17
17
  # requests.
18
+ #
18
19
  # @return [OmekaClient] The attribute @connection is the client itself,
19
20
  # which is an instance from the Rest gem. This client can be used to
20
21
  # perform arbitrary REST queries. See https://github.com/iron-io/rest
22
+ #
23
+ # @since 0.0.1
21
24
  def initialize(endpoint, api_key = nil )
22
25
  @endpoint = endpoint
23
26
  @api_key = api_key
24
27
  @connection = Rest::Client.new
25
28
  end
26
29
 
27
- # Generic methods
28
- # -------------------------------------------------------------------
29
-
30
30
  # Generic GET request to the Omeka site
31
31
  # @param resource [String] The Omeka resource to request, e.g.
32
32
  # "items", "collections"
@@ -37,27 +37,7 @@ module OmekaClient
37
37
  # @return [NetHttpPersistentResponseWrapper] A wrapper around the object
38
38
  # @since 0.0.1
39
39
  def get(resource, id = nil, query = {} )
40
- url = self.endpoint + "/" + resource
41
- url += "/" + id.to_s unless id.nil?
42
- query[:key] = self.api_key unless self.api_key.nil?
43
- self.connection.get(url, :params => query)
44
- end
45
-
46
- # Parse a GET request into a useable format
47
- # @param resource [String] The Omeka resource to request, e.g.
48
- # "items", "collections"
49
- # @param id [Integer] The id of the specific resource to request. Include
50
- # an id to get just one item; do not include it to get all the items.
51
- # @param query [Hash] Additional query parameters
52
- #
53
- # @return [Array or Hash] A hash of the representation of the object,
54
- # or an array of hashes.
55
- # @since 0.0.1
56
- def get_hash(resource, id = nil, query = {} )
57
- response = self.get(resource, id, query)
58
- if response.code == 200
59
- JSON.parse(response.body)
60
- end
40
+ build_request("get", resource, id, query)
61
41
  end
62
42
 
63
43
  # Generic POST request to the Omeka site
@@ -69,38 +49,21 @@ module OmekaClient
69
49
  # @return [NetHttpPersistentResponseWrapper] A wrapper around the object
70
50
  # @since 0.0.3
71
51
  def post(resource, body = nil, query = {} )
72
- url = self.endpoint + "/" + resource
73
- query['key'] = self.api_key unless self.api_key.nil?
74
- self.connection.post(url, :body => body, :params => query)
52
+ build_request("post", resource, nil, body, query)
75
53
  end
76
54
 
77
55
  # Generic DELETE request to the Omeka site
78
56
  # @param resource [String] The type of Omeka resource to delete, e.g.
79
57
  # "items", "collections"
80
58
  # @param id [Integer] The id number of the Omeka resource to delete
81
- # @param query = {} [Hash] Additional query parameters
82
59
  #
83
60
  # @return [NetHttpPersistentResponseWrapper] A wrapper around the object
84
61
  # @since 0.0.3
85
- def delete(resource, id, query = {} )
86
- url = self.endpoint + "/" + resource
87
- url += "/" + id.to_s unless id.nil?
88
- query[:key] = self.api_key unless self.api_key.nil?
89
-
90
- # The rest gem that provides out functionality has a bug. The Omeka API
91
- # returns 204 No Content on DELETE, indicating that the item has been
92
- # successfully deleted but that there is no body to return. The rest
93
- # gem assumes there will be a body, so it throws a type error. Until
94
- # this is fixed, we just rescue the error and don't worry about it.
95
- begin
96
- self.connection.delete(url, :params => query)
97
- rescue TypeError
98
- # Not putting the error to stdout
99
- end
100
-
62
+ def delete(resource, id)
63
+ build_request("delete", resource, id, nil, {})
101
64
  end
102
65
 
103
- # Generic DELETE request to the Omeka site
66
+ # Generic PUT request to the Omeka site
104
67
  # @param resource [String] The type of Omeka resource to update, e.g.
105
68
  # "items", "collections"
106
69
  # @param id [Integer] The id number of the Omeka resource to update
@@ -109,35 +72,58 @@ module OmekaClient
109
72
  # @return [NetHttpPersistentResponseWrapper] A wrapper around the object
110
73
  # @since 0.0.3
111
74
  def put(resource, id, body, query = {} )
112
- url = self.endpoint + "/" + resource
113
- url += "/" + id.to_s unless id.nil?
114
- query[:key] = self.api_key unless self.api_key.nil?
115
- self.connection.put(url, :body => body, :params => query)
75
+ build_request("put", resource, id, body, query)
116
76
  end
117
77
 
118
- # Methods that use classes
119
- # -------------------------------------------------------------------
120
-
121
- #
122
- # Get an array or a single Omeka item represented as an OmekaItem class
123
- # @param id [Integer] The ID of the item to return. No value gets an
124
- # array of all the items.
78
+ # Get single Omeka item represented as an OmekaItem class
79
+ # @param id [Integer] The ID of the item to return.
125
80
  # @param query = {} [Hash] Additional query parameters
126
- # @since 0.0.2
81
+ # @since 1.0.0
127
82
  #
128
- # @return [OmekaItem] An OmekaItem representation of the desired item,
129
- # or an array of OmekaItems
130
- def omeka_items(id = nil, query = {} )
131
- response = self.get_hash('items', id = id, query = query)
132
- if id.nil?
133
- items = Array.new
134
- response.each do |item_hash|
135
- items.push OmekaItem.new(item_hash)
136
- end
137
- return items
138
- else
139
- OmekaItem.new(response)
83
+ # @return [OmekaItem] An OmekaItem representation of the desired item
84
+ def get_item(id, query = {} )
85
+ response = self.get('items', id, query = query).body
86
+ return OmekaClient::OmekaItem.new(JSON.parse(response))
87
+ end
88
+
89
+ # Get all the items represented as an array of OmekaItems
90
+ # @param query = {} [Hash] Additional query parameters
91
+ # @since 1.0.0
92
+ #
93
+ # @return [Array] An array of OmekaItems
94
+ def get_all_items()
95
+ response = self.get('items').body
96
+ parsed = JSON.parse(response)
97
+ all_items = []
98
+ parsed.each do |item_hash|
99
+ all_items.push OmekaClient::OmekaItem.new(item_hash)
100
+ end
101
+ return all_items
102
+ end
103
+
104
+ # Get a OmekaCollection class representation of an Omeka collection
105
+ # @param id [Integer] The ID of the collection to return. No value gets
106
+ # an array of all the items.
107
+ # @return [OmekaCollection] An OmekaCollection object
108
+ # @since 1.0.0
109
+ def get_collection(id)
110
+ response = self.get('collections', id = id).body
111
+ return OmekaClient::OmekaCollection.new(JSON.parse(response))
112
+ end
113
+
114
+ # Get a OmekaCollection class representation of an Omeka collection
115
+ # @param id [Integer] The ID of the collection to return. No value gets
116
+ # an array of all the items.
117
+ # @return [Array] An OmekaCollection object
118
+ # @since 1.0.0
119
+ def get_all_collections()
120
+ response = self.get('collections').body
121
+ parsed = JSON.parse(response)
122
+ all_collections = []
123
+ parsed.each do |item_hash|
124
+ all_collections.push OmekaClient::OmekaCollection.new(item_hash)
140
125
  end
126
+ return all_collections
141
127
  end
142
128
 
143
129
  # Create a new item from an OmekaItem instance
@@ -161,51 +147,55 @@ module OmekaClient
161
147
  self.delete("items", omeka_item.data.id)
162
148
  end
163
149
 
164
- # Convenience methods
165
- # -------------------------------------------------------------------
166
-
167
- # Get the description of the Omeka site
168
- #
169
- # @return [Hash] A hash of the description of the Omeka site
170
- def site
171
- self.get_hash('site')
150
+ # Get a OmekaSite class representation of the Omeka site
151
+ # @return [OmekaSite] The representation of the Omeka site
152
+ # @since 0.0.5
153
+ def get_site
154
+ response = self.get('site').body
155
+ OmekaSite.new(JSON.parse(response))
172
156
  end
173
157
 
174
- # Get a list of the resources available from the Omeka API
175
- #
176
- # @return [Hash] Returns a hash of the resources available via the API
177
- # @since 0.0.1
178
- def resources
179
- self.get_hash('resources')
180
- end
181
158
 
182
- # Get a list of the Omeka items
159
+ # Helper method to build an API request
183
160
  #
184
- # TODO: Check that items are available in the resources
161
+ # @param method [String] The type of REST request to make: "get", "post",
162
+ # "put", or "delete".
163
+ # @param resource [String] The type of resource to request from the Omeka
164
+ # site, e.g., "items" or "site".
165
+ # @param id [Integer] The id of the resource to request from the Omeka
166
+ # site.
167
+ # @param body [] The body of a request in a PUT or POST request.
168
+ # @param query [Hash] Additional query parameters for the request.
185
169
  #
186
- # @return [Array] Returns an array of item hashes
187
- # @since 0.0.1
188
- def items
189
- self.get_hash('items')
190
- end
191
-
192
- # Get a list of the Omeka collections
193
- #
194
- # TODO: Check that items are available in the resources
170
+ # @return [NetHttpPersistentResponseWrapper] A wrapper around the API's
171
+ # response, containing the HTTP code and the response body.
172
+ #
173
+ # @since 1.0.0
195
174
  #
196
- # @return [Array] Returns an array of collection hashes
197
- # @since 0.0.1
198
- def collections
199
- self.get_hash('collections')
200
- end
175
+ def build_request(method, resource = nil, id = nil, body =nil, query = {})
201
176
 
202
- # Other generic methods to write
203
- # TODO: tags
204
- # TODO: files
205
- # TODO: item_types
206
- # TODO: elements
207
- # TODO: element_sets
208
- # TODO: users
177
+ url = self.endpoint
178
+ url += "/" + resource unless resource.nil?
179
+ url += "/" + id.to_s unless id.nil?
180
+ query[:key] = self.api_key unless self.api_key.nil?
181
+
182
+ case method
183
+ when "get"
184
+ self.connection.get(url, :params => query)
185
+ when "post"
186
+ self.connection.post(url, :body => body, :params => query)
187
+ when "put"
188
+ self.connection.put(url, :body => body, :params => query)
189
+ when "delete"
190
+ begin
191
+ self.connection.delete(url, :params => query)
192
+ rescue TypeError
193
+ # Not putting the error to stdout
194
+ end
195
+ end
196
+
197
+ end
198
+ private :build_request
209
199
 
210
200
  end
211
201
 
@@ -0,0 +1,25 @@
1
+ require "recursive_open_struct"
2
+
3
+ module OmekaClient
4
+ class DublinCore
5
+ def initialize(data)
6
+ # Step through the element texts separating them into Dublin Core and
7
+ # Item Type Metadata elements. e is the element text hash; i is the
8
+ # index of the element_text in the array of element texts. Then create
9
+ # reader and setter methods that point back to @data in the original
10
+ # class.
11
+ data.element_texts.each_with_index do |e, i|
12
+ if e.element_set.name == "Dublin Core"
13
+ define_singleton_method(
14
+ e.element.name.downcase.gsub(/\s/, '_'),
15
+ proc{ data.element_texts[i].text }
16
+ )
17
+ define_singleton_method(
18
+ e.element.name.downcase.gsub(/\s/, '_').gsub(/$/, '='),
19
+ proc{ |value| data.element_texts[i].text = value }
20
+ )
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ require "recursive_open_struct"
2
+
3
+ module OmekaClient
4
+ class ItemTypeMetadata
5
+ def initialize(data)
6
+ # Step through the element texts separating them into Dublin Core and
7
+ # Item Type Metadata elements. e is the element text hash; i is the
8
+ # index of the element_text in the array of element texts. Then create
9
+ # reader and setter methods that point back to @data in the original
10
+ # class.
11
+ data.element_texts.each_with_index do |e, i|
12
+ if e.element_set.name == "Item Type Metadata"
13
+ define_singleton_method(
14
+ e.element.name.downcase.gsub(/\s/, '_'),
15
+ proc{ data.element_texts[i].text }
16
+ )
17
+ define_singleton_method(
18
+ e.element.name.downcase.gsub(/\s/, '_').gsub(/$/, '='),
19
+ proc{ |value| data.element_texts[i].text = value }
20
+ )
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,26 @@
1
+ require "recursive_open_struct"
2
+
3
+ module OmekaClient
4
+
5
+ #
6
+ # A class to represent a collection in an Omeka site
7
+ #
8
+ # @author Lincoln Mullen
9
+ # @since 0.0.5
10
+ #
11
+ class OmekaCollection
12
+
13
+ attr_accessor :data, :dublin_core
14
+
15
+ # Parse the data we got from the API into handy methods.
16
+ #
17
+ # @param hash [Hash] Uses the parsed hash the API
18
+ #
19
+ def initialize(hash)
20
+ @data = RecursiveOpenStruct.new(hash, :recurse_over_arrays => true)
21
+ @dublin_core = DublinCore.new(@data)
22
+ end
23
+
24
+ end
25
+
26
+ end
@@ -1,4 +1,4 @@
1
- require "recursive-open-struct"
1
+ require "recursive_open_struct"
2
2
 
3
3
  module OmekaClient
4
4
 
@@ -10,55 +10,19 @@ module OmekaClient
10
10
  #
11
11
  class OmekaItem
12
12
 
13
- attr_accessor :data
13
+ attr_accessor :data, :dublin_core, :item_type_metadata
14
14
 
15
15
  # Parse the data we got from the API into handy methods. All of the data
16
16
  # from the JSON returned by the API is available as RecursiveOpenStructs
17
17
  # through @data. The Dublin Core and Item Type Metadata fields are also
18
18
  # available though special methods of the form dc_title and itm_field.
19
19
  #
20
- # @param hash [Hash] Uses the hash from OmekaClient::Client::get_hash
20
+ # @param hash [Hash] Uses the parsed hash from JSON api
21
21
  #
22
22
  def initialize(hash)
23
23
  @data = RecursiveOpenStruct.new(hash, :recurse_over_arrays => true)
24
-
25
- # Step through the element texts separating them into Dublin Core and
26
- # Item Type Metadata elements. e is the element text hash; i is the
27
- # index of the element_text in the array of element texts.
28
- @data.element_texts.each_with_index do |e, i|
29
- if e.element_set.name == "Dublin Core"
30
- # Define a reader method that retrieves the data from this element
31
- # text in @data
32
- self.class.send(:define_method,
33
- # The name of the method will have the form "dc_title"
34
- e.element.name.downcase.gsub(/^/, 'dc_').gsub(/\s/, '_'),
35
- proc{ @data.element_texts[i].text }
36
- )
37
- # Define a setter method that sets the data for this element text in
38
- # @ data
39
- self.class.send(:define_method,
40
- # The name of the method will have the form "dc_title="
41
- e.element.name.downcase.gsub(/^/, 'dc_').gsub(/\s/, '_').gsub(/$/, '='),
42
- proc{ |value| @data.element_texts[i].text = value }
43
- )
44
- elsif e.element_set.name == "Item Type Metadata"
45
- # Define a reader method that retrieves the data from this element
46
- # text in @data
47
- self.class.send(:define_method,
48
- # The name of the method will have the form "itm_field"
49
- e.element.name.downcase.gsub(/^/, 'itm_').gsub(/\s/, '_'),
50
- proc{ @data.element_texts[i].text }
51
- )
52
- # Define a setter method that sets the data for this element text in
53
- # @ data
54
- self.class.send(:define_method,
55
- # The name of the method will have the form "itm_title="
56
- e.element.name.downcase.gsub(/^/, 'itm_').gsub(/\s/, '_').gsub(/$/, '='),
57
- proc{ |value| @data.element_texts[i].text = value }
58
- )
59
- end
60
- end
61
-
24
+ @dublin_core = DublinCore.new(@data)
25
+ @item_type_metadata = ItemTypeMetadata.new(@data)
62
26
  end
63
27
 
64
28
  end
@@ -0,0 +1,22 @@
1
+ require "ostruct"
2
+
3
+ module OmekaClient
4
+
5
+ #
6
+ # A class to represent an Omeka site
7
+ #
8
+ # @author Lincoln Mullen
9
+ # @since 0.0.5
10
+ #
11
+ class OmekaSite
12
+
13
+ # Site information such as URL and title stored in @data
14
+ attr_accessor :data
15
+
16
+ def initialize(hash)
17
+ @data = OpenStruct.new(hash)
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -1,4 +1,4 @@
1
1
  module OmekaClient
2
2
  # The version number
3
- VERSION = "0.0.4"
3
+ VERSION = "1.0.0.a"
4
4
  end
@@ -35,81 +35,68 @@ describe OmekaClient::Client do
35
35
  end
36
36
  end
37
37
 
38
- it "must return a persistent wrapper for a GET request" do
39
- resources.each do |resource|
40
- client.get(resource).must_be_instance_of \
41
- Rest::Wrappers::NetHttpPersistentResponseWrapper
42
- end
43
- end
44
-
45
- it "must return a hash or array for a GET request" do
46
- resources.each do |resource|
47
- client.get_hash(resource).must_be_instance_of Array || Hash
48
- end
49
- end
38
+ # it "must return a representation of the site description" do
39
+ # client.site['title'].wont_be_nil
40
+ # end
50
41
 
51
- it "must return a representation of the site description" do
52
- client.site['title'].wont_be_nil
53
- end
54
-
55
- it "must list the resources available via the API" do
56
- client.resources.must_be_instance_of Hash
57
- client.resources.wont_be_empty
58
- end
42
+ # it "must list the resources available via the API" do
43
+ # client.resources.must_be_instance_of Hash
44
+ # client.resources.wont_be_empty
45
+ # end
59
46
 
60
47
  it "must list the items available via the API" do
61
- client.items.must_be_instance_of Array
62
- client.items.wont_be_empty
48
+ client.get_all_items.must_be_instance_of Array
49
+ client.get_all_items.wont_be_empty
63
50
  end
64
51
 
65
52
  it "must list the collections available via the API" do
66
- client.collections.must_be_instance_of Array
67
- client.collections.wont_be_empty
53
+ client.get_all_collections.must_be_instance_of Array
54
+ client.get_all_collections.wont_be_empty
68
55
  end
69
56
 
70
57
  it "must return an OmekaItem class" do
71
- client.omeka_items(1).must_be_instance_of OmekaClient::OmekaItem
58
+ client.get_item(1).must_be_instance_of OmekaClient::OmekaItem
72
59
  end
73
60
 
74
- it "must return an array of OmekaItem classes" do
75
- client.omeka_items.must_be_instance_of Array
76
- [0,1].each do |number|
77
- client.omeka_items[number].must_be_instance_of \
78
- OmekaClient::OmekaItem
79
- end
80
- end
61
+ # it "must return an array of OmekaItem classes" do
62
+ # client.get_all_items.must_be_instance_of Array
63
+ # [0,1].each do |number|
64
+ # client.get_item[number].must_be_instance_of \
65
+ # OmekaClient::OmekaItem
66
+ # end
67
+ # end
81
68
 
82
69
  it "must be able to POST an item and then DELETE it" do
83
70
  body = '{"public":true,"featured":false,"element_texts":[{"html":false,"text":"Item Added via API","element_set":{"id":1,"url":"http:\/\/localhost\/omeka-2.1-rc1\/api\/element_sets\/1","name":"Dublin Core","resource":"element_sets"},"element":{"id":50,"url":"http:\/\/localhost\/omeka-2.1-rc1\/api\/elements\/50","name":"Title","resource":"elements"}}]}'
84
71
  client.post("items", body).code.must_equal 201
85
- id = client.omeka_items.last.data.id
72
+ id = client.get_all_items.last.data.id
86
73
 
87
74
  # We can't make an assertion yet, because of a bug in the rest gem.
88
75
  client.delete("items", id)
89
76
  end
90
77
 
91
- it "must be able to update an item via PUT" do
92
- body_original = '{"public":true,"featured":false,"element_texts":[{"html":false,"text":"Item Added via API","element_set":{"id":1,"url":"http:\/\/localhost\/omeka-2.1-rc1\/api\/element_sets\/1","name":"Dublin Core","resource":"element_sets"},"element":{"id":50,"url":"http:\/\/localhost\/omeka-2.1-rc1\/api\/elements\/50","name":"Title","resource":"elements"}}]}'
93
- body_updated = '{"featured":true,"element_texts":[{"html":false,"text":"Item Updated via API","element_set":{"id":1,"url":"http:\/\/localhost\/omeka-2.1-rc1\/api\/element_sets\/1","name":"Dublin Core","resource":"element_sets"},"element":{"id":50,"url":"http:\/\/localhost\/omeka-2.1-rc1\/api\/elements\/50","name":"Title","resource":"elements"}}]}'
94
- client.post("items", body_original)
95
- item_original = client.omeka_items.last
96
- item_original.dc_title.must_equal "Item Added via API"
97
- item_original.data.featured.must_equal false
98
- client.put("items", item_original.data.id, body_updated).code.must_equal 200
99
- item_updated = client.omeka_items(item_original.data.id)
100
- item_updated.dc_title.must_equal "Item Updated via API"
101
- item_updated.data.featured.must_equal true
102
- end
103
-
104
- it "must be able to post, put, and delete an OmekaItem" do
105
- item = client.omeka_items(1)
106
- item.dc_title = "This item has been added via the API"
107
- client.post_item(item).code.must_equal 201
108
- new_item = client.omeka_items.last
109
- new_item.dc_title.must_equal item.dc_title
110
- new_item.dc_title = "This item has been updated via the API"
111
- client.put_item(new_item).code.must_equal 200
112
- client.delete_item(new_item) # can't test response code because of the bug
113
- end
78
+ # it "must be able to update an item via PUT" do
79
+ # body_original = '{"public":true,"featured":false,"element_texts":[{"html":false,"text":"Item Added via API","element_set":{"id":1,"url":"http:\/\/localhost\/omeka-2.1-rc1\/api\/element_sets\/1","name":"Dublin Core","resource":"element_sets"},"element":{"id":50,"url":"http:\/\/localhost\/omeka-2.1-rc1\/api\/elements\/50","name":"Title","resource":"elements"}}]}'
80
+ # body_updated = '{"featured":true,"element_texts":[{"html":false,"text":"Item Updated via API","element_set":{"id":1,"url":"http:\/\/localhost\/omeka-2.1-rc1\/api\/element_sets\/1","name":"Dublin Core","resource":"element_sets"},"element":{"id":50,"url":"http:\/\/localhost\/omeka-2.1-rc1\/api\/elements\/50","name":"Title","resource":"elements"}}]}'
81
+ # client.post("items", body_original)
82
+ # item_original = client.get_all_items.last
83
+ # item_original.dublin_core.title.must_equal "Item Added via API"
84
+ # item_original.data.featured.must_equal false
85
+ # client.put("items", item_original.data.id, body_updated).code.must_equal 200
86
+ # item_updated = client.get_all_items(item_original.data.id)
87
+ # item_updated.dublin_core.title.must_equal "Item Updated via API"
88
+ # item_updated.data.featured.must_equal true
89
+ # end
90
+
91
+ # it "must be able to post, put, and delete an OmekaItem" do
92
+ # item = client.get_item(1)
93
+ # item.dublin_core.title = "This item has been added via the API"
94
+ # client.post_items(item).code.must_equal 201
95
+ # new_item = client.get_all_items.last
96
+ # new_item.dublin_core.title.must_equal item.dublin_core.title
97
+ # new_item.dublin_core.title = "This item has been updated via the API"
98
+ # client.put_items(new_item).code.must_equal 200
99
+ # client.delete_item(new_item) # can't test response code because of the bug
100
+ # end
114
101
 
115
102
  end
@@ -0,0 +1,15 @@
1
+ require "minitest/autorun"
2
+ require "omeka_client"
3
+
4
+ # Set up an test client
5
+ test_endpoint = "http://localhost/omeka-2.1-rc1/api"
6
+ test_api_key = "3b036221e180af46bafa4b5e4a1db30e84e78e89" # contributor
7
+ client = OmekaClient::Client.new(test_endpoint, test_api_key)
8
+ item_a = client.get_item(1)
9
+ item_b = client.get_item(2)
10
+
11
+ describe OmekaClient::DublinCore do
12
+ it "must use singleton methods so that items maintain their own data" do
13
+ item_a.dublin_core.title.wont_equal item_b.dublin_core.title
14
+ end
15
+ end
@@ -0,0 +1,60 @@
1
+ require "minitest/autorun"
2
+ require "omeka_client"
3
+
4
+ # Set up an test client
5
+ test_endpoint = "http://localhost/omeka-2.1-rc1/api"
6
+ test_api_key = "3b036221e180af46bafa4b5e4a1db30e84e78e89" # contributor
7
+ client = OmekaClient::Client.new(test_endpoint, test_api_key)
8
+ collection = client.get_collection(1)
9
+
10
+ describe OmekaClient::OmekaCollection do
11
+ it "should be of class OmekaCollection" do
12
+ collection.must_be_instance_of OmekaClient::OmekaCollection
13
+ end
14
+
15
+ it "should represent the JSON data as a RecursiveOpenStruct" do
16
+ collection.data.must_be_instance_of RecursiveOpenStruct
17
+ end
18
+
19
+ it "should have an ID" do
20
+ collection.data.id.must_equal 1
21
+ end
22
+
23
+ it "should have a URL" do
24
+ collection.data.url.must_be_instance_of String
25
+ end
26
+
27
+ it "should know whether it's public" do
28
+ collection.data.public.wont_be_nil
29
+ end
30
+
31
+ it "should know whether it's featured" do
32
+ collection.data.featured.wont_be_nil
33
+ end
34
+
35
+ it "should have a date added" do
36
+ collection.data.added.must_be_instance_of String
37
+ end
38
+
39
+ it "should have a date modified" do
40
+ collection.data.modified.must_be_instance_of String
41
+ end
42
+
43
+ it "should know how many items it has" do
44
+ collection.data.items.count.must_be_instance_of Fixnum
45
+ end
46
+
47
+ it "should have extended resources" do
48
+ collection.data.extended_resources.must_be_instance_of Array
49
+ end
50
+
51
+ it "should have methods for each of the Dublin Core metadata" do
52
+ fields = [:title, :subject, :contributor, :description, :creator, \
53
+ :source, :publisher, :date, :rights, :relation, :format, :language, \
54
+ :type, :identifier, :coverage]
55
+ fields.each do |field|
56
+ collection.dublin_core.send(field).must_be_instance_of String
57
+ end
58
+ end
59
+
60
+ end
@@ -5,7 +5,7 @@ require "omeka_client"
5
5
  test_endpoint = "http://localhost/omeka-2.1-rc1/api"
6
6
  test_api_key = "3b036221e180af46bafa4b5e4a1db30e84e78e89" # contributor
7
7
  client = OmekaClient::Client.new(test_endpoint, test_api_key)
8
- item = client.omeka_items(1)
8
+ item = client.get_item(1)
9
9
 
10
10
  describe OmekaClient::OmekaItem do
11
11
 
@@ -58,27 +58,27 @@ describe OmekaClient::OmekaItem do
58
58
  end
59
59
 
60
60
  it "should have methods for each of the Dublin Core metadata" do
61
- dc_fields = [:title, :subject, :contributor, :description, :creator, \
61
+ fields = [:title, :subject, :contributor, :description, :creator, \
62
62
  :source, :publisher, :date, :rights, :relation, :format, :language, \
63
63
  :type, :identifier, :coverage]
64
- dc_fields.each do |field|
65
- item.send("dc_#{field}").must_be_instance_of String
64
+ fields.each do |field|
65
+ item.dublin_core.send(field).must_be_instance_of String
66
66
  end
67
67
  end
68
68
 
69
69
  it "should have the Item Type metadata" do
70
70
  # We're assuming we know the item type, in this case Lesson Plan
71
- itm_fields = [:duration, :standards, :objectives, :materials, \
71
+ fields = [:duration, :standards, :objectives, :materials, \
72
72
  :lesson_plan_text]
73
- itm_fields.each do |field|
74
- item.send("itm_#{field}").must_be_instance_of String
73
+ fields.each do |field|
74
+ item.item_type_metadata.send(field).must_be_instance_of String
75
75
  end
76
76
  end
77
77
 
78
- it "should be able to set the Dublin Core values and access them" do
79
- new_title = "My New DC Title"
80
- item.dc_title = new_title
81
- item.data.element_texts[0].text.must_equal new_title
82
- end
78
+ # it "should be able to set the Dublin Core values and access them" do
79
+ # item = client.omeka_items(1)
80
+ # item.dublin_core.title = "This Is the New Title"
81
+ # item.data.element_texts[0].text.must_equal item.dublin_core.title
82
+ # end
83
83
 
84
84
  end
@@ -0,0 +1,26 @@
1
+ require "minitest/autorun"
2
+ require "omeka_client"
3
+
4
+ # Set up an test client
5
+ test_endpoint = "http://localhost/omeka-2.1-rc1/api"
6
+ test_api_key = "3b036221e180af46bafa4b5e4a1db30e84e78e89" # contributor
7
+ client = OmekaClient::Client.new(test_endpoint, test_api_key)
8
+ site = client.get_site
9
+
10
+ describe OmekaClient::OmekaSite do
11
+ it "should be of class OmekaSite" do
12
+ site.must_be_instance_of OmekaClient::OmekaSite
13
+ end
14
+
15
+ it "should have data about the site" do
16
+ site.data.must_be_instance_of OpenStruct
17
+ end
18
+
19
+ it "should know the important data about the site" do
20
+ [:omeka_url, :omeka_version, :title, :description, \
21
+ :author, :copyright]. each do |var|
22
+ site.data.send(var).must_be_instance_of String
23
+ end
24
+ end
25
+
26
+ end
metadata CHANGED
@@ -1,111 +1,111 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omeka_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 1.0.0.a
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lincoln Mullen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-01 00:00:00.000000000 Z
11
+ date: 2013-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.3'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.3'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: 10.1.0
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 10.1.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: minitest
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: yard
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ~>
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
61
  version: 0.8.6.2
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ~>
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: 0.8.6.2
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: pry
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ~>
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
75
  version: 0.9.12.2
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ~>
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: 0.9.12.2
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rest
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ~>
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
89
  version: 2.6.3
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ~>
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: 2.6.3
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: recursive-open-struct
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - ~>
101
+ - - "~>"
102
102
  - !ruby/object:Gem::Version
103
103
  version: 0.4.3
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ~>
108
+ - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: 0.4.3
111
111
  description: A REST client to access the Omeka API
@@ -115,7 +115,7 @@ executables: []
115
115
  extensions: []
116
116
  extra_rdoc_files: []
117
117
  files:
118
- - .gitignore
118
+ - ".gitignore"
119
119
  - CHANGELOG.md
120
120
  - Gemfile
121
121
  - LICENSE.txt
@@ -123,11 +123,18 @@ files:
123
123
  - Rakefile
124
124
  - lib/omeka_client.rb
125
125
  - lib/omeka_client/client.rb
126
+ - lib/omeka_client/dublin-core.rb
127
+ - lib/omeka_client/item-type-metadata.rb
128
+ - lib/omeka_client/omeka-collection.rb
126
129
  - lib/omeka_client/omeka-item.rb
130
+ - lib/omeka_client/omeka-site.rb
127
131
  - lib/omeka_client/version.rb
128
132
  - omeka_client.gemspec
129
133
  - test/client_test.rb
134
+ - test/dublin-core_test.rb
135
+ - test/omeka-collection_test.rb
130
136
  - test/omeka-item_test.rb
137
+ - test/omeka-site_test.rb
131
138
  homepage: https://github.com/lmullen/omeka_client
132
139
  licenses:
133
140
  - GPLv3
@@ -138,21 +145,24 @@ require_paths:
138
145
  - lib
139
146
  required_ruby_version: !ruby/object:Gem::Requirement
140
147
  requirements:
141
- - - '>='
148
+ - - ">="
142
149
  - !ruby/object:Gem::Version
143
150
  version: '0'
144
151
  required_rubygems_version: !ruby/object:Gem::Requirement
145
152
  requirements:
146
- - - '>='
153
+ - - ">"
147
154
  - !ruby/object:Gem::Version
148
- version: '0'
155
+ version: 1.3.1
149
156
  requirements: []
150
157
  rubyforge_project:
151
- rubygems_version: 2.0.3
158
+ rubygems_version: 2.1.2
152
159
  signing_key:
153
160
  specification_version: 4
154
161
  summary: A REST client to access the Omeka API
155
162
  test_files:
156
163
  - test/client_test.rb
164
+ - test/dublin-core_test.rb
165
+ - test/omeka-collection_test.rb
157
166
  - test/omeka-item_test.rb
167
+ - test/omeka-site_test.rb
158
168
  has_rdoc: