thingfish 0.6.0 → 0.7.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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/ChangeLog +49 -1
- data/README.rdoc +1 -1
- data/Rakefile +5 -5
- data/lib/thingfish.rb +2 -2
- data/lib/thingfish/handler.rb +47 -33
- data/spec/thingfish/handler_spec.rb +43 -17
- metadata +10 -10
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9a0df5e14498c987d01ba054873bcfad3e98c364
|
|
4
|
+
data.tar.gz: b63b33e9f59288acc5d9759a082d13ccfde6b8b0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 217f66c0d72e2f644516b6e2b35967a61f519c7c848849d6b3a721721628415e50c95ef9630aba0dde4a9afbd789a52aa16ba4252387f18b872f7246e080b373
|
|
7
|
+
data.tar.gz: a68b9ffaa68472217321e300962486cb8ad72cd0658f995e7158e5e6c36d3622f700fadc226d15b1152c7160174efe8ec657e5ba9ea2cd045bfa7354b562c983
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
data.tar.gz.sig
CHANGED
|
Binary file
|
data/ChangeLog
CHANGED
|
@@ -1,9 +1,57 @@
|
|
|
1
|
+
2017-09-13 Mahlon E. Smith <mahlon@laika.com>
|
|
2
|
+
|
|
3
|
+
* .hgtags:
|
|
4
|
+
Added tag v0.7.0 for changeset c8bfee4b3f80
|
|
5
|
+
[60864d37774f] [tip]
|
|
6
|
+
|
|
7
|
+
2017-09-13 Mahlon E. Smith <mahlon@martini.nu>
|
|
8
|
+
|
|
9
|
+
* lib/thingfish.rb:
|
|
10
|
+
Bunp version.
|
|
11
|
+
[c8bfee4b3f80] [v0.7.0]
|
|
12
|
+
|
|
13
|
+
2017-09-13 Mahlon E. Smith <mahlon@laika.com>
|
|
14
|
+
|
|
15
|
+
* lib/thingfish/handler.rb:
|
|
16
|
+
Explicitly set the HTTP status when returning resources.
|
|
17
|
+
[15b877ef492e]
|
|
18
|
+
|
|
19
|
+
* lib/thingfish/handler.rb, spec/thingfish/handler_spec.rb:
|
|
20
|
+
Add Last-Modified/If-None-Match support.
|
|
21
|
+
|
|
22
|
+
This allows caching to still take place even if not using the
|
|
23
|
+
checksum plugin.
|
|
24
|
+
[bf37a1852e61]
|
|
25
|
+
|
|
26
|
+
2017-06-28 Michael Granger <ged@FaerieMUD.org>
|
|
27
|
+
|
|
28
|
+
* .ruby-version, README.rdoc, Rakefile, thingfish.gemspec:
|
|
29
|
+
Update build files, bump Strelka dependency
|
|
30
|
+
[6665c33cf990]
|
|
31
|
+
|
|
32
|
+
2017-05-31 Mahlon E. Smith <mahlon@martini.nu>
|
|
33
|
+
|
|
34
|
+
* lib/thingfish/handler.rb, spec/thingfish/handler_spec.rb:
|
|
35
|
+
Move the configure() method to help support deferred configuration.
|
|
36
|
+
Fix tests for CZTop.
|
|
37
|
+
[30905f58ff2e]
|
|
38
|
+
|
|
39
|
+
2017-01-16 Mahlon E. Smith <mahlon@laika.com>
|
|
40
|
+
|
|
41
|
+
* .hgtags:
|
|
42
|
+
Added tag v0.6.0 for changeset dfcb639cbbe7
|
|
43
|
+
[fd014c3361f2]
|
|
44
|
+
|
|
45
|
+
* .hgsigs:
|
|
46
|
+
Added signature for changeset 2bc8257c7537
|
|
47
|
+
[dfcb639cbbe7] [v0.6.0]
|
|
48
|
+
|
|
1
49
|
2017-01-16 Mahlon E. Smith <mahlon@martini.nu>
|
|
2
50
|
|
|
3
51
|
* .gems, .ruby-gemset, .ruby-version, .rvmrc, History.rdoc, Rakefile,
|
|
4
52
|
lib/thingfish.rb:
|
|
5
53
|
Bump Configurability dependency, migrate away from .rvmrc.
|
|
6
|
-
[2bc8257c7537]
|
|
54
|
+
[2bc8257c7537]
|
|
7
55
|
|
|
8
56
|
2016-11-14 Michael Granger <ged@FaerieMUD.org>
|
|
9
57
|
|
data/README.rdoc
CHANGED
data/Rakefile
CHANGED
|
@@ -26,7 +26,7 @@ hoespec = Hoe.spec 'thingfish' do
|
|
|
26
26
|
self.developer 'Mahlon E. Smith', 'mahlon@martini.nu'
|
|
27
27
|
self.license "BSD"
|
|
28
28
|
|
|
29
|
-
self.dependency 'strelka', '~> 0.
|
|
29
|
+
self.dependency 'strelka', '~> 0.14'
|
|
30
30
|
|
|
31
31
|
self.dependency 'hoe-deveiate', '~> 0.3', :development
|
|
32
32
|
self.dependency 'simplecov', '~> 0.7', :development
|
|
@@ -36,7 +36,7 @@ hoespec = Hoe.spec 'thingfish' do
|
|
|
36
36
|
self.hg_sign_tags = true if self.respond_to?( :hg_sign_tags= )
|
|
37
37
|
spec.check_history_on_release = true if spec.respond_to?( :check_history_on_release= )
|
|
38
38
|
|
|
39
|
-
self.rdoc_locations << "deveiate:/usr/local/
|
|
39
|
+
self.rdoc_locations << "deveiate:/usr/local/thingfish/api"
|
|
40
40
|
end
|
|
41
41
|
|
|
42
42
|
ENV['VERSION'] ||= hoespec.spec.version.to_s
|
|
@@ -67,7 +67,7 @@ if File.directory?( '.hg' )
|
|
|
67
67
|
rdoc.main = "README.rdoc"
|
|
68
68
|
rdoc.markup = 'markdown'
|
|
69
69
|
rdoc.rdoc_files.include( "*.rdoc", "ChangeLog", "lib/**/*.rb" )
|
|
70
|
-
rdoc.generator = :
|
|
70
|
+
rdoc.generator = :sixfish
|
|
71
71
|
rdoc.title = 'Thingfish'
|
|
72
72
|
rdoc.rdoc_dir = 'doc'
|
|
73
73
|
end
|
|
@@ -79,8 +79,8 @@ task GEMSPEC do |task|
|
|
|
79
79
|
spec = $hoespec.spec
|
|
80
80
|
spec.files.delete( '.gemtest' )
|
|
81
81
|
spec.signing_key = nil
|
|
82
|
-
spec.cert_chain =
|
|
83
|
-
spec.version = "#{spec.version}.pre#{Time.now.strftime("%Y%m%d%H%M%S")}"
|
|
82
|
+
spec.cert_chain = Dir.glob( 'certs/*.pem' )
|
|
83
|
+
spec.version = "#{spec.version.bump}.0.pre#{Time.now.strftime("%Y%m%d%H%M%S")}"
|
|
84
84
|
File.open( task.name, 'w' ) do |fh|
|
|
85
85
|
fh.write( spec.to_ruby )
|
|
86
86
|
end
|
data/lib/thingfish.rb
CHANGED
|
@@ -12,10 +12,10 @@ module Thingfish
|
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
# Package version
|
|
15
|
-
VERSION = '0.
|
|
15
|
+
VERSION = '0.7.0'
|
|
16
16
|
|
|
17
17
|
# Version control revision
|
|
18
|
-
REVISION = %q$Revision:
|
|
18
|
+
REVISION = %q$Revision: c8bfee4b3f80 $
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
### Get the library version. If +include_buildnum+ is true, the version string will
|
data/lib/thingfish/handler.rb
CHANGED
|
@@ -74,22 +74,6 @@ class Thingfish::Handler < Strelka::App
|
|
|
74
74
|
singleton_attr_accessor :processors
|
|
75
75
|
|
|
76
76
|
|
|
77
|
-
### Configurability API -- install the configuration
|
|
78
|
-
def self::configure( config=nil )
|
|
79
|
-
config = self.defaults.merge( config || {} )
|
|
80
|
-
|
|
81
|
-
self.datastore = config[:datastore]
|
|
82
|
-
self.metastore = config[:metastore]
|
|
83
|
-
self.event_socket_uri = config[:event_socket_uri]
|
|
84
|
-
|
|
85
|
-
self.processors = self.load_processors( config[:processors] )
|
|
86
|
-
self.processors.each do |processor|
|
|
87
|
-
self.filter( :request, &processor.method(:process_request) )
|
|
88
|
-
self.filter( :response, &processor.method(:process_response) )
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
|
|
93
77
|
### Load the Thingfish::Processors in the given +processor_list+ and return an instance
|
|
94
78
|
### of each one.
|
|
95
79
|
def self::load_processors( processor_list )
|
|
@@ -110,6 +94,24 @@ class Thingfish::Handler < Strelka::App
|
|
|
110
94
|
end
|
|
111
95
|
|
|
112
96
|
|
|
97
|
+
### Configurability API -- install the configuration
|
|
98
|
+
def self::configure( config=nil )
|
|
99
|
+
config = self.defaults.merge( config || {} )
|
|
100
|
+
|
|
101
|
+
self.datastore = config[:datastore]
|
|
102
|
+
self.metastore = config[:metastore]
|
|
103
|
+
self.event_socket_uri = config[:event_socket_uri]
|
|
104
|
+
|
|
105
|
+
self.plugin( :filters ) # pre-load the filters plugin for deferred config
|
|
106
|
+
|
|
107
|
+
self.processors = self.load_processors( config[:processors] )
|
|
108
|
+
self.processors.each do |processor|
|
|
109
|
+
self.filter( :request, &processor.method(:process_request) )
|
|
110
|
+
self.filter( :response, &processor.method(:process_response) )
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
|
|
113
115
|
### Set up the metastore, datastore, and event socket when the handler is
|
|
114
116
|
### created.
|
|
115
117
|
def initialize( * ) # :notnew:
|
|
@@ -145,8 +147,8 @@ class Thingfish::Handler < Strelka::App
|
|
|
145
147
|
### Set up the event socket.
|
|
146
148
|
def setup_event_socket
|
|
147
149
|
if self.class.event_socket_uri && ! @event_socket
|
|
148
|
-
@event_socket =
|
|
149
|
-
@event_socket.linger = 0
|
|
150
|
+
@event_socket = CZTop::Socket::PUB.new
|
|
151
|
+
@event_socket.options.linger = 0
|
|
150
152
|
@event_socket.bind( self.class.event_socket_uri )
|
|
151
153
|
end
|
|
152
154
|
end
|
|
@@ -331,11 +333,12 @@ class Thingfish::Handler < Strelka::App
|
|
|
331
333
|
metadata = self.metastore.fetch( uuid )
|
|
332
334
|
|
|
333
335
|
res = req.response
|
|
334
|
-
self.
|
|
336
|
+
self.add_cache_headers( req, metadata )
|
|
335
337
|
self.add_content_disposition( res, metadata )
|
|
336
338
|
|
|
337
339
|
res.body = object
|
|
338
340
|
res.content_type = metadata['format']
|
|
341
|
+
res.status = HTTP::OK
|
|
339
342
|
|
|
340
343
|
return res
|
|
341
344
|
end
|
|
@@ -354,7 +357,7 @@ class Thingfish::Handler < Strelka::App
|
|
|
354
357
|
res = req.response
|
|
355
358
|
res.content_type = metadata['format']
|
|
356
359
|
|
|
357
|
-
self.
|
|
360
|
+
self.add_cache_headers( req, metadata )
|
|
358
361
|
self.add_content_disposition( res, metadata )
|
|
359
362
|
|
|
360
363
|
if object.respond_to?( :path )
|
|
@@ -367,6 +370,7 @@ class Thingfish::Handler < Strelka::App
|
|
|
367
370
|
res.body = object
|
|
368
371
|
end
|
|
369
372
|
|
|
373
|
+
res.status = HTTP::OK
|
|
370
374
|
return res
|
|
371
375
|
end
|
|
372
376
|
|
|
@@ -714,9 +718,9 @@ class Thingfish::Handler < Strelka::App
|
|
|
714
718
|
### Return a Hash of default metadata extracted from the given +request+.
|
|
715
719
|
def extract_default_metadata( request )
|
|
716
720
|
return self.extract_connection_metadata( request ).merge(
|
|
717
|
-
'extent'
|
|
718
|
-
'format'
|
|
719
|
-
'created'
|
|
721
|
+
'extent' => request.headers.content_length,
|
|
722
|
+
'format' => request.content_type,
|
|
723
|
+
'created' => Time.now.getgm
|
|
720
724
|
)
|
|
721
725
|
end
|
|
722
726
|
|
|
@@ -781,24 +785,34 @@ class Thingfish::Handler < Strelka::App
|
|
|
781
785
|
def send_event( type, msg )
|
|
782
786
|
esock = self.event_socket or return
|
|
783
787
|
self.log.debug "Publishing %p event: %p" % [ type, msg ]
|
|
784
|
-
esock.
|
|
785
|
-
esock.send( Yajl.dump(msg) )
|
|
788
|
+
esock << CZTop::Message.new([ type.to_s, Yajl.dump(msg) ])
|
|
786
789
|
end
|
|
787
790
|
|
|
788
791
|
|
|
789
|
-
### Add browser cache headers for resources.
|
|
792
|
+
### Add browser cache headers for resources.
|
|
793
|
+
### Last-Modified is always added. ETag support requires the sha256
|
|
790
794
|
### processor plugin to be enabled for stored resources.
|
|
791
|
-
|
|
795
|
+
###
|
|
796
|
+
def add_cache_headers( request, metadata )
|
|
792
797
|
response = request.response
|
|
793
|
-
checksum = metadata[ 'checksum' ]
|
|
794
|
-
return unless checksum
|
|
795
798
|
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
+
# ETag takes precedence if available.
|
|
800
|
+
#
|
|
801
|
+
if (( checksum = metadata['checksum'] ))
|
|
802
|
+
if (( match = request.headers[ :if_none_match ] ))
|
|
803
|
+
match = match.gsub( '"', '' ).split( /,\s*/ )
|
|
804
|
+
finish_with( HTTP::NOT_MODIFIED ) if match.include?( checksum )
|
|
805
|
+
end
|
|
806
|
+
response.headers[ :etag ] = checksum
|
|
807
|
+
end
|
|
808
|
+
|
|
809
|
+
return unless metadata[ 'created' ]
|
|
810
|
+
|
|
811
|
+
if (( modified = request.headers[ :if_modified_since ] ))
|
|
812
|
+
finish_with( HTTP::NOT_MODIFIED ) if Time.parse( modified ) <= metadata['created'].round
|
|
799
813
|
end
|
|
814
|
+
response.headers[ :last_modified ] = metadata[ 'created' ].httpdate
|
|
800
815
|
|
|
801
|
-
response.headers[ :etag ] = checksum
|
|
802
816
|
return
|
|
803
817
|
end
|
|
804
818
|
|
|
@@ -9,7 +9,7 @@ require 'thingfish/processor'
|
|
|
9
9
|
|
|
10
10
|
describe Thingfish::Handler do
|
|
11
11
|
|
|
12
|
-
EVENT_SOCKET_URI = 'tcp://127.0.0.1
|
|
12
|
+
EVENT_SOCKET_URI = 'tcp://127.0.0.1:*'
|
|
13
13
|
|
|
14
14
|
before( :all ) do
|
|
15
15
|
Thingfish::Handler.configure( :event_socket_uri => EVENT_SOCKET_URI )
|
|
@@ -359,7 +359,20 @@ describe Thingfish::Handler do
|
|
|
359
359
|
end
|
|
360
360
|
|
|
361
361
|
|
|
362
|
-
it "adds
|
|
362
|
+
it "adds date cache headers to resources" do
|
|
363
|
+
created = Time.now
|
|
364
|
+
uuid = @handler.datastore.save( @png_io )
|
|
365
|
+
@handler.metastore.save( uuid, 'format' => 'image/png', 'created' => created )
|
|
366
|
+
|
|
367
|
+
req = factory.get( "/#{uuid}" )
|
|
368
|
+
result = @handler.handle( req )
|
|
369
|
+
|
|
370
|
+
expect( result.status_line ).to match( /200 ok/i )
|
|
371
|
+
expect( result.headers.last_modified ).to eq( created.httpdate )
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
it "adds content cache headers to resources with a checksum attribute" do
|
|
363
376
|
uuid = @handler.datastore.save( @png_io )
|
|
364
377
|
@handler.metastore.save( uuid, 'format' => 'image/png', 'checksum' => '123456' )
|
|
365
378
|
|
|
@@ -385,7 +398,21 @@ describe Thingfish::Handler do
|
|
|
385
398
|
end
|
|
386
399
|
|
|
387
400
|
|
|
388
|
-
it "returns a 304 not modified for unchanged
|
|
401
|
+
it "returns a 304 not modified for unchanged date cache requests" do
|
|
402
|
+
created = Time.now
|
|
403
|
+
uuid = @handler.datastore.save( @png_io )
|
|
404
|
+
@handler.metastore.save( uuid, 'format' => 'image/png', 'created' => created )
|
|
405
|
+
|
|
406
|
+
req = factory.get( "/#{uuid}" )
|
|
407
|
+
req.headers[ :if_modified_since ] = ( Time.now - 300 ).httpdate
|
|
408
|
+
result = @handler.handle( req )
|
|
409
|
+
|
|
410
|
+
expect( result.status_line ).to match( /304 not modified/i )
|
|
411
|
+
expect( result.body.read ).to be_empty
|
|
412
|
+
end
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
it "returns a 304 not modified for unchanged content cache requests" do
|
|
389
416
|
uuid = @handler.datastore.save( @png_io )
|
|
390
417
|
@handler.metastore.save( uuid, 'format' => 'image/png', 'checksum' => '123456' )
|
|
391
418
|
|
|
@@ -398,7 +425,6 @@ describe Thingfish::Handler do
|
|
|
398
425
|
end
|
|
399
426
|
|
|
400
427
|
|
|
401
|
-
|
|
402
428
|
it "can remove everything associated with an object id" do
|
|
403
429
|
uuid = @handler.datastore.save( @png_io )
|
|
404
430
|
@handler.metastore.save( uuid, {
|
|
@@ -865,10 +891,10 @@ describe Thingfish::Handler do
|
|
|
865
891
|
before( :each ) do
|
|
866
892
|
@handler.setup_event_socket
|
|
867
893
|
|
|
868
|
-
@subsock =
|
|
869
|
-
@subsock.linger = 0
|
|
894
|
+
@subsock = CZTop::Socket::SUB.new
|
|
895
|
+
@subsock.options.linger = 0
|
|
870
896
|
@subsock.subscribe( '' )
|
|
871
|
-
@subsock.connect( @handler.event_socket.
|
|
897
|
+
@subsock.connect( @handler.event_socket.last_endpoint )
|
|
872
898
|
end
|
|
873
899
|
|
|
874
900
|
after( :each ) do
|
|
@@ -878,20 +904,20 @@ describe Thingfish::Handler do
|
|
|
878
904
|
it "publishes notifications about uploaded assets to a PUBSUB socket" do
|
|
879
905
|
req = factory.post( '/', TEST_TEXT_DATA, content_type: 'text/plain' )
|
|
880
906
|
req.headers.content_length = TEST_TEXT_DATA.bytesize
|
|
907
|
+
|
|
908
|
+
poller = CZTop::Poller.new
|
|
909
|
+
poller.add_reader( @subsock )
|
|
910
|
+
|
|
881
911
|
res = @handler.handle( req )
|
|
912
|
+
event = poller.wait( 500 )
|
|
882
913
|
|
|
883
|
-
|
|
884
|
-
expect( handles ).to be_an( Array )
|
|
885
|
-
expect( handles[0].size ).to eq( 1 )
|
|
886
|
-
expect( handles[0].first ).to be( @subsock )
|
|
914
|
+
expect( event ).to_not be_nil
|
|
887
915
|
|
|
888
|
-
|
|
889
|
-
expect(
|
|
890
|
-
expect( event ).to eq( 'created' )
|
|
916
|
+
message = event.socket.receive
|
|
917
|
+
expect( message.frames.count ).to be( 2 )
|
|
891
918
|
|
|
892
|
-
|
|
893
|
-
expect(
|
|
894
|
-
expect( resource ).to match( /^\{"uuid":"#{UUID_PATTERN}"\}$/ )
|
|
919
|
+
expect( message.frames.first.to_s ).to eq( 'created' )
|
|
920
|
+
expect( message.frames.last.to_s ).to match( /^\{"uuid":"#{UUID_PATTERN}"\}$/ )
|
|
895
921
|
end
|
|
896
922
|
end
|
|
897
923
|
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: thingfish
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.7.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Michael Granger
|
|
@@ -31,7 +31,7 @@ cert_chain:
|
|
|
31
31
|
DHE5pl144V24tqxZb65WTup/ov22SCXmpU8/wTeZVL3rePGRfwTJNpm+6iYszl7A
|
|
32
32
|
SixmX0X3SOeYg4FRkblUIA==
|
|
33
33
|
-----END CERTIFICATE-----
|
|
34
|
-
date: 2017-
|
|
34
|
+
date: 2017-09-13 00:00:00.000000000 Z
|
|
35
35
|
dependencies:
|
|
36
36
|
- !ruby/object:Gem::Dependency
|
|
37
37
|
name: strelka
|
|
@@ -39,14 +39,14 @@ dependencies:
|
|
|
39
39
|
requirements:
|
|
40
40
|
- - "~>"
|
|
41
41
|
- !ruby/object:Gem::Version
|
|
42
|
-
version: '0.
|
|
42
|
+
version: '0.14'
|
|
43
43
|
type: :runtime
|
|
44
44
|
prerelease: false
|
|
45
45
|
version_requirements: !ruby/object:Gem::Requirement
|
|
46
46
|
requirements:
|
|
47
47
|
- - "~>"
|
|
48
48
|
- !ruby/object:Gem::Version
|
|
49
|
-
version: '0.
|
|
49
|
+
version: '0.14'
|
|
50
50
|
- !ruby/object:Gem::Dependency
|
|
51
51
|
name: hoe-mercurial
|
|
52
52
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -67,14 +67,14 @@ dependencies:
|
|
|
67
67
|
requirements:
|
|
68
68
|
- - "~>"
|
|
69
69
|
- !ruby/object:Gem::Version
|
|
70
|
-
version: '0.
|
|
70
|
+
version: '0.9'
|
|
71
71
|
type: :development
|
|
72
72
|
prerelease: false
|
|
73
73
|
version_requirements: !ruby/object:Gem::Requirement
|
|
74
74
|
requirements:
|
|
75
75
|
- - "~>"
|
|
76
76
|
- !ruby/object:Gem::Version
|
|
77
|
-
version: '0.
|
|
77
|
+
version: '0.9'
|
|
78
78
|
- !ruby/object:Gem::Dependency
|
|
79
79
|
name: hoe-highline
|
|
80
80
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -123,14 +123,14 @@ dependencies:
|
|
|
123
123
|
requirements:
|
|
124
124
|
- - "~>"
|
|
125
125
|
- !ruby/object:Gem::Version
|
|
126
|
-
version: '3.
|
|
126
|
+
version: '3.16'
|
|
127
127
|
type: :development
|
|
128
128
|
prerelease: false
|
|
129
129
|
version_requirements: !ruby/object:Gem::Requirement
|
|
130
130
|
requirements:
|
|
131
131
|
- - "~>"
|
|
132
132
|
- !ruby/object:Gem::Version
|
|
133
|
-
version: '3.
|
|
133
|
+
version: '3.16'
|
|
134
134
|
description: |-
|
|
135
135
|
Thingfish is a extensible, web-based digital asset manager. It can be used to
|
|
136
136
|
store chunks of data on the network in an application-independent way, link the
|
|
@@ -188,7 +188,7 @@ files:
|
|
|
188
188
|
- spec/thingfish/processor/sha256_spec.rb
|
|
189
189
|
- spec/thingfish/processor_spec.rb
|
|
190
190
|
- spec/thingfish_spec.rb
|
|
191
|
-
homepage: https://thing.fish
|
|
191
|
+
homepage: https://thing.fish
|
|
192
192
|
licenses:
|
|
193
193
|
- BSD-3-Clause
|
|
194
194
|
- BSD
|
|
@@ -211,7 +211,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
211
211
|
version: '0'
|
|
212
212
|
requirements: []
|
|
213
213
|
rubyforge_project:
|
|
214
|
-
rubygems_version: 2.
|
|
214
|
+
rubygems_version: 2.6.12
|
|
215
215
|
signing_key:
|
|
216
216
|
specification_version: 4
|
|
217
217
|
summary: Thingfish is a extensible, web-based digital asset manager
|
metadata.gz.sig
CHANGED
|
Binary file
|