riddl 0.101.26 → 0.107

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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/examples/declaration-server-distributed/declaration.rb +1 -1
  3. data/examples/declaration-server-distributed/declaration.xml +4 -4
  4. data/examples/declaration-server-distributed/main.rb +4 -4
  5. data/examples/declaration-server-distributed/properties.rb +5 -5
  6. data/examples/declaration-server-distributed/xsloverlay.rb +1 -1
  7. data/examples/declaration-server-hybrid/declaration.rb +6 -6
  8. data/examples/declaration-server-hybrid/declaration.xml +2 -2
  9. data/examples/declaration-server-hybrid/xsloverlay.rb +1 -1
  10. data/examples/declaration-server-local/declaration.rb +5 -5
  11. data/examples/declaration-test/main.rb +5 -5
  12. data/examples/downloadify/client.rb +1 -1
  13. data/examples/downloadify/server.rb +2 -2
  14. data/examples/flickr/declaration.xml +1 -1
  15. data/examples/library/server.rb +1 -1
  16. data/examples/notifications/producer.rb +3 -3
  17. data/examples/properties/server.properties.xml +1 -1
  18. data/examples/sse/description.xml +1 -1
  19. data/lib/ruby/riddl/client.rb +1 -0
  20. data/lib/ruby/riddl/handlers/plain-type.rb +1 -1
  21. data/lib/ruby/riddl/ns/common-patterns/notifications-consumer/2.0/consumer.xml +4 -1
  22. data/lib/ruby/riddl/protocols/sse.rb +2 -2
  23. data/lib/ruby/riddl/server.rb +11 -1
  24. data/lib/ruby/riddl/wrapper.rb +12 -5
  25. data/ns/common-patterns/notifications-consumer/2.0/consumer.xml +4 -1
  26. data/riddl.gemspec +3 -3
  27. data/test/smartrunner.rb +21 -14
  28. data/test/tc_declaration-distributed.rb +1 -0
  29. data/test/tc_websocket.rb +16 -15
  30. metadata +12 -23
  31. data/examples/properties/properties.schema.xsl +0 -1
  32. data/examples/xmpp/blather/description.xml +0 -981
  33. data/examples/xmpp/blather/direct.rb +0 -44
  34. data/examples/xmpp/blather/load.rb +0 -18
  35. data/examples/xmpp/blather/pp.rb +0 -40
  36. data/examples/xmpp/blather/test.rb +0 -32
  37. data/examples/xmpp/client.rb +0 -20
  38. data/examples/xmpp/description.rb +0 -17
  39. data/examples/xmpp/properties.xml +0 -1
  40. data/examples/xmpp/server.properties.schema +0 -34
  41. data/examples/xmpp/server.properties.xml +0 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8b0c69ed74aacd5d1e986311d0d84934c91a66e59224d6d3a0e3971a5397d411
4
- data.tar.gz: fe9e202e7b2f42d8561e0eb0946254c4d9f9a5a6adf3d1dd1e9fe724968609be
3
+ metadata.gz: d9014ecb35737c5bbfbcc674048e91b36777c36079cd39250e315df00202fb79
4
+ data.tar.gz: aedc7395bd249211301683be78928f9c643c67f74a144e811892ccf5fb0a6a89
5
5
  SHA512:
6
- metadata.gz: 5969e8231531f20da2e5df34d3bb46043df109331bcd0ca4533ff4ed02cd0195cc733f89bff56c8525f22dc794a7d806676b8d8de02ab97a6c0cd0f8d0f32758
7
- data.tar.gz: 10a8c256399af36f642ca6ecfdd3bbc2ad054bb2295999cfde8a9e9602f3eb7d11d57db8cebeb011858e1a5290bf115a29c4fb9547aa008f2fceaf0453dcd105
6
+ metadata.gz: 42fa22296d28be1e6ede7adf5f386df5eb465516e7bfd0897a54e15891f9b524294f7f2b5283fc8bbb242dacb6916364bc87d96e143f1ac13d672d15e0d207bd
7
+ data.tar.gz: 5ee9ba1fd8f34c624bdca9f6e868f5ae682baffc782a9577e4cf65cd146d29e93b7122f3a0c81eef5ebd5d506ba834f0c407b14b1581509f982d522407ff84c4
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/ruby
2
2
  require File.expand_path(File.dirname(__FILE__) + '/../../lib/ruby/riddl/server')
3
3
 
4
- Riddl::Server.new(File.dirname(__FILE__) + '/declaration.xml', :port => 9297).loop!
4
+ Riddl::Server.new(File.dirname(__FILE__) + '/declaration.xml', :port => 9004).loop!
@@ -1,13 +1,13 @@
1
1
  <declaration xmlns="http://riddl.org/ns/declaration/1.0" xmlns:xi="http://www.w3.org/2001/XInclude">
2
- <interface name="main" location="http://localhost:9296">
2
+ <interface name="main" location="http://localhost:9003">
3
3
  <xi:include href="main.xml"/>
4
4
  </interface>
5
- <interface name="properties" location="http://localhost:9295">
5
+ <interface name="properties" location="http://localhost:9002">
6
6
  <xi:include href="properties.xml"/>
7
7
  </interface>
8
- <interface name="xsloverlay" location='http://localhost:9294'>
8
+ <interface name="xsloverlay" location='http://localhost:9001'>
9
9
  <xi:include href="xsloverlay.xml"/>
10
- </interface>
10
+ </interface>
11
11
 
12
12
  <facade>
13
13
  <tile>
@@ -20,16 +20,16 @@ class Info < Riddl::Implementation
20
20
  end
21
21
  end
22
22
 
23
- Riddl::Server.new(File.dirname(__FILE__) + '/main.xml', :port => 9296) do
23
+ Riddl::Server.new(File.dirname(__FILE__) + '/main.xml', :port => 9003) do
24
24
  on resource do
25
25
  run Riddl::Utils::FileServe, 'instances/instances.xml' if get '*'
26
26
  on resource do
27
27
  run Info if get
28
- end
28
+ end
29
29
  on resource 'xsls' do
30
30
  on resource do
31
31
  run Riddl::Utils::FileServe, "xsls" if get
32
- end
33
- end
32
+ end
33
+ end
34
34
  end
35
35
  end.loop!
@@ -3,17 +3,17 @@ require 'pp'
3
3
  require File.expand_path(File.dirname(__FILE__) + '/../../lib/ruby/riddl/server')
4
4
  require File.expand_path(File.dirname(__FILE__) + '/../../lib/ruby/riddl/utils/properties')
5
5
 
6
- Riddl::Server.new(File.dirname(__FILE__) + '/properties.xml', :port => 9295) do
6
+ Riddl::Server.new(File.dirname(__FILE__) + '/properties.xml', :port => 9002) do
7
7
  on resource do |r|
8
8
  ### header RIDDL_DECLARATION_PATH holds the full path used in the declaration
9
9
  ### from there we get the instance, which is not present in the path used for properties
10
10
  properties = if r[:h]['RIDDL_DECLARATION_PATH']
11
11
  @riddl_opts[:basepath] + '/instances/' + r[:h]['RIDDL_DECLARATION_PATH'].split('/')[1] + '/properties.xml'
12
- else
12
+ else
13
13
  @riddl_opts[:basepath] + '/instances/1/properties.xml'
14
- end
15
- backend = Riddl::Utils::Properties::Backend.new(
16
- @riddl_opts[:basepath] + '/instances/properties.schema',
14
+ end
15
+ backend = Riddl::Utils::Properties::Backend.new(
16
+ @riddl_opts[:basepath] + '/instances/properties.schema',
17
17
  properties
18
18
  )
19
19
 
@@ -3,7 +3,7 @@ require 'pp'
3
3
  require File.expand_path(File.dirname(__FILE__) + '/../../lib/ruby/riddl/server')
4
4
  require File.expand_path(File.dirname(__FILE__) + '/../../lib/ruby/riddl/utils/xsloverlay')
5
5
 
6
- Riddl::Server.new(File.dirname(__FILE__) + '/xsloverlay.xml', :port => 9294) do
6
+ Riddl::Server.new(File.dirname(__FILE__) + '/xsloverlay.xml', :port => 9001) do
7
7
  on resource do
8
8
  run Riddl::Utils::XSLOverlay, "/xsls/instances.xsl" if get && declaration_resource == '/'
9
9
  run Riddl::Utils::XSLOverlay, "/xsls/info.xsl" if get && declaration_resource == '/{}'
@@ -21,25 +21,25 @@ class Info < Riddl::Implementation
21
21
  end
22
22
  end
23
23
 
24
- Riddl::Server.new(File.dirname(__FILE__) + '/declaration.xml', :port => 9297) do
24
+ Riddl::Server.new(File.dirname(__FILE__) + '/declaration.xml', :port => 9002) do
25
25
  accessible_description true
26
26
 
27
27
  interface 'main' do
28
28
  run Riddl::Utils::FileServe, 'instances/instances.xml' if get '*'
29
29
  on resource do
30
30
  run Info if get
31
- end
31
+ end
32
32
  on resource 'xsls' do
33
33
  on resource do
34
34
  run Riddl::Utils::FileServe, "xsls" if get
35
- end
36
- end
35
+ end
36
+ end
37
37
  end
38
38
 
39
39
  interface 'properties' do |r|
40
40
  properties = @riddl_opts[:basepath] + '/instances/' + r[:h]['RIDDL_DECLARATION_PATH'].split('/')[1] + '/properties.xml'
41
- backend = Riddl::Utils::Properties::Backend.new(
42
- @riddl_opts[:basepath] + '/instances/properties.schema',
41
+ backend = Riddl::Utils::Properties::Backend.new(
42
+ @riddl_opts[:basepath] + '/instances/properties.schema',
43
43
  properties
44
44
  )
45
45
 
@@ -5,9 +5,9 @@
5
5
  <interface name="properties">
6
6
  <xi:include href="properties.xml"/>
7
7
  </interface>
8
- <interface name="xsloverlay" location='http://localhost:9294'>
8
+ <interface name="xsloverlay" location='http://localhost:9001'>
9
9
  <xi:include href="xsloverlay.xml"/>
10
- </interface>
10
+ </interface>
11
11
 
12
12
  <facade>
13
13
  <tile>
@@ -3,7 +3,7 @@ require 'pp'
3
3
  require File.expand_path(File.dirname(__FILE__) + '/../../lib/ruby/riddl/server')
4
4
  require File.expand_path(File.dirname(__FILE__) + '/../../lib/ruby/riddl/utils/xsloverlay')
5
5
 
6
- Riddl::Server.new(File.dirname(__FILE__) + '/xsloverlay.xml', :port => 9294) do
6
+ Riddl::Server.new(File.dirname(__FILE__) + '/xsloverlay.xml', :port => 9001) do
7
7
  # accessible_description true
8
8
 
9
9
  on resource do
@@ -5,12 +5,12 @@ require File.expand_path(File.dirname(__FILE__) + '/../../lib/ruby/riddl/utils/p
5
5
  require File.expand_path(File.dirname(__FILE__) + '/../../lib/ruby/riddl/utils/xsloverlay')
6
6
  require File.expand_path(File.dirname(__FILE__) + '/../../lib/ruby/riddl/utils/fileserve')
7
7
 
8
- Riddl::Server.new(File.dirname(__FILE__) + '/declaration.xml', :port => 9292) do
8
+ Riddl::Server.new(File.dirname(__FILE__) + '/declaration.xml', :port => 9001) do
9
9
  accessible_description true
10
10
 
11
- backend = Riddl::Utils::Properties::Backend.new(
12
- @riddl_opts[:basepath] + '/server.properties.schema',
13
- @riddl_opts[:basepath] + '/server.properties.xml'
11
+ backend = Riddl::Utils::Properties::Backend.new(
12
+ @riddl_opts[:basepath] + '/server.properties.schema',
13
+ @riddl_opts[:basepath] + '/server.properties.xml'
14
14
  )
15
15
 
16
16
  interface 'main' do
@@ -20,7 +20,7 @@ Riddl::Server.new(File.dirname(__FILE__) + '/declaration.xml', :port => 9292) do
20
20
  interface 'xsls' do |r|
21
21
  on resource do
22
22
  run Riddl::Utils::FileServe, "xsls" if get
23
- end
23
+ end
24
24
  end
25
25
 
26
26
  interface 'xsloverlay' do
@@ -7,24 +7,24 @@ class A < Riddl::Implementation
7
7
  def response
8
8
  Riddl::Parameter::Simple.new("x","1")
9
9
  end
10
- end
10
+ end
11
11
  class B < Riddl::Implementation
12
12
  def response
13
13
  Riddl::Parameter::Simple.new("y","1")
14
14
  end
15
- end
15
+ end
16
16
  class C < Riddl::Implementation
17
17
  def response
18
18
  Riddl::Parameter::Simple.new("z","1")
19
19
  end
20
- end
20
+ end
21
21
  class S < Riddl::Implementation
22
22
  def response
23
23
  @p # return input parameters unchanged
24
24
  end
25
- end
25
+ end
26
26
 
27
- Riddl::Server.new("main.xml", :port => 9201) do
27
+ Riddl::Server.new("main.xml", :port => 9001) do
28
28
  process_out false
29
29
  logger Riddl::CommonLogger.new("Main","main.log")
30
30
  on resource do
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/ruby
2
2
  require File.expand_path(File.dirname(__FILE__) + '/../../lib/ruby/riddl/server')
3
3
 
4
- srv = Riddl::Client.interface("http://localhost:9299","server.declaration.xml")
4
+ srv = Riddl::Client.interface("http://localhost:9001","server.declaration.xml")
5
5
 
6
6
  status, ret = srv.resource('/test.txt').post [
7
7
  Riddl::Parameter::Simple.new("mimetype","text/plain"),
@@ -2,13 +2,13 @@
2
2
  require File.expand_path(File.dirname(__FILE__) + '/../../lib/ruby/riddl/server')
3
3
  require File.expand_path(File.dirname(__FILE__) + '/../../lib/ruby/riddl/downloadify')
4
4
 
5
- Riddl::Server.new(::File.dirname(__FILE__) + '/server.declaration.xml', :port => 9299) do
5
+ Riddl::Server.new(::File.dirname(__FILE__) + '/server.declaration.xml', :port => 9001) do
6
6
  accessible_description true
7
7
 
8
8
  interface "main" do
9
9
  end
10
10
 
11
- interface "downloadify" do
11
+ interface "downloadify" do
12
12
  on resource do
13
13
  run Riddl::Utils::Downloadify if get 'dfin'
14
14
  run Riddl::Utils::Downloadify if post 'dfin'
@@ -2,7 +2,7 @@
2
2
  <interface name="main" location="http://api.flickr.com/services">
3
3
  <xi:include href="Flickr/flickr.xml"/>
4
4
  </interface>
5
- <interface name="exif" location="http://localhost:9292">
5
+ <interface name="exif" location="http://localhost:9001">
6
6
  <xi:include href="Exif/exif.xml"/>
7
7
  </interface>
8
8
 
@@ -34,7 +34,7 @@ class BookDescription < Riddl::Implementation
34
34
  end
35
35
  end
36
36
 
37
- Riddl::Server.new(File.dirname(__FILE__) + '/description.xml', :port => 9292, :bind => '::') do
37
+ Riddl::Server.new(File.dirname(__FILE__) + '/description.xml', :port => 9001, :bind => '::') do
38
38
  accessible_description true
39
39
 
40
40
  on resource do
@@ -3,7 +3,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../lib/ruby/riddl/server'
3
3
  require File.expand_path(File.dirname(__FILE__) + '/../../lib/ruby/riddl/utils/fileserve')
4
4
  require File.expand_path(File.dirname(__FILE__) + '/../../lib/ruby/riddl/utils/notifications_producer')
5
5
 
6
- Riddl::Server.new(::File.dirname(__FILE__) + '/producer.declaration.xml', :port => 9291) do
6
+ Riddl::Server.new(::File.dirname(__FILE__) + '/producer.declaration.xml', :port => 9001) do
7
7
  accessible_description true
8
8
  backend = Riddl::Utils::Notifications::Producer::Backend.new(
9
9
  ::File.dirname(__FILE__) + '/topics.xml',
@@ -14,7 +14,7 @@ Riddl::Server.new(::File.dirname(__FILE__) + '/producer.declaration.xml', :port
14
14
  run Riddl::Utils::FileServe, "implementation/index.html" if get
15
15
  on resource 'oliver' do
16
16
  run Riddl::Utils::FileServe, "implementation/oliver.html" if get
17
- end
17
+ end
18
18
  on resource 'juergen' do
19
19
  run Riddl::Utils::FileServe, "implementation/juergen.html" if get
20
20
  end
@@ -22,5 +22,5 @@ Riddl::Server.new(::File.dirname(__FILE__) + '/producer.declaration.xml', :port
22
22
 
23
23
  interface 'main' do |r|
24
24
  use Riddl::Utils::Notifications::Producer::implementation(backend,nil,@riddl_opts[:mode])
25
- end
25
+ end
26
26
  end.loop!
@@ -11,6 +11,6 @@
11
11
  </endpoints>
12
12
  <handlerwrapper>Test</handlerwrapper>
13
13
  <description>lala</description>
14
- <state>stopped</state>
14
+ <state changed="2020-10-01T20:41:21+02:00">stopped</state>
15
15
  <transformation>xxx</transformation>
16
16
  </properties>
@@ -8,7 +8,7 @@
8
8
  <parameter name="age" type="integer"/>
9
9
  <parameter name="bla" type="string"/>
10
10
  </message>
11
- <message name=xxxxx">
11
+ <message name="xxxxx">
12
12
  <parameter name="degree" type="integer"/>
13
13
  <parameter name="bla" type="string"/>
14
14
  </message>
@@ -16,6 +16,7 @@ require 'digest/md5'
16
16
 
17
17
  class StringIO #{{{
18
18
  def continue_timeout; nil; end
19
+ def empty?; size == 0; end
19
20
  end #}}}
20
21
 
21
22
  class SignalWait #{{{
@@ -10,7 +10,7 @@ module Riddl
10
10
  begin
11
11
  hi = XML::Smart::string(hinfo)
12
12
  re = Regexp.new(hi.root.text)
13
- rescue => e
13
+ rescue
14
14
  return false
15
15
  end
16
16
  w =~ re
@@ -1,7 +1,7 @@
1
1
  <description datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes" xmlns="http://riddl.org/ns/description/1.0" xmlns:xi="http://www.w3.org/2001/XInclude">
2
2
 
3
3
  <message name="event">
4
- <parameter name="type" fixed="event"/>
4
+ <parameter name="key" type="string"/>
5
5
  <parameter name="topic" type="string">
6
6
  <param name="pattern">[\w_/]+</param>
7
7
  </parameter>
@@ -12,6 +12,9 @@
12
12
  <parameter name="notification" type="string"/>
13
13
  <parameter name="notification" mimetype="application/json"/>
14
14
  </choice>
15
+ <optional>
16
+ <parameter name="fingerprint-with-consumer-secret" type="string"/>
17
+ </optional>
15
18
  </message>
16
19
 
17
20
  <message name="vote">
@@ -33,8 +33,8 @@ module Riddl
33
33
  end
34
34
  end
35
35
 
36
- def trigger_on_open(); @closed = false; @app.onopen; end
37
- def trigger_on_close; @closed = true; @app.onclose; end
36
+ def trigger_on_open(); @closed = false; @app.onopen; end
37
+ def trigger_on_close; @closed = true; @app.onclose; end
38
38
 
39
39
  def initialize(app, env)
40
40
  @app = app
@@ -129,6 +129,14 @@ module Riddl
129
129
  end
130
130
 
131
131
  [:INT, :TERM].each do |signal|
132
+ Signal.trap(signal) do
133
+ if @riddl_opts[:cleanup]
134
+ @riddl_opts[:cleanup].call
135
+ end
136
+ EM.stop
137
+ end
138
+ end
139
+ [:HUP].each do |signal|
132
140
  Signal.trap(signal) do
133
141
  EM.stop
134
142
  end
@@ -140,7 +148,6 @@ module Riddl
140
148
  end
141
149
  end
142
150
  end
143
-
144
151
  rescue => e
145
152
  if @riddl_opts[:custom_protocol] && !@riddl_opts[:http_only]
146
153
  @riddl_opts[:custom_protocol].error_handling(e)
@@ -152,6 +159,9 @@ module Riddl
152
159
  def parallel(&blk)
153
160
  @riddl_opts[:parallel] = blk
154
161
  end
162
+ def cleanup(&blk)
163
+ @riddl_opts[:cleanup] = blk
164
+ end
155
165
 
156
166
  def call(env)# {{{
157
167
  dup.__http_call(env)
@@ -1,5 +1,4 @@
1
1
  require 'rubygems'
2
- require 'open-uri'
3
2
  gem 'xml-smart', '>= 0.3.0'
4
3
  require 'xml/smart'
5
4
 
@@ -79,10 +78,18 @@ module Riddl
79
78
  name = File.expand_path(File.dirname(__FILE__)) + $2
80
79
  end
81
80
  begin
82
- fh = name.respond_to?(:read) ? name : URI.open(name,:ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE)
83
- @doc = XML::Smart.string(fh.read)
84
- fh.close
85
- fpath = File.dirname(fh.path) if fh.is_a?(File) || fh.is_a?(Tempfile)
81
+ if name.respond_to?(:read)
82
+ fpath = File.dirname(name.path) if name.is_a?(File) || name.is_a?(Tempfile)
83
+ xml = name.read
84
+ name.close
85
+ elsif File.exist?(name)
86
+ fpath = File.dirname(name)
87
+ xml = File.read(name)
88
+ else
89
+ fpath = nil
90
+ xml = Typhoeus.get(name, ssl_verifypeer: false).response_body
91
+ end
92
+ @doc = XML::Smart.string(xml)
86
93
  rescue
87
94
  begin
88
95
  @doc = XML::Smart.string(name)
@@ -1,7 +1,7 @@
1
1
  <description datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes" xmlns="http://riddl.org/ns/description/1.0" xmlns:xi="http://www.w3.org/2001/XInclude">
2
2
 
3
3
  <message name="event">
4
- <parameter name="type" fixed="event"/>
4
+ <parameter name="key" type="string"/>
5
5
  <parameter name="topic" type="string">
6
6
  <param name="pattern">[\w_/]+</param>
7
7
  </parameter>
@@ -12,6 +12,9 @@
12
12
  <parameter name="notification" type="string"/>
13
13
  <parameter name="notification" mimetype="application/json"/>
14
14
  </choice>
15
+ <optional>
16
+ <parameter name="fingerprint-with-consumer-secret" type="string"/>
17
+ </optional>
15
18
  </message>
16
19
 
17
20
  <message name="vote">
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "riddl"
3
- s.version = "0.101.26"
3
+ s.version = "0.107"
4
4
  s.platform = Gem::Platform::RUBY
5
5
  s.license = "LGPL-3.0"
6
6
  s.summary = "restful interface description and declaration language: tools and client/server libs"
@@ -22,14 +22,14 @@ Gem::Specification.new do |s|
22
22
 
23
23
  s.required_ruby_version = '>=2.2.0'
24
24
 
25
- s.add_runtime_dependency 'daemonite', '~>0.5', '>=0.5.9'
25
+ s.add_runtime_dependency 'daemonite', '~>0.6', '>=0.6.0'
26
26
  s.add_runtime_dependency 'typhoeus', '~>1.3'
27
27
  s.add_runtime_dependency 'xml-smart', '>=0.4.3', '~>0'
28
28
  s.add_runtime_dependency 'rdf-smart', '>=0.0.160', '~>0'
29
29
  s.add_runtime_dependency 'rack', '~>2.2'
30
30
  s.add_runtime_dependency 'thin', '~>1.6'
31
31
  s.add_runtime_dependency 'eventmachine', '>= 1.0.0', '~>1.0'
32
- s.add_runtime_dependency 'em-websocket', '>= 0.4.0', '~>0'
32
+ s.add_runtime_dependency 'em-websocket', '>= 0.5.2', '~>0'
33
33
  s.add_runtime_dependency 'faye-websocket', '>= 0.1', '~>0'
34
34
  s.add_runtime_dependency 'mime-types', '>= 3.0', '~>3'
35
35
  s.add_runtime_dependency 'minitest', '>= 5.0.0', '~>5'