dataverse 0.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 +7 -0
- data/.env.template +3 -0
- data/.gitignore +16 -0
- data/.rspec +3 -0
- data/.travis.yml +6 -0
- data/CHANGELOG.md +5 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Gemfile +14 -0
- data/Gemfile.lock +62 -0
- data/LICENSE.txt +21 -0
- data/README.md +598 -0
- data/Rakefile +8 -0
- data/bin/console +19 -0
- data/bin/setup +8 -0
- data/dataverse.gemspec +31 -0
- data/lib/dataverse.rb +7 -0
- data/lib/dataverse/base.rb +124 -0
- data/lib/dataverse/dataset.rb +376 -0
- data/lib/dataverse/dataverse.rb +157 -0
- data/lib/dataverse/errors.rb +27 -0
- data/lib/dataverse/version.rb +5 -0
- metadata +80 -0
@@ -0,0 +1,157 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'base'
|
4
|
+
require_relative 'dataset'
|
5
|
+
|
6
|
+
module Dataverse
|
7
|
+
class Dataverse < Base
|
8
|
+
|
9
|
+
attr_reader :id
|
10
|
+
|
11
|
+
def self.id(id)
|
12
|
+
new(id)
|
13
|
+
rescue RestClient::NotFound
|
14
|
+
nil
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.root
|
18
|
+
id(':root')
|
19
|
+
end
|
20
|
+
|
21
|
+
SAMPLE_DATA= {
|
22
|
+
name: 'new dataverse',
|
23
|
+
alias: 'new_dv',
|
24
|
+
dataverseContacts: [
|
25
|
+
{ contactEmail: 'abc@def.org'}
|
26
|
+
],
|
27
|
+
affiliation: 'My organization',
|
28
|
+
description: 'My new dataverse',
|
29
|
+
dataverseType: 'ORGANIZATIONS_INSTITUTIONS'
|
30
|
+
}
|
31
|
+
|
32
|
+
TYPES = %w'DEPARTMENT JOURNALS LABORATORY ORGANIZATIONS_INSTITUTIONS RESEARCHERS RESEARCH_GROUP RESEARCH_PROJECTS TEACHING_COURSES UNCATEGORIZED'
|
33
|
+
|
34
|
+
def create(data)
|
35
|
+
data = StringIO.new(data.to_json) if data.is_a?(Hash)
|
36
|
+
if data.is_a?(String)
|
37
|
+
begin
|
38
|
+
if File.exist?(data)
|
39
|
+
data = File.open(data, 'r')
|
40
|
+
elsif JSON::parse(data)
|
41
|
+
data = StringIO.new(data)
|
42
|
+
end
|
43
|
+
rescue JSON::ParserError, File
|
44
|
+
data = nil
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
unless data.is_a?(File) || data.is_a?(StringIO)
|
49
|
+
raise Error.new("Data could not be parsed. Should be a Hash, filename or JSON string.")
|
50
|
+
end
|
51
|
+
|
52
|
+
result = call('', method: :post, body: data)
|
53
|
+
|
54
|
+
dv = Dataverse.new(nil)
|
55
|
+
dv.init(result)
|
56
|
+
dv.instance_variable_set('@id', result['id'])
|
57
|
+
return dv
|
58
|
+
|
59
|
+
ensure
|
60
|
+
data.close if data.is_a?(File)
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
def publish
|
65
|
+
call("actions/:publish", method: :post)
|
66
|
+
return "Dataverse #{id} published"
|
67
|
+
end
|
68
|
+
|
69
|
+
def delete
|
70
|
+
call('', method: :delete)['message']
|
71
|
+
end
|
72
|
+
|
73
|
+
def call(url, **args)
|
74
|
+
api_call("dataverses/#{id}/#{url}", **args)
|
75
|
+
end
|
76
|
+
|
77
|
+
def children
|
78
|
+
@children ||= begin
|
79
|
+
result = []
|
80
|
+
data = call("contents")
|
81
|
+
data.each do |x|
|
82
|
+
case x['type']
|
83
|
+
when 'dataverse'
|
84
|
+
result << Dataverse.id(x['id'])
|
85
|
+
when 'dataset'
|
86
|
+
result << Dataset.id(x['id'])
|
87
|
+
else
|
88
|
+
raise Error.new("Unsupported type: #{x['type']} (#{x['name']})")
|
89
|
+
end
|
90
|
+
end
|
91
|
+
result
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def each_dataverse(&block)
|
96
|
+
data = []
|
97
|
+
children.each do |child|
|
98
|
+
if child.is_a?(Dataverse)
|
99
|
+
data << (block_given? ? yield(child) : child)
|
100
|
+
data += child.each_dataverse(&block)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
data
|
104
|
+
end
|
105
|
+
|
106
|
+
def each_dataset(&block)
|
107
|
+
data = []
|
108
|
+
children.each do |child|
|
109
|
+
if child.is_a?(Dataverse)
|
110
|
+
data += child.each_dataset(&block)
|
111
|
+
elsif child.is_a?(Dataset)
|
112
|
+
data << (block_given? ? yield(child) : child)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
data
|
116
|
+
end
|
117
|
+
|
118
|
+
def size
|
119
|
+
@size ||= begin
|
120
|
+
data = api_call("dataverses/#{id}/storagesize")
|
121
|
+
data['message'][/[,\d]+/].delete(',').to_i
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def rdm_data
|
126
|
+
api_data
|
127
|
+
end
|
128
|
+
|
129
|
+
def export_metadata(md_type)
|
130
|
+
format = case md_type.to_s
|
131
|
+
when 'rdm'
|
132
|
+
return rdm_data
|
133
|
+
else
|
134
|
+
raise Error.new("Unknown metadata format: '#{md_type}'")
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
protected
|
139
|
+
|
140
|
+
def initialize(id)
|
141
|
+
@id = id
|
142
|
+
init(get_data)
|
143
|
+
end
|
144
|
+
|
145
|
+
def init(data)
|
146
|
+
@size = nil
|
147
|
+
@children = nil
|
148
|
+
super(data)
|
149
|
+
end
|
150
|
+
|
151
|
+
def get_data
|
152
|
+
return unless id
|
153
|
+
api_call("dataverses/#{id}")
|
154
|
+
end
|
155
|
+
|
156
|
+
end
|
157
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Dataverse
|
4
|
+
|
5
|
+
class Error < StandardError
|
6
|
+
def initialize(msg, backtrace: nil)
|
7
|
+
@backtrace = backtrace
|
8
|
+
super(msg)
|
9
|
+
end
|
10
|
+
|
11
|
+
def backtrace
|
12
|
+
return @backtrace if @backtrace
|
13
|
+
super
|
14
|
+
end
|
15
|
+
|
16
|
+
def cause
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class VersionError < Error
|
22
|
+
def initialize(version)
|
23
|
+
super "Version #{version} does not exist"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
metadata
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dataverse
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Kris Dekeyser
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-04-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rest-client
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.0'
|
27
|
+
description: Dataverse.org API wrapper.
|
28
|
+
email:
|
29
|
+
- kris.dekeyser@libis.be
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- ".env.template"
|
35
|
+
- ".gitignore"
|
36
|
+
- ".rspec"
|
37
|
+
- ".travis.yml"
|
38
|
+
- CHANGELOG.md
|
39
|
+
- CODE_OF_CONDUCT.md
|
40
|
+
- Gemfile
|
41
|
+
- Gemfile.lock
|
42
|
+
- LICENSE.txt
|
43
|
+
- README.md
|
44
|
+
- Rakefile
|
45
|
+
- bin/console
|
46
|
+
- bin/setup
|
47
|
+
- dataverse.gemspec
|
48
|
+
- lib/dataverse.rb
|
49
|
+
- lib/dataverse/base.rb
|
50
|
+
- lib/dataverse/dataset.rb
|
51
|
+
- lib/dataverse/dataverse.rb
|
52
|
+
- lib/dataverse/errors.rb
|
53
|
+
- lib/dataverse/version.rb
|
54
|
+
homepage: https://rubygems.org/gems/dataverse
|
55
|
+
licenses:
|
56
|
+
- MIT
|
57
|
+
metadata:
|
58
|
+
homepage_uri: https://rubygems.org/gems/dataverse
|
59
|
+
source_code_uri: https://github.com/libis/dataverse_api
|
60
|
+
changelog_uri: https://github.com/libis/dataverse_api/CHANGELOG.md
|
61
|
+
post_install_message:
|
62
|
+
rdoc_options: []
|
63
|
+
require_paths:
|
64
|
+
- lib
|
65
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 2.4.0
|
70
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
requirements: []
|
76
|
+
rubygems_version: 3.2.15
|
77
|
+
signing_key:
|
78
|
+
specification_version: 4
|
79
|
+
summary: Dataverse API.
|
80
|
+
test_files: []
|