dspace_rest_client 1.2.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +11 -0
  3. data/.rbenv +1 -0
  4. data/.rspec +2 -0
  5. data/Gemfile +13 -0
  6. data/README.md +58 -0
  7. data/Rakefile +1 -0
  8. data/bin/console +14 -0
  9. data/bin/setup +7 -0
  10. data/dspace_rest_client.gemspec +30 -0
  11. data/lib/dspace.rb +31 -0
  12. data/lib/{dspacerest → dspace}/bitstream.rb +4 -5
  13. data/lib/{dspacerest → dspace}/builders/hash_builder.rb +10 -6
  14. data/lib/{dspacerest → dspace}/builders/model_builder.rb +7 -7
  15. data/lib/dspace/builders/tempfile_builder.rb +26 -0
  16. data/lib/dspace/client.rb +78 -0
  17. data/lib/{dspacerest → dspace}/collection.rb +6 -13
  18. data/lib/{dspacerest → dspace}/community.rb +6 -8
  19. data/lib/{dspacerest → dspace}/item.rb +11 -19
  20. data/lib/{dspacerest → dspace}/metadata.rb +1 -2
  21. data/lib/{dspacerest → dspace}/policy.rb +2 -4
  22. data/lib/dspace/resources/authentication_resource.rb +22 -0
  23. data/lib/dspace/resources/bitstream_resource.rb +63 -0
  24. data/lib/dspace/resources/collection_resource.rb +50 -0
  25. data/lib/dspace/resources/community_resource.rb +78 -0
  26. data/lib/dspace/resources/item_resource.rb +66 -0
  27. data/lib/dspace/resources/status_resource.rb +19 -0
  28. data/lib/dspace/version.rb +3 -0
  29. data/spec/lib/dspace/resources/authentication_resource_spec.rb +34 -0
  30. data/spec/lib/dspace/resources/bitstream_resource_spec.rb +45 -0
  31. data/spec/lib/dspace/resources/collection_resource_spec.rb +50 -0
  32. data/spec/lib/dspace/resources/community_resource_spec.rb +81 -0
  33. data/spec/lib/dspace/resources/item_resource_spec.rb +69 -0
  34. data/spec/spec_helper.rb +5 -0
  35. metadata +171 -43
  36. data/lib/dspace_client.rb +0 -64
  37. data/lib/dspace_rest_client.rb +0 -17
  38. data/lib/dspacerest/repositories/abstract_repository.rb +0 -37
  39. data/lib/dspacerest/repositories/bitstream_repository.rb +0 -62
  40. data/lib/dspacerest/repositories/collection_repository.rb +0 -78
  41. data/lib/dspacerest/repositories/community_repository.rb +0 -76
  42. data/lib/dspacerest/repositories/dspace_repository.rb +0 -27
  43. data/lib/dspacerest/repositories/item_repository.rb +0 -80
  44. data/lib/dspacerest/strategies/uploads/curl_strategy.rb +0 -27
  45. 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: b2f83ca04d0ba0ceac01dbb9427a9a1aa7b777dd
4
- data.tar.gz: 404728373c56cacdd8face45b875f50aebe5dfeb
3
+ metadata.gz: 3b3f08f485b23a007cb64a7c526cf2684c4154c2
4
+ data.tar.gz: 2e8af21ca901677bfe3188c29f97dbc9d53729e4
5
5
  SHA512:
6
- metadata.gz: 8667ed334ae8f31aa0ca970243235a839e2bf184af32aed1b5759c8ced3a5fdb0e62ad983cbf96cf05c8d1f54ff02cce2a2e3ccd20aa028bf061f4772df58820
7
- data.tar.gz: 8a5b6e03db7f815060913e6e93533d6a328a96ba72f46ac8b8bb2973cdddf1aea135c25e896a79a6a5798beac808938da1c267f9cc7fcc78d3551f627ef73ffd
6
+ metadata.gz: f5223f543ac5d1112864ba60122666dfedb274ec9f69a1cc471686cb11428d3ea13294770d57a314c46af60412413454ac37162862c1fa1b86f2967ace787074
7
+ data.tar.gz: 3fd6de4861ea64105255b68cf462c8b2ec14e1f2b7495c4f60cc53a91fa7281abdacb795bb7ffc13bc3e9ad60f3486e043a6d51550f87421c4f90052f1bd64a0
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ /_lib/
11
+ /.idea/
data/.rbenv ADDED
@@ -0,0 +1 @@
1
+ 2.2.0
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
3
+
4
+ gem 'json'
5
+ gem 'resource_kit'
6
+ gem 'faraday'
7
+ gem 'net-http-persistent'
8
+ gem 'activesupport'
9
+
10
+ group :development, :spec do
11
+ gem 'minitest', '~> 5.8.3'
12
+ gem 'rspec'
13
+ end
@@ -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.
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -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
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -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
@@ -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 DSpaceRest
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 = DSpaceRest::Builders::ModelBuilder.build_policies(args['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
- h = {
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 DSpaceRest
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
- hash = []
7
- unless list.nil?
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
- hash
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 DSpaceRest
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 << DSpaceRest::Community.new(c)
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 << DSpaceRest::Collection.new(c)
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 << DSpaceRest::Item.new(c)
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 << DSpaceRest::Bitstream.new(c)
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 << DSpaceRest::Metadata.new(c)
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 << DSpaceRest::Policy.new(c)
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 DSpaceRest
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 = DSpaceRest::Community.new(args['parentCommunity']) unless args['parentCommunity'].nil?
27
- @parent_community_list = DSpaceRest::Builders::ModelBuilder.build_communities(args['parentCommunityList'])
28
- @items = DSpaceRest::Builders::ModelBuilder.build_items(args['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
- h = {
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