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.
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