fragmenter 1.0.0 → 1.0.1
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
- data/.travis.yml +1 -0
- data/CHANGELOG.md +5 -0
- data/README.md +15 -3
- data/fragmenter.gemspec +1 -1
- data/lib/fragmenter/rails/controller.rb +6 -4
- data/lib/fragmenter/version.rb +1 -1
- data/spec/fragmenter/rails/controller_spec.rb +7 -9
- data/spec/requests/uploading_fragments_spec.rb +4 -7
- data/spec/support/uploads_app.rb +20 -13
- metadata +22 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 47da89395cc7747e68ee8637b95d00521d6f178c
|
4
|
+
data.tar.gz: 57ed043a01301542570ad439ff58cb599826a06c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 328381ad1ca0c4eb144f83f47ac337dc4b9ee42d140572cf348550ebb345bc008f4526e2d71d8b63ce07699d814441c3f6540eacbd71bcce7d8d4d49aac8d2d2
|
7
|
+
data.tar.gz: a3958527cc97cd7855442975843fdaa9dced8648bf1f96dadaa4ad9796d314d7e7ff6b001cbef8db90ecc626a2ec333c6082b58b60710908e0ad79282971cca0
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -20,13 +20,25 @@ pieces is the simplest workaround.
|
|
20
20
|
|
21
21
|
Fragments are intended to be rather small, anywhere from 10-50k depending on
|
22
22
|
the underlying data size. There is a balance between connection overhead from
|
23
|
-
repeated server calls, being connection error
|
23
|
+
repeated server calls, being connection error tolerant, and not blocking the
|
24
24
|
server from handling other connections.
|
25
25
|
|
26
|
+
## Heroku
|
27
|
+
|
28
|
+
Due to the way the service queues requests we do **not** recommend using
|
29
|
+
Fragmenter for apps on Heroku. Fragmenter is designed to make uploads from slow
|
30
|
+
mobile clients easier and fault tolerant. Heroku kills all requests after 30
|
31
|
+
seconds from the point where the request started, not from the point where it
|
32
|
+
was handed to your application. Fragmenting uploads uses a fair number of
|
33
|
+
additional requests and can cause rampant timeout errors (H12 on Heroku).
|
34
|
+
|
35
|
+
That isn't to say that Fragmenter just doesn't work on Heroku, it is just
|
36
|
+
sub-optimal—particularly when compared to a properly configured Nginx proxy.
|
37
|
+
|
26
38
|
## Requirements
|
27
39
|
|
28
|
-
Fragmenter is tested on Ruby 2.0,
|
29
|
-
|
40
|
+
Fragmenter is tested on Ruby 1.9.3, 2.0, and 2.1. However, any ruby
|
41
|
+
implementation with 1.9 syntax will be supported.
|
30
42
|
|
31
43
|
Redis 2.0 or greater is required and version 2.6 is recommended.
|
32
44
|
|
data/fragmenter.gemspec
CHANGED
@@ -23,6 +23,6 @@ Gem::Specification.new do |gem|
|
|
23
23
|
|
24
24
|
gem.add_dependency 'redis', '~> 3.0.0'
|
25
25
|
gem.add_development_dependency 'rspec', '~> 2.14.0'
|
26
|
+
gem.add_development_dependency 'rack', '~> 1.5.2'
|
26
27
|
gem.add_development_dependency 'rack-test', '~> 0.6.2'
|
27
|
-
gem.add_development_dependency 'sinatra', '~> 1.4.3'
|
28
28
|
end
|
@@ -6,8 +6,10 @@ module Fragmenter
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def update
|
9
|
+
uploader = request_uploader
|
10
|
+
|
9
11
|
if uploader.store
|
10
|
-
render json: fragmenter.as_json, status: update_status
|
12
|
+
render json: fragmenter.as_json, status: update_status(uploader)
|
11
13
|
else
|
12
14
|
render json: {
|
13
15
|
message: 'Upload of part failed.', errors: uploader.errors
|
@@ -31,8 +33,8 @@ module Fragmenter
|
|
31
33
|
[Fragmenter::Validators::ChecksumValidator]
|
32
34
|
end
|
33
35
|
|
34
|
-
def
|
35
|
-
|
36
|
+
def request_uploader
|
37
|
+
Fragmenter::Services::Uploader.new(
|
36
38
|
Fragmenter::Request.new(
|
37
39
|
resource: resource,
|
38
40
|
fragmenter: fragmenter,
|
@@ -42,7 +44,7 @@ module Fragmenter
|
|
42
44
|
)
|
43
45
|
end
|
44
46
|
|
45
|
-
def update_status
|
47
|
+
def update_status(uploader)
|
46
48
|
uploader.complete? ? 202 : 200
|
47
49
|
end
|
48
50
|
end
|
data/lib/fragmenter/version.rb
CHANGED
@@ -6,7 +6,7 @@ describe Fragmenter::Rails::Controller do
|
|
6
6
|
include Fragmenter::Rails::Controller
|
7
7
|
end
|
8
8
|
|
9
|
-
|
9
|
+
resource_class = Struct.new(:id) do
|
10
10
|
def fragmenter
|
11
11
|
@fragmenter ||= Fragmenter::Wrapper.new(self)
|
12
12
|
end
|
@@ -14,7 +14,7 @@ describe Fragmenter::Rails::Controller do
|
|
14
14
|
|
15
15
|
describe '#show' do
|
16
16
|
it 'renders the JSON representation of the associated fragmenter' do
|
17
|
-
resource =
|
17
|
+
resource = resource_class.new(100)
|
18
18
|
controller = UploadController.new(resource)
|
19
19
|
|
20
20
|
controller.stub(:render)
|
@@ -30,7 +30,7 @@ describe Fragmenter::Rails::Controller do
|
|
30
30
|
|
31
31
|
describe '#destroy' do
|
32
32
|
it 'commands the fragmenter to clean' do
|
33
|
-
resource =
|
33
|
+
resource = resource_class.new(100)
|
34
34
|
controller = UploadController.new(resource)
|
35
35
|
|
36
36
|
controller.stub(:render)
|
@@ -48,12 +48,11 @@ describe Fragmenter::Rails::Controller do
|
|
48
48
|
|
49
49
|
describe '#update' do
|
50
50
|
it 'stores the request body' do
|
51
|
-
resource =
|
51
|
+
resource = resource_class.new(100)
|
52
52
|
controller = UploadController.new(resource)
|
53
53
|
uploader = double(:uploader, store: true, complete?: false)
|
54
54
|
|
55
|
-
controller.stub(:
|
56
|
-
controller.stub(uploader: uploader)
|
55
|
+
controller.stub(render: true, request_uploader: uploader)
|
57
56
|
|
58
57
|
controller.update
|
59
58
|
|
@@ -65,12 +64,11 @@ describe Fragmenter::Rails::Controller do
|
|
65
64
|
end
|
66
65
|
|
67
66
|
it 'renders error messages if storage fails' do
|
68
|
-
resource =
|
67
|
+
resource = resource_class.new(100)
|
69
68
|
controller = UploadController.new(resource)
|
70
69
|
uploader = double(:uploader, store: false, errors: [], complete?: false)
|
71
70
|
|
72
|
-
controller.stub(:
|
73
|
-
controller.stub(uploader: uploader)
|
71
|
+
controller.stub(render: true, request_uploader: uploader)
|
74
72
|
|
75
73
|
controller.update
|
76
74
|
|
@@ -7,17 +7,14 @@ require 'support/uploads_app'
|
|
7
7
|
describe 'Uploading Fragments' do
|
8
8
|
include Rack::Test::Methods
|
9
9
|
|
10
|
-
let(:app) { UploadsApp }
|
11
10
|
let(:resource) { Resource.new(200) }
|
11
|
+
let(:app) { UploadsApp.new(resource) }
|
12
12
|
|
13
13
|
around do |example|
|
14
|
-
|
15
|
-
Fragmenter.logger
|
16
|
-
|
14
|
+
resource.fragmenter.clean!
|
15
|
+
Fragmenter.logger = Logger.new('/dev/null')
|
17
16
|
example.run
|
18
|
-
|
19
|
-
Fragmenter.logger = nil
|
20
|
-
UploadsApp.resource = nil
|
17
|
+
Fragmenter.logger = nil
|
21
18
|
end
|
22
19
|
|
23
20
|
it 'Lists uploaded fragments' do
|
data/spec/support/uploads_app.rb
CHANGED
@@ -1,30 +1,37 @@
|
|
1
1
|
require 'fragmenter/rails/controller'
|
2
|
-
require '
|
2
|
+
require 'rack/request'
|
3
|
+
require 'rack/response'
|
3
4
|
|
4
|
-
class UploadsApp
|
5
|
+
class UploadsApp
|
5
6
|
include Fragmenter::Rails::Controller
|
6
7
|
|
7
|
-
|
8
|
-
attr_accessor :resource
|
9
|
-
end
|
8
|
+
attr_reader :request, :resource
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
def initialize(resource)
|
11
|
+
@resource = resource
|
12
|
+
end
|
14
13
|
|
15
|
-
|
14
|
+
def call(env)
|
15
|
+
@request = Rack::Request.new(env)
|
16
16
|
|
17
|
-
|
18
|
-
|
17
|
+
case request.request_method
|
18
|
+
when 'GET' then show
|
19
|
+
when 'PUT' then update
|
20
|
+
when 'DELETE' then destroy
|
21
|
+
end
|
19
22
|
end
|
20
23
|
|
24
|
+
private
|
25
|
+
|
21
26
|
def render(options)
|
22
27
|
body = if options[:json]
|
23
28
|
JSON.dump(options[:json])
|
24
29
|
else
|
25
|
-
|
30
|
+
''
|
26
31
|
end
|
27
32
|
|
28
|
-
|
33
|
+
Rack::Response.new(body, options[:status], {}).finish do
|
34
|
+
@uploader = nil
|
35
|
+
end
|
29
36
|
end
|
30
37
|
end
|
metadata
CHANGED
@@ -1,71 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fragmenter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Parker Selbert
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-03-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 3.0.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 3.0.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rspec
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - ~>
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 2.14.0
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - ~>
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 2.14.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name: rack
|
42
|
+
name: rack
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - ~>
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 1.5.2
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - ~>
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 1.5.2
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: rack-test
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - ~>
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 0.6.2
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - ~>
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 0.6.2
|
69
69
|
description: Fragmentize and rebuild data
|
70
70
|
email:
|
71
71
|
- parker@sorentwo.com
|
@@ -73,9 +73,9 @@ executables: []
|
|
73
73
|
extensions: []
|
74
74
|
extra_rdoc_files: []
|
75
75
|
files:
|
76
|
-
- .gitignore
|
77
|
-
- .rspec
|
78
|
-
- .travis.yml
|
76
|
+
- ".gitignore"
|
77
|
+
- ".rspec"
|
78
|
+
- ".travis.yml"
|
79
79
|
- CHANGELOG.md
|
80
80
|
- Gemfile
|
81
81
|
- LICENSE.txt
|
@@ -123,17 +123,17 @@ require_paths:
|
|
123
123
|
- lib
|
124
124
|
required_ruby_version: !ruby/object:Gem::Requirement
|
125
125
|
requirements:
|
126
|
-
- -
|
126
|
+
- - ">="
|
127
127
|
- !ruby/object:Gem::Version
|
128
128
|
version: '0'
|
129
129
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
130
130
|
requirements:
|
131
|
-
- -
|
131
|
+
- - ">="
|
132
132
|
- !ruby/object:Gem::Version
|
133
133
|
version: '0'
|
134
134
|
requirements: []
|
135
135
|
rubyforge_project:
|
136
|
-
rubygems_version: 2.
|
136
|
+
rubygems_version: 2.2.0
|
137
137
|
signing_key:
|
138
138
|
specification_version: 4
|
139
139
|
summary: Multipart upload support backed by Redis. Fragmenter handles storing multiple
|