mrt-ingest 0.0.4 → 0.0.5

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.
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ module Mrt::Ingest
4
+ module MessageDigest
5
+ describe SHA256 do
6
+ it 'wraps an SHA256 digest' do
7
+ value = '40191d95b873db0b6ac09aca3cf51188ce914920a2330ddda1d88f75d93588e6'
8
+ digest = SHA256.new(value)
9
+ expect(digest.value).to eq(value)
10
+ expect(digest.type).to eq('sha-256')
11
+ end
12
+ end
13
+ describe MD5 do
14
+ it 'wraps an MD5 digest' do
15
+ value = 'b6d8a343fe281e92f1296283c29efc72'
16
+ digest = MD5.new(value)
17
+ expect(digest.value).to eq(value)
18
+ expect(digest.type).to eq('md5')
19
+ end
20
+
21
+ describe :from_file do
22
+ it 'hashes a file in text mode' do
23
+ digest = MD5.from_file(File.new('spec/unit/data/file.txt'))
24
+ expect(digest.value).to eq('91b767c2da0e8bfe318aee57d907d5f7')
25
+ expect(digest.type).to eq('md5')
26
+ end
27
+ end
28
+ end
29
+ describe SHA1 do
30
+ it 'wraps an SHA1 digest' do
31
+ value = '08eefa1ab77c34a479310632923771f835c475e3'
32
+ digest = SHA1.new(value)
33
+ expect(digest.value).to eq(value)
34
+ expect(digest.type).to eq('sha1')
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,113 @@
1
+ require 'spec_helper'
2
+ require 'English'
3
+
4
+ module Mrt::Ingest
5
+ describe OneTimeServer do
6
+ attr_reader :server
7
+
8
+ before(:each) do
9
+ @server = OneTimeServer.new
10
+ server.start_server
11
+ end
12
+
13
+ after(:each) do
14
+ server.stop_server
15
+ end
16
+
17
+ describe :finished? do
18
+ it 'returns true when all files have been served, false otherwise' do
19
+ urls = (0..3).map do |i|
20
+ url_str, = server.add_file { |f| f.puts("I am file #{i}") }
21
+ url_str
22
+ end
23
+
24
+ urls.each do |url|
25
+ expect(server.finished?).to be_falsey
26
+ Net::HTTP.get(URI.parse(url))
27
+ end
28
+
29
+ expect(server.finished?).to be_truthy
30
+ end
31
+ end
32
+
33
+ describe :temppath do
34
+ it 'avoids collisions' do
35
+ tmpfiles = []
36
+ allow(Tempfile).to receive(:new).and_wrap_original do |m, *args|
37
+ tmpfile = m.call(*args)
38
+ if tmpfiles.empty?
39
+ known_paths = server.instance_variable_get(:@known_paths)
40
+ known_paths[tmpfile.path] = true
41
+ end
42
+ tmpfiles << tmpfile.path
43
+ tmpfile
44
+ end
45
+
46
+ temppath = server.temppath
47
+ expect(tmpfiles.size).to eq(2)
48
+ expect(temppath).to eq(tmpfiles[1])
49
+ end
50
+ end
51
+
52
+ describe :join_server do
53
+ it 'blocks till all files have been served' do
54
+ urls = (0..3).map do |i|
55
+ url_str, = server.add_file { |f| f.puts("I am file #{i}") }
56
+ url_str
57
+ end
58
+
59
+ joining_thread = Thread.new { server.join_server }
60
+ expect(joining_thread.status).not_to be_falsey
61
+
62
+ client_process_id = fork do
63
+ begin
64
+ urls.each do |url|
65
+ resp = Net::HTTP.get_response(URI.parse(url))
66
+ status = resp.code.to_i
67
+ exit(status) if status != 200
68
+ end
69
+ rescue StandardError => e
70
+ warn(e)
71
+ exit(1)
72
+ end
73
+ end
74
+ Process.wait(client_process_id)
75
+ expect($CHILD_STATUS.exitstatus).to eq(0) # just to be sure
76
+
77
+ Timeout.timeout(5) { joining_thread.join }
78
+ expect(joining_thread.status).to eq(false)
79
+ end
80
+ end
81
+
82
+ describe :run do
83
+ it 'starts, serves, and stops' do
84
+ server2 = OneTimeServer.new
85
+ urls = (0..3).map do |i|
86
+ url_str, = server2.add_file { |f| f.puts("I am file #{i}") }
87
+ url_str
88
+ end
89
+
90
+ running_thread = Thread.new { server2.run }
91
+ expect(running_thread.status).not_to be_falsey
92
+
93
+ client_process_id = fork do
94
+ begin
95
+ urls.each do |url|
96
+ resp = Net::HTTP.get_response(URI.parse(url))
97
+ status = resp.code.to_i
98
+ exit(status) if status != 200
99
+ end
100
+ rescue StandardError => e
101
+ warn(e)
102
+ exit(1)
103
+ end
104
+ end
105
+ Process.wait(client_process_id)
106
+ expect($CHILD_STATUS.exitstatus).to eq(0) # just to be sure
107
+
108
+ Timeout.timeout(5) { running_thread.join }
109
+ expect(running_thread.status).to eq(false)
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ module Mrt::Ingest
4
+ describe Request do
5
+ describe :new do
6
+ it 'should require a profile' do
7
+ expect do
8
+ Mrt::Ingest::Request.new(profile: nil, submitter: 'jd/John Doe', type: 'file')
9
+ end.to raise_error(ArgumentError)
10
+ end
11
+
12
+ it 'should require a submitter' do
13
+ expect do
14
+ Mrt::Ingest::Request.new(profile: 'demo_merritt', submitter: nil, type: 'file')
15
+ end.to raise_error(ArgumentError)
16
+ end
17
+
18
+ it 'should require a type' do
19
+ expect do
20
+ Mrt::Ingest::Request.new(profile: 'demo_merritt', submitter: 'jd/John Doe', type: nil)
21
+ end.to raise_error(ArgumentError)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ module Mrt::Ingest
4
+ describe Response do
5
+ RESPONSE_JSON = <<~JSON.freeze
6
+ {
7
+ "bat:batchState": {
8
+ "bat:batchID":"bid-8c0fa0c2-f3d7-4deb-bd49-f953f6752b59",
9
+ "bat:updateFlag":false,
10
+ "bat:targetQueue":"example.org:2181",
11
+ "bat:batchStatus":"QUEUED",
12
+ "bat:userAgent":"egh/Erik Hetzner",
13
+ "bat:submissionDate":"2011-08-31T15:40:26-07:00",
14
+ "bat:targetQueueNode":"/ingest.example.1",
15
+ "bat:batchProfile": {
16
+ "bat:owner":"ark:/99999/fk4tt4wsh",
17
+ "bat:creationDate":"2010-01-19T13:28:14-08:00",
18
+ "bat:targetStorage": {
19
+ "bat:storageLink":"http://example.org:35121",
20
+ "bat:nodeID":10
21
+ },
22
+ "bat:objectType":"MRT-curatorial",
23
+ "bat:modificationDate":"2010-01-26T23:28:14-08:00",
24
+ "bat:aggregateType":"",
25
+ "bat:objectMinterURL":"https://example.org/ezid/shoulder/ark:/99999/fk4",
26
+ "bat:collection": {
27
+ },
28
+ "bat:profileID":"merritt_content",
29
+ "bat:profileDescription":"Merritt demo content",
30
+ "bat:fixityURL":"http://example.org:33143",
31
+ "bat:contactsEmail": {
32
+ "bat:notification": {
33
+ "bat:contactEmail":"erik.hetzner@example.org"
34
+ }
35
+ },
36
+ "bat:identifierScheme":"ARK",
37
+ "bat:identifierNamespace":"99999",
38
+ "bat:objectRole":"MRT-content"
39
+ }
40
+ }
41
+ }
42
+ JSON
43
+
44
+ describe :new do
45
+ before(:each) do
46
+ @response = Response.new(RESPONSE_JSON)
47
+ end
48
+
49
+ it 'should parse the response' do
50
+ expect(@response.batch_id).to eq('bid-8c0fa0c2-f3d7-4deb-bd49-f953f6752b59')
51
+ expect(@response.submission_date).to eq(Time.at(1_314_830_426))
52
+ expect(@response.user_agent).to eq('egh/Erik Hetzner')
53
+ end
54
+ end
55
+ end
56
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mrt-ingest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Reyes
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-10-23 00:00:00.000000000 Z
12
+ date: 2019-05-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json
@@ -95,6 +95,34 @@ dependencies:
95
95
  - - "~>"
96
96
  - !ruby/object:Gem::Version
97
97
  version: '12.0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: rspec
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '3.8'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: '3.8'
112
+ - !ruby/object:Gem::Dependency
113
+ name: rubocop
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: '0.68'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '0.68'
98
126
  - !ruby/object:Gem::Dependency
99
127
  name: shoulda
100
128
  requirement: !ruby/object:Gem::Requirement
@@ -110,19 +138,47 @@ dependencies:
110
138
  - !ruby/object:Gem::Version
111
139
  version: '3.6'
112
140
  - !ruby/object:Gem::Dependency
113
- name: test-unit
141
+ name: simplecov
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - "~>"
145
+ - !ruby/object:Gem::Version
146
+ version: '0.16'
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - "~>"
152
+ - !ruby/object:Gem::Version
153
+ version: '0.16'
154
+ - !ruby/object:Gem::Dependency
155
+ name: simplecov-console
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - "~>"
159
+ - !ruby/object:Gem::Version
160
+ version: '0.4'
161
+ type: :development
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - "~>"
166
+ - !ruby/object:Gem::Version
167
+ version: '0.4'
168
+ - !ruby/object:Gem::Dependency
169
+ name: webmock
114
170
  requirement: !ruby/object:Gem::Requirement
115
171
  requirements:
116
172
  - - "~>"
117
173
  - !ruby/object:Gem::Version
118
- version: '3.2'
174
+ version: '3.5'
119
175
  type: :development
120
176
  prerelease: false
121
177
  version_requirements: !ruby/object:Gem::Requirement
122
178
  requirements:
123
179
  - - "~>"
124
180
  - !ruby/object:Gem::Version
125
- version: '3.2'
181
+ version: '3.5'
126
182
  description: A client for the Merritt ingest system. More details available from https://github.com/CDLUC3/mrt-doc/wiki
127
183
  email:
128
184
  - mark.reyes@ucop.edu
@@ -133,23 +189,41 @@ extra_rdoc_files: []
133
189
  files:
134
190
  - ".gitignore"
135
191
  - ".hgignore"
192
+ - ".idea/.rakeTasks"
193
+ - ".idea/encodings.xml"
194
+ - ".idea/inspectionProfiles/Project_Default.xml"
195
+ - ".idea/misc.xml"
196
+ - ".idea/modules.xml"
197
+ - ".idea/vcs.xml"
198
+ - ".rubocop.yml"
199
+ - ".ruby-version"
136
200
  - ".travis.yml"
201
+ - CHANGES.md
137
202
  - Gemfile
138
203
  - LICENSE
139
- - README
204
+ - README.md
140
205
  - Rakefile
141
206
  - lib/mrt/ingest.rb
142
207
  - lib/mrt/ingest/client.rb
208
+ - lib/mrt/ingest/component.rb
209
+ - lib/mrt/ingest/ingest_exception.rb
143
210
  - lib/mrt/ingest/iobject.rb
144
211
  - lib/mrt/ingest/message_digest.rb
145
212
  - lib/mrt/ingest/one_time_server.rb
146
213
  - lib/mrt/ingest/request.rb
147
214
  - lib/mrt/ingest/response.rb
215
+ - mrt-ingest-ruby.iml
148
216
  - mrt-ingest.gemspec
149
- - test/test_client.rb
150
- - test/test_iobject.rb
151
- - test/test_request.rb
152
- - test/test_response.rb
217
+ - spec/.rubocop.yml
218
+ - spec/spec_helper.rb
219
+ - spec/unit/data/file.txt
220
+ - spec/unit/mrt/ingest/client_spec.rb
221
+ - spec/unit/mrt/ingest/component_spec.rb
222
+ - spec/unit/mrt/ingest/iobject_spec.rb
223
+ - spec/unit/mrt/ingest/message_digest_spec.rb
224
+ - spec/unit/mrt/ingest/one_time_server_spec.rb
225
+ - spec/unit/mrt/ingest/request_spec.rb
226
+ - spec/unit/mrt/ingest/response_spec.rb
153
227
  homepage: https://github.com/CDLUC3/mrt-ingest-ruby
154
228
  licenses:
155
229
  - BSD-3-Clause
@@ -170,12 +244,18 @@ required_rubygems_version: !ruby/object:Gem::Requirement
170
244
  version: '0'
171
245
  requirements: []
172
246
  rubyforge_project:
173
- rubygems_version: 2.7.7
247
+ rubygems_version: 2.6.14.1
174
248
  signing_key:
175
249
  specification_version: 4
176
250
  summary: A client for Merritt ingest.
177
251
  test_files:
178
- - test/test_client.rb
179
- - test/test_iobject.rb
180
- - test/test_request.rb
181
- - test/test_response.rb
252
+ - spec/.rubocop.yml
253
+ - spec/spec_helper.rb
254
+ - spec/unit/data/file.txt
255
+ - spec/unit/mrt/ingest/client_spec.rb
256
+ - spec/unit/mrt/ingest/component_spec.rb
257
+ - spec/unit/mrt/ingest/iobject_spec.rb
258
+ - spec/unit/mrt/ingest/message_digest_spec.rb
259
+ - spec/unit/mrt/ingest/one_time_server_spec.rb
260
+ - spec/unit/mrt/ingest/request_spec.rb
261
+ - spec/unit/mrt/ingest/response_spec.rb
data/README DELETED
@@ -1,29 +0,0 @@
1
- = mrt-ingest (ruby)
2
- Date:: 6 Sept. 2011
3
- Author:: Erik Hetzner (mailto:erik.hetzner@ucop.edu)
4
-
5
- == What?
6
-
7
- A Ruby ingest client for Merritt[http://merritt.cdlib.org/].
8
-
9
- == Install
10
-
11
- $ gem build mrt-ingest.gemspec
12
- $ sudo gem install mrt-ingest-0.0.1.gem
13
-
14
- == How?
15
-
16
- require 'rubygems'
17
- require 'mrt/ingest'
18
- client = Mrt::Ingest::Client.new("http://merritt.cdlib.org/object/ingest", USERNAME, PASSWORD)
19
- obj = Mrt::Ingest::IObject.new(:erc => {
20
- "who" => "Doe, John",
21
- "what" => "Hello, world",
22
- "when/created" => "2011" })
23
- obj.add_component(File.new("/tmp/helloworld_a"))
24
- obj.add_component(File.new("/tmp/helloworld_b"))
25
- obj.add_component(URI.parse("http://example.org/xxx"),
26
- :name => "helloworld_c",
27
- :digest => Mrt::Ingest::MessageDigest::MD5.new("6f5902ac237024bdd0c176cb93063dc4"))
28
- obj.start_ingest(client, "demo_merritt_content", "me/My Name")
29
- obj.finish_ingest()
@@ -1,40 +0,0 @@
1
- # Author:: Erik Hetzner (mailto:erik.hetzner@ucop.edu)
2
- # Copyright:: Copyright (c) 2011, Regents of the University of California
3
-
4
- require 'rubygems'
5
-
6
- require 'test/unit'
7
- require 'checkm'
8
- require 'fakeweb'
9
- require 'mocha'
10
- require 'mrt/ingest'
11
- require 'shoulda'
12
- require 'open-uri'
13
-
14
- class TestClient < Test::Unit::TestCase
15
- context "creating a client" do
16
- should "be able to create an ingest client" do
17
- client = Mrt::Ingest::Client.new("http://example.org/ingest")
18
- assert_instance_of(Mrt::Ingest::Client, client)
19
- end
20
-
21
- should "be able to create an ingest client with login credentials" do
22
- client = Mrt::Ingest::Client.new("http://example.org/ingest", "me", "secret")
23
- assert_instance_of(Mrt::Ingest::Client, client)
24
- end
25
- end
26
-
27
- context "ingest clients" do
28
- setup do
29
- @client = Mrt::Ingest::Client.new("http://example.org/ingest", "me", "secret")
30
- @iobject = Mrt::Ingest::IObject.new
31
- @ingest_req = @iobject.mk_request("profile", "submitter")
32
- end
33
-
34
- should "should create a good rest client request" do
35
- rest_req = @client.mk_rest_request(@ingest_req)
36
- assert_equal("me", rest_req.user)
37
- assert_equal("secret", rest_req.password)
38
- end
39
- end
40
- end