dspace_rest_client 1.2.0 → 2.1.0
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/.gitignore +11 -0
- data/.rbenv +1 -0
- data/.rspec +2 -0
- data/Gemfile +13 -0
- data/README.md +58 -0
- data/Rakefile +1 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/dspace_rest_client.gemspec +30 -0
- data/lib/dspace.rb +31 -0
- data/lib/{dspacerest → dspace}/bitstream.rb +4 -5
- data/lib/{dspacerest → dspace}/builders/hash_builder.rb +10 -6
- data/lib/{dspacerest → dspace}/builders/model_builder.rb +7 -7
- data/lib/dspace/builders/tempfile_builder.rb +26 -0
- data/lib/dspace/client.rb +78 -0
- data/lib/{dspacerest → dspace}/collection.rb +6 -13
- data/lib/{dspacerest → dspace}/community.rb +6 -8
- data/lib/{dspacerest → dspace}/item.rb +11 -19
- data/lib/{dspacerest → dspace}/metadata.rb +1 -2
- data/lib/{dspacerest → dspace}/policy.rb +2 -4
- data/lib/dspace/resources/authentication_resource.rb +22 -0
- data/lib/dspace/resources/bitstream_resource.rb +63 -0
- data/lib/dspace/resources/collection_resource.rb +50 -0
- data/lib/dspace/resources/community_resource.rb +78 -0
- data/lib/dspace/resources/item_resource.rb +66 -0
- data/lib/dspace/resources/status_resource.rb +19 -0
- data/lib/dspace/version.rb +3 -0
- data/spec/lib/dspace/resources/authentication_resource_spec.rb +34 -0
- data/spec/lib/dspace/resources/bitstream_resource_spec.rb +45 -0
- data/spec/lib/dspace/resources/collection_resource_spec.rb +50 -0
- data/spec/lib/dspace/resources/community_resource_spec.rb +81 -0
- data/spec/lib/dspace/resources/item_resource_spec.rb +69 -0
- data/spec/spec_helper.rb +5 -0
- metadata +171 -43
- data/lib/dspace_client.rb +0 -64
- data/lib/dspace_rest_client.rb +0 -17
- data/lib/dspacerest/repositories/abstract_repository.rb +0 -37
- data/lib/dspacerest/repositories/bitstream_repository.rb +0 -62
- data/lib/dspacerest/repositories/collection_repository.rb +0 -78
- data/lib/dspacerest/repositories/community_repository.rb +0 -76
- data/lib/dspacerest/repositories/dspace_repository.rb +0 -27
- data/lib/dspacerest/repositories/item_repository.rb +0 -80
- data/lib/dspacerest/strategies/uploads/curl_strategy.rb +0 -27
- data/lib/dspacerest/strategies/uploads/rest_strategy.rb +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3b3f08f485b23a007cb64a7c526cf2684c4154c2
|
4
|
+
data.tar.gz: 2e8af21ca901677bfe3188c29f97dbc9d53729e4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f5223f543ac5d1112864ba60122666dfedb274ec9f69a1cc471686cb11428d3ea13294770d57a314c46af60412413454ac37162862c1fa1b86f2967ace787074
|
7
|
+
data.tar.gz: 3fd6de4861ea64105255b68cf462c8b2ec14e1f2b7495c4f60cc53a91fa7281abdacb795bb7ffc13bc3e9ad60f3486e043a6d51550f87421c4f90052f1bd64a0
|
data/.gitignore
ADDED
data/.rbenv
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.2.0
|
data/.rspec
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
# DSpace REST Client
|
2
|
+
|
3
|
+
## Installation
|
4
|
+
|
5
|
+
Add this line to your application's Gemfile:
|
6
|
+
|
7
|
+
```ruby
|
8
|
+
gem 'dspace_rest_client'
|
9
|
+
```
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install dspace_rest_client
|
18
|
+
|
19
|
+
## Get started
|
20
|
+
|
21
|
+
Some requests requires user authentication.
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
require 'dspace'
|
25
|
+
client = Dspace::Client.new(dspace_api: 'https://demo.dspace.org/')
|
26
|
+
|
27
|
+
if !client.is_running?
|
28
|
+
raise 'Can\'t connect to DSpace API.'
|
29
|
+
end
|
30
|
+
|
31
|
+
# authenticate
|
32
|
+
client.login 'dspacedemo+admin@gmail.com', 'dspace'
|
33
|
+
|
34
|
+
# create an community
|
35
|
+
client.communities.create(Dspace::Community.new({'name' => 'Testando'}))
|
36
|
+
|
37
|
+
# get a bitstream and your file
|
38
|
+
bitstream = client.bitstreams.find(id: 20, expand: 'parent')
|
39
|
+
tmp_file = client.bitstreams.retrieve(id: 20) #<Tempfile:/tmp/..._teste.jpg>
|
40
|
+
|
41
|
+
# creating a new bitstream for some item
|
42
|
+
file = File.new('/your/path/Pictures/Celular/some_book.pdf', 'r')
|
43
|
+
bitstream = client.items.add_bitstream(file, id: 11, name: 'some_book.pdf', description: 'testing upload a pdf book')
|
44
|
+
|
45
|
+
# updating bitstream metadata
|
46
|
+
bitstream.name = 'new_book_name.pdf'
|
47
|
+
client.bitstreams.update(bitstream, id: bitstream.id)
|
48
|
+
```
|
49
|
+
|
50
|
+
To see more examples, visit our Wiki.
|
51
|
+
|
52
|
+
## Development
|
53
|
+
|
54
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rspec spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
55
|
+
|
56
|
+
## Contributing
|
57
|
+
|
58
|
+
Bug reports and pull requests are welcome. This project is intended to be a safe, welcoming space for collaboration.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "dspace"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/setup
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'dspace/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.date = '2015-12-04'
|
8
|
+
spec.name = "dspace_rest_client"
|
9
|
+
spec.version = Dspace::VERSION
|
10
|
+
spec.authors = ["Mauricio Giacomini Girardello", "Lucas Ernesto Kindinger", "Bruno N. Zanette", "Mateus Rambo Strey"]
|
11
|
+
spec.email = ["mauriciogiacomini4@gmail.com", "kindingerlek@hotmail.com"]
|
12
|
+
spec.summary = 'DSpace REST API Client for Ruby'
|
13
|
+
spec.description = 'DSpace REST-API Client for Ruby! Implements all DSpace REST-API endpoints requests.'
|
14
|
+
spec.homepage = 'https://gitlab.c3sl.ufpr.br/c3sl/dspace-rest-client'
|
15
|
+
spec.license = 'GNU - General Public License'
|
16
|
+
spec.test_files = `git ls-files -z spec/`.split("\0")
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(spec)/}) }
|
18
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_runtime_dependency "json", '~> 1.8', '>= 1.8.3'
|
22
|
+
spec.add_runtime_dependency "resource_kit", "~> 0.1.4"
|
23
|
+
spec.add_runtime_dependency "faraday", "~> 0.9.2"
|
24
|
+
spec.add_runtime_dependency "net-http-persistent", '~> 2.9', '>= 2.9.4'
|
25
|
+
spec.add_runtime_dependency "activesupport", '~> 4.2', '>= 4.2.0'
|
26
|
+
|
27
|
+
spec.add_development_dependency "bundler", "~> 1.10"
|
28
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
29
|
+
spec.add_development_dependency 'rspec', '~> 3.4', '>= 3.4.0'
|
30
|
+
end
|
data/lib/dspace.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require "forwardable"
|
2
|
+
require "json"
|
3
|
+
require "resource_kit"
|
4
|
+
require "faraday"
|
5
|
+
require "active_support/all"
|
6
|
+
|
7
|
+
require_relative "dspace/version"
|
8
|
+
require_relative "dspace/resources/community_resource"
|
9
|
+
require_relative "dspace/resources/collection_resource"
|
10
|
+
require_relative "dspace/resources/authentication_resource"
|
11
|
+
require_relative "dspace/resources/bitstream_resource"
|
12
|
+
require_relative "dspace/resources/status_resource"
|
13
|
+
require_relative "dspace/resources/item_resource"
|
14
|
+
require_relative "dspace/builders/hash_builder"
|
15
|
+
require_relative "dspace/builders/model_builder"
|
16
|
+
require_relative "dspace/builders/tempfile_builder"
|
17
|
+
require_relative "dspace/community"
|
18
|
+
require_relative "dspace/collection"
|
19
|
+
require_relative "dspace/item"
|
20
|
+
require_relative "dspace/metadata"
|
21
|
+
require_relative "dspace/bitstream"
|
22
|
+
require_relative "dspace/policy"
|
23
|
+
require_relative "dspace/client"
|
24
|
+
|
25
|
+
module Dspace
|
26
|
+
|
27
|
+
class NotAuthorizedError < StandardError; end
|
28
|
+
class InvalidTokenError < StandardError; end
|
29
|
+
class InvalidCredentialsError < StandardError; end
|
30
|
+
|
31
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
|
-
module
|
1
|
+
module Dspace
|
2
2
|
class Bitstream
|
3
|
+
include Dspace::Builders::HashBuilder
|
3
4
|
|
4
5
|
attr_accessor :name, :bundle_name,
|
5
6
|
:description, :format, :mime_type
|
@@ -22,12 +23,12 @@ module DSpaceRest
|
|
22
23
|
@retrieve_link = args['retrieveLink']
|
23
24
|
@check_sum = args['checkSum']
|
24
25
|
@sequence_id = args['sequenceId']
|
25
|
-
@policies =
|
26
|
+
@policies = Dspace::Builders::ModelBuilder.build_policies(args['policies'])
|
26
27
|
@expand = args['expand']
|
27
28
|
end
|
28
29
|
|
29
30
|
def to_h
|
30
|
-
|
31
|
+
{
|
31
32
|
id: @id,
|
32
33
|
name: @name,
|
33
34
|
type: @type,
|
@@ -44,8 +45,6 @@ module DSpaceRest
|
|
44
45
|
policies: @policies,
|
45
46
|
expand: @expand
|
46
47
|
}
|
47
|
-
|
48
|
-
h
|
49
48
|
end
|
50
49
|
end
|
51
50
|
end
|
@@ -1,18 +1,22 @@
|
|
1
|
-
module
|
1
|
+
module Dspace
|
2
2
|
module Builders
|
3
3
|
module HashBuilder
|
4
4
|
|
5
|
+
def obj2hash(list)
|
6
|
+
self.class.models2hash list
|
7
|
+
end
|
8
|
+
|
5
9
|
def self.models2hash(list)
|
6
|
-
|
7
|
-
|
10
|
+
if list.is_a? Array
|
11
|
+
hash = []
|
8
12
|
list.each do |m|
|
9
13
|
hash << m.to_h
|
10
14
|
end
|
11
|
-
end
|
12
15
|
|
13
|
-
|
16
|
+
hash
|
17
|
+
end
|
14
18
|
end
|
15
19
|
|
16
20
|
end
|
17
21
|
end
|
18
|
-
end
|
22
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
module
|
1
|
+
module Dspace
|
2
2
|
module Builders
|
3
3
|
module ModelBuilder
|
4
4
|
|
@@ -6,7 +6,7 @@ module DSpaceRest
|
|
6
6
|
return communities if communities.nil?
|
7
7
|
colls = []
|
8
8
|
communities.each do |c|
|
9
|
-
colls <<
|
9
|
+
colls << Dspace::Community.new(c)
|
10
10
|
end
|
11
11
|
colls
|
12
12
|
end
|
@@ -15,7 +15,7 @@ module DSpaceRest
|
|
15
15
|
return collections if collections.nil?
|
16
16
|
colls = []
|
17
17
|
collections.each do |c|
|
18
|
-
colls <<
|
18
|
+
colls << Dspace::Collection.new(c)
|
19
19
|
end
|
20
20
|
colls
|
21
21
|
end
|
@@ -24,7 +24,7 @@ module DSpaceRest
|
|
24
24
|
return items if items.nil?
|
25
25
|
colls = []
|
26
26
|
items.each do |c|
|
27
|
-
colls <<
|
27
|
+
colls << Dspace::Item.new(c)
|
28
28
|
end
|
29
29
|
colls
|
30
30
|
end
|
@@ -33,7 +33,7 @@ module DSpaceRest
|
|
33
33
|
return bitstreams if bitstreams.nil?
|
34
34
|
colls = []
|
35
35
|
bitstreams.each do |c|
|
36
|
-
colls <<
|
36
|
+
colls << Dspace::Bitstream.new(c)
|
37
37
|
end
|
38
38
|
colls
|
39
39
|
end
|
@@ -42,7 +42,7 @@ module DSpaceRest
|
|
42
42
|
return metadatas if metadatas.nil?
|
43
43
|
colls = []
|
44
44
|
metadatas.each do |c|
|
45
|
-
colls <<
|
45
|
+
colls << Dspace::Metadata.new(c)
|
46
46
|
end
|
47
47
|
colls
|
48
48
|
end
|
@@ -51,7 +51,7 @@ module DSpaceRest
|
|
51
51
|
return policies if policies.nil?
|
52
52
|
colls = []
|
53
53
|
policies.each do |c|
|
54
|
-
colls <<
|
54
|
+
colls << Dspace::Policy.new(c)
|
55
55
|
end
|
56
56
|
colls
|
57
57
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Dspace
|
2
|
+
module Builders
|
3
|
+
module TempfileBuilder
|
4
|
+
|
5
|
+
def self.build(filename, contents = nil)
|
6
|
+
file = Tempfile.new([sanitize_filename(filename), File.extname(filename)]).tap do |f|
|
7
|
+
f.write contents
|
8
|
+
f.close
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def self.sanitize_filename(filename)
|
15
|
+
filename.strip do |name|
|
16
|
+
# NOTE: File.basename doesn't work right with Windows paths on Unix
|
17
|
+
# get only the filename, not the whole path
|
18
|
+
name.gsub!(/^.*(\\|\/)/, '')
|
19
|
+
# Strip out the non-ascii character
|
20
|
+
name.gsub!(/[^0-9A-Za-z.\-]/, '_')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module Dspace
|
2
|
+
class Client
|
3
|
+
DSPACE_API = 'https://demo.dspace.org'
|
4
|
+
|
5
|
+
attr_reader :access_token
|
6
|
+
|
7
|
+
def initialize(options = {})
|
8
|
+
@access_token = options.with_indifferent_access[:access_token]
|
9
|
+
@dspace_api = options.with_indifferent_access[:dspace_api]
|
10
|
+
@logger = options.with_indifferent_access[:logger]
|
11
|
+
end
|
12
|
+
|
13
|
+
def connection
|
14
|
+
Faraday.new(connection_options) do |req|
|
15
|
+
req.request :multipart
|
16
|
+
req.request :url_encoded
|
17
|
+
req.use(Faraday::Response::Logger, @logger) unless @logger.nil?
|
18
|
+
req.adapter :net_http_persistent
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.resources
|
23
|
+
{
|
24
|
+
bitstreams: ::Dspace::Resources::BitstreamResource,
|
25
|
+
items: ::Dspace::Resources::ItemResource,
|
26
|
+
collections: ::Dspace::Resources::CollectionResource,
|
27
|
+
communities: ::Dspace::Resources::CommunityResource,
|
28
|
+
status: ::Dspace::Resources::StatusResource,
|
29
|
+
authentication: ::Dspace::Resources::AuthenticationResource
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
def method_missing(name, *args, &block)
|
34
|
+
resource(name) || super
|
35
|
+
end
|
36
|
+
|
37
|
+
def resources
|
38
|
+
@resources ||= {}
|
39
|
+
end
|
40
|
+
|
41
|
+
def is_running?
|
42
|
+
resource(:status).test
|
43
|
+
end
|
44
|
+
|
45
|
+
def login(email, password)
|
46
|
+
@access_token = resource(:authentication).login(email, password)
|
47
|
+
end
|
48
|
+
|
49
|
+
def logout
|
50
|
+
resource(:authentication).logout
|
51
|
+
@access_token = nil
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def resource(name)
|
57
|
+
if self.class.resources.keys.include?(name)
|
58
|
+
resources[name] ||= self.class.resources[name].new(connection: connection)
|
59
|
+
resources[name]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def connection_options
|
64
|
+
{
|
65
|
+
url: @dspace_api || DSPACE_API,
|
66
|
+
ssl: {
|
67
|
+
verify: false
|
68
|
+
},
|
69
|
+
headers: {
|
70
|
+
content_type: 'application/json',
|
71
|
+
accept: 'application/json',
|
72
|
+
'rest-dspace-token' => access_token.to_s,
|
73
|
+
user_agent: "dspace-rest-client #{Dspace::VERSION}"
|
74
|
+
}
|
75
|
+
}
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
|
-
module
|
1
|
+
module Dspace
|
2
2
|
class Collection
|
3
|
+
include Dspace::Builders::HashBuilder
|
3
4
|
|
4
5
|
attr_accessor :name, :logo, :license, :copyright_text,
|
5
6
|
:introductory_text, :short_description, :sidebar_text
|
@@ -23,13 +24,13 @@ module DSpaceRest
|
|
23
24
|
@number_items = args['numberItems']
|
24
25
|
@expand = args['expand']
|
25
26
|
|
26
|
-
@parent_community =
|
27
|
-
@parent_community_list =
|
28
|
-
@items =
|
27
|
+
@parent_community = Dspace::Community.new(args['parentCommunity']) unless args['parentCommunity'].nil?
|
28
|
+
@parent_community_list = Dspace::Builders::ModelBuilder.build_communities(args['parentCommunityList'])
|
29
|
+
@items = Dspace::Builders::ModelBuilder.build_items(args['items'])
|
29
30
|
end
|
30
31
|
|
31
32
|
def to_h
|
32
|
-
|
33
|
+
{
|
33
34
|
id: @id,
|
34
35
|
name: @name,
|
35
36
|
handle: @handle,
|
@@ -47,14 +48,6 @@ module DSpaceRest
|
|
47
48
|
numberItems: @number_items,
|
48
49
|
expand: @expand
|
49
50
|
}
|
50
|
-
|
51
|
-
h
|
52
|
-
end
|
53
|
-
|
54
|
-
private
|
55
|
-
|
56
|
-
def obj2hash(list)
|
57
|
-
DSpaceRest::Builders::HashBuilder.models2hash list
|
58
51
|
end
|
59
52
|
|
60
53
|
end
|