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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 492790d602b011f85a9c59b2e7730e897b50b4c2
4
- data.tar.gz: 15ce8668a07766801e7d1fbfa946e0a51f8481f2
3
+ metadata.gz: 47da89395cc7747e68ee8637b95d00521d6f178c
4
+ data.tar.gz: 57ed043a01301542570ad439ff58cb599826a06c
5
5
  SHA512:
6
- metadata.gz: 5c5961781e29d00c847b1683e87f50daf5bff5998db3eb92c0acc61065c9a8a657c4a178b695f2002ae3fcc99a81db81e8047f5679403d058554ebb3d9e213f3
7
- data.tar.gz: afe3e60454e3b2e304cd351562befcad35168fddc5d0624c4ca4c4284b174a0c318323bdecf09c6e631fb9d6f92b483ba77322bffd6e9099baea8073a3d8eb4e
6
+ metadata.gz: 328381ad1ca0c4eb144f83f47ac337dc4b9ee42d140572cf348550ebb345bc008f4526e2d71d8b63ce07699d814441c3f6540eacbd71bcce7d8d4d49aac8d2d2
7
+ data.tar.gz: a3958527cc97cd7855442975843fdaa9dced8648bf1f96dadaa4ad9796d314d7e7ff6b001cbef8db90ecc626a2ec333c6082b58b60710908e0ad79282971cca0
data/.travis.yml CHANGED
@@ -2,6 +2,7 @@ language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
4
  - 2.0.0
5
+ - 2.1.0
5
6
  services:
6
7
  - redis-server
7
8
  script: bundle exec rspec spec
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ # 1.0.1
2
+
3
+ * Create a new uploader instance per request, avoiding unexpected caching
4
+ behavior.
5
+
1
6
  # 1.0.0
2
7
 
3
8
  * Provide a convenience IO wrapper for rebuilt data with `Wrapper#to_io`.
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 tollerant, and not blocking the
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, but any ruby implementation with 1.9 syntax
29
- should be supported.
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 uploader
35
- @uploader ||= Fragmenter::Services::Uploader.new(
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
@@ -1,3 +1,3 @@
1
1
  module Fragmenter
2
- VERSION = '1.0.0'
2
+ VERSION = '1.0.1'
3
3
  end
@@ -6,7 +6,7 @@ describe Fragmenter::Rails::Controller do
6
6
  include Fragmenter::Rails::Controller
7
7
  end
8
8
 
9
- Resource = Struct.new(:id) do
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 = Resource.new(100)
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 = Resource.new(100)
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 = Resource.new(100)
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(:render)
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 = Resource.new(100)
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(:render)
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
- UploadsApp.resource = resource
15
- Fragmenter.logger = Logger.new('/dev/null')
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
@@ -1,30 +1,37 @@
1
1
  require 'fragmenter/rails/controller'
2
- require 'sinatra/base'
2
+ require 'rack/request'
3
+ require 'rack/response'
3
4
 
4
- class UploadsApp < Sinatra::Base
5
+ class UploadsApp
5
6
  include Fragmenter::Rails::Controller
6
7
 
7
- class << self
8
- attr_accessor :resource
9
- end
8
+ attr_reader :request, :resource
10
9
 
11
- get('/') { show }
12
- put('/') { update }
13
- delete('/') { destroy }
10
+ def initialize(resource)
11
+ @resource = resource
12
+ end
14
13
 
15
- private
14
+ def call(env)
15
+ @request = Rack::Request.new(env)
16
16
 
17
- def resource
18
- self.class.resource
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
- nil
30
+ ''
26
31
  end
27
32
 
28
- [options[:status], body]
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.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: 2013-07-25 00:00:00.000000000 Z
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-test
42
+ name: rack
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 0.6.2
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: 0.6.2
54
+ version: 1.5.2
55
55
  - !ruby/object:Gem::Dependency
56
- name: sinatra
56
+ name: rack-test
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ~>
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 1.4.3
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: 1.4.3
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.0.0
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