activeresource-persistent 0.0.1 → 0.1.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.
- data/Gemfile +13 -0
- data/README.md +2 -2
- data/activeresource-persistent.gemspec +1 -1
- data/config.ru +2 -0
- data/lib/active_resource/persistent/connection.rb +4 -1
- data/lib/active_resource/persistent/http.rb +2 -0
- data/public/.gitkeep +0 -0
- data/spec/active_resource/connection_spec.rb +86 -0
- data/spec/active_resource/integration_spec.rb +62 -0
- data/spec/active_resource/persistent/http_spec.rb +77 -0
- data/spec/spec_helper.rb +22 -0
- data/spec/support/test_application.rb +127 -0
- data/spec/support/test_helper.rb +22 -0
- data/spec/support/test_ipc.rb +19 -0
- data/spec/support/test_resources.rb +9 -0
- data/spec/support/test_server.rb +40 -0
- metadata +57 -66
    
        data/Gemfile
    CHANGED
    
    | @@ -1,3 +1,16 @@ | |
| 1 1 | 
             
            source 'https://rubygems.org'
         | 
| 2 2 |  | 
| 3 3 | 
             
            gemspec
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            gem 'activeresource', '3.2.3'
         | 
| 6 | 
            +
            gem 'net-http-persistent', '2.6'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            group :test do
         | 
| 9 | 
            +
              gem 'rspec', '2.8.0'
         | 
| 10 | 
            +
              gem 'sinatra', '1.3.2'
         | 
| 11 | 
            +
              gem 'posix-spawn', '0.3.6'
         | 
| 12 | 
            +
            end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            group :bundle do
         | 
| 15 | 
            +
              gem 'passenger', '3.0.12'
         | 
| 16 | 
            +
            end
         | 
    
        data/README.md
    CHANGED
    
    | @@ -6,7 +6,7 @@ HTTP persistent connection support for ActiveResource. | |
| 6 6 |  | 
| 7 7 | 
             
            Add this line to your application's Gemfile:
         | 
| 8 8 |  | 
| 9 | 
            -
                gem ' | 
| 9 | 
            +
                gem 'activeresource-persistent', :require => 'active_resource/persistent'
         | 
| 10 10 |  | 
| 11 11 | 
             
            And then execute:
         | 
| 12 12 |  | 
| @@ -14,7 +14,7 @@ And then execute: | |
| 14 14 |  | 
| 15 15 | 
             
            Or install it yourself as:
         | 
| 16 16 |  | 
| 17 | 
            -
                $ gem install  | 
| 17 | 
            +
                $ gem install activeresource-persistent
         | 
| 18 18 |  | 
| 19 19 | 
             
            ## Usage
         | 
| 20 20 |  | 
| @@ -11,7 +11,7 @@ Gem::Specification.new do |gem| | |
| 11 11 | 
             
              gem.test_files    = gem.files.grep(%r{^(test|spec|features)/})
         | 
| 12 12 | 
             
              gem.name          = "activeresource-persistent"
         | 
| 13 13 | 
             
              gem.require_paths = ["lib"]
         | 
| 14 | 
            -
              gem.version       = "0.0 | 
| 14 | 
            +
              gem.version       = "0.1.0"
         | 
| 15 15 |  | 
| 16 16 | 
             
              gem.add_runtime_dependency 'net-http-persistent', '>=2.5'
         | 
| 17 17 | 
             
              gem.add_runtime_dependency 'activeresource', '>=2.3.0'
         | 
    
        data/config.ru
    ADDED
    
    
| @@ -5,8 +5,11 @@ module ActiveResource | |
| 5 5 |  | 
| 6 6 | 
             
                protected
         | 
| 7 7 |  | 
| 8 | 
            -
                def  | 
| 8 | 
            +
                def new_http_with_persistent
         | 
| 9 9 | 
             
                  ActiveResource::Persistent::HTTP.new(site, proxy)
         | 
| 10 10 | 
             
                end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                alias_method :new_http_without_persistent, :new_http
         | 
| 13 | 
            +
                alias_method :new_http, :new_http_with_persistent
         | 
| 11 14 | 
             
              end
         | 
| 12 15 | 
             
            end
         | 
    
        data/public/.gitkeep
    ADDED
    
    | 
            File without changes
         | 
| @@ -0,0 +1,86 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe ActiveResource::Connection do
         | 
| 4 | 
            +
              let(:site) { TestServer.uri }
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              let(:instance) { described_class.new(site) }
         | 
| 7 | 
            +
              
         | 
| 8 | 
            +
              describe "#http" do
         | 
| 9 | 
            +
                subject { instance.send(:http) }
         | 
| 10 | 
            +
                it "should be persistent" do
         | 
| 11 | 
            +
                  subject.should be_instance_of(ActiveResource::Persistent::HTTP)
         | 
| 12 | 
            +
                  subject.site.should == site
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              describe "#new_http" do
         | 
| 17 | 
            +
                specify { instance.send(:new_http).should be_instance_of(ActiveResource::Persistent::HTTP) }
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              describe "#new_http_with_persistent" do
         | 
| 21 | 
            +
                specify { instance.send(:new_http_with_persistent).should be_instance_of(ActiveResource::Persistent::HTTP) }
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              describe "#new_http_without_persistent" do
         | 
| 25 | 
            +
                specify { instance.send(:new_http_without_persistent).should be_instance_of(Net::HTTP) }
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              context "request methods" do
         | 
| 29 | 
            +
                let(:path) { '/inspect' }
         | 
| 30 | 
            +
                let(:body) { 'HELLO WORLD' }
         | 
| 31 | 
            +
                let(:headers) { { 'X_Header' => 'x_value' } }
         | 
| 32 | 
            +
                let(:http_mock) { mock('HTTP MOCK') }
         | 
| 33 | 
            +
                let(:response_mock) { mock('RESPONSE MOCK', :code => '200') }
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                describe "#head" do
         | 
| 36 | 
            +
                  it "should use ActiveResource::Persistent::HTTP#head" do
         | 
| 37 | 
            +
                    expected_headers = headers.update('Accept' => 'application/json')
         | 
| 38 | 
            +
                    instance.should_receive(:http).and_return(http_mock)
         | 
| 39 | 
            +
                    http_mock.should_receive(:head).with(path, expected_headers).and_return(response_mock)
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                    instance.head(path, headers)
         | 
| 42 | 
            +
                  end
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                describe "#get" do
         | 
| 46 | 
            +
                  it "should use ActiveResource::Persistent::HTTP#get" do
         | 
| 47 | 
            +
                    expected_headers = headers.update('Accept' => 'application/json')
         | 
| 48 | 
            +
                    instance.should_receive(:http).and_return(http_mock)
         | 
| 49 | 
            +
                    http_mock.should_receive(:get).with(path, expected_headers).and_return(response_mock)
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                    instance.get(path, headers)
         | 
| 52 | 
            +
                  end
         | 
| 53 | 
            +
                end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                describe "#delete" do
         | 
| 56 | 
            +
                  it "should use ActiveResource::Persistent::HTTP#delete" do
         | 
| 57 | 
            +
                    expected_headers = headers.update('Accept' => 'application/json')
         | 
| 58 | 
            +
                    instance.should_receive(:http).and_return(http_mock)
         | 
| 59 | 
            +
                    http_mock.should_receive(:delete).with(path, expected_headers).and_return(response_mock)
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                    instance.delete(path, headers)
         | 
| 62 | 
            +
                  end
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                describe "#post" do
         | 
| 66 | 
            +
                  it "should use ActiveResource::Persistent::HTTP#post" do
         | 
| 67 | 
            +
                    expected_headers = headers.update('Content-Type' => 'application/json')
         | 
| 68 | 
            +
                    instance.should_receive(:http).and_return(http_mock)
         | 
| 69 | 
            +
                    http_mock.should_receive(:post).with(path, body, expected_headers).and_return(response_mock)
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                    instance.post(path, body, headers)
         | 
| 72 | 
            +
                  end
         | 
| 73 | 
            +
                end
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                describe "#put" do
         | 
| 76 | 
            +
                  it "should use ActiveResource::Persistent::HTTP#put" do
         | 
| 77 | 
            +
                    expected_headers = headers.update('Content-Type' => 'application/json')
         | 
| 78 | 
            +
                    instance.should_receive(:http).and_return(http_mock)
         | 
| 79 | 
            +
                    http_mock.should_receive(:put).with(path, body, expected_headers).and_return(response_mock)
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                    instance.put(path, body, headers)
         | 
| 82 | 
            +
                  end
         | 
| 83 | 
            +
                end
         | 
| 84 | 
            +
              end
         | 
| 85 | 
            +
             | 
| 86 | 
            +
            end
         | 
| @@ -0,0 +1,62 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe %q(
         | 
| 4 | 
            +
              As Developer
         | 
| 5 | 
            +
              I order to speed up my active resources usage
         | 
| 6 | 
            +
              I want to use HTTP 1.1 keepalive feature
         | 
| 7 | 
            +
            ) do
         | 
| 8 | 
            +
              
         | 
| 9 | 
            +
              it "Retrieving one resource multiple times" do
         | 
| 10 | 
            +
                ids = %w(101 202 303)
         | 
| 11 | 
            +
                users = ids.map { |id| TestUser.find(id) }
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                users[0].id.should == ids[0]
         | 
| 14 | 
            +
                users[1].id.should == ids[1]
         | 
| 15 | 
            +
                users[2].id.should == ids[2]
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                TestHelper.logged_requests.size.should == 3
         | 
| 18 | 
            +
                TestHelper.persistent_requests_logged?.should be_true
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              it "Retrieving two resources from the same site" do
         | 
| 22 | 
            +
                user = TestUser.find("101")
         | 
| 23 | 
            +
                post = TestPost.find("202")
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                user.id.should == "101"
         | 
| 26 | 
            +
                post.id.should == "202"
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                TestHelper.logged_requests.size.should == 2
         | 
| 29 | 
            +
                TestHelper.persistent_requests_logged?.should be_true
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              it "Delete different resources from the same site" do
         | 
| 33 | 
            +
                TestUser.find("101").destroy
         | 
| 34 | 
            +
                TestPost.find("202").destroy
         | 
| 35 | 
            +
               
         | 
| 36 | 
            +
                TestHelper.logged_requests.size.should == 4
         | 
| 37 | 
            +
                TestHelper.persistent_requests_logged?.should be_true
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
              it "Updating different resources from the same site" do
         | 
| 41 | 
            +
                user = TestUser.find("101").update_attribute(:username, "jack")
         | 
| 42 | 
            +
                post = TestPost.find("202").update_attribute(:title, "hi")
         | 
| 43 | 
            +
               
         | 
| 44 | 
            +
                TestHelper.logged_requests.size.should == 4
         | 
| 45 | 
            +
                TestHelper.persistent_requests_logged?.should be_true
         | 
| 46 | 
            +
              end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
             | 
| 49 | 
            +
              it "Creating different resources on the same site" do
         | 
| 50 | 
            +
                user = TestUser.create(:username => "Bob")
         | 
| 51 | 
            +
                post = TestPost.create(:title => "Hello Bob")
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                user.id.should_not be_blank
         | 
| 54 | 
            +
                post.id.should_not be_blank
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                user.username.should == "Bob"
         | 
| 57 | 
            +
                post.title.should == "Hello Bob"
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                TestHelper.logged_requests.size.should == 2
         | 
| 60 | 
            +
                TestHelper.persistent_requests_logged?.should be_true
         | 
| 61 | 
            +
              end
         | 
| 62 | 
            +
            end
         | 
| @@ -0,0 +1,77 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe ActiveResource::Persistent::HTTP do
         | 
| 4 | 
            +
              describe "class" do
         | 
| 5 | 
            +
                subject { described_class }
         | 
| 6 | 
            +
                its(:superclass) { should == Net::HTTP::Persistent }
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              describe "instance" do
         | 
| 10 | 
            +
                let(:site)  { URI.parse('http://site.example.com:3000') }
         | 
| 11 | 
            +
                let(:proxy)  { URI.parse('http://proxy.example.com:8080') }
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                subject { described_class.new(site, proxy) }
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                it "should have site" do
         | 
| 16 | 
            +
                  subject.site.should == site
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                it "should have proxy_uri" do
         | 
| 20 | 
            +
                  subject.proxy_uri.should == proxy
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              context "request methods" do
         | 
| 25 | 
            +
                let(:site) { TestServer.uri }
         | 
| 26 | 
            +
                let(:instance) { described_class.new(site, nil) }
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                let(:path) { '/inspect/all?key=value' }
         | 
| 29 | 
            +
                let(:body) { 'HELLO WORLD' }
         | 
| 30 | 
            +
                let(:headers) { { 'X-AUTHORIZATION' => 'qwerty' } }
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                it "should HEAD data" do
         | 
| 33 | 
            +
                  @response = instance.head(path, headers)
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  @response.should be_instance_of(Net::HTTPOK)
         | 
| 36 | 
            +
                  @response.body.should be_nil
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                it "should GET data" do
         | 
| 40 | 
            +
                  @response = instance.get(path, headers)
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                  expect_response('GET', nil)
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                it "should DELETE data" do
         | 
| 46 | 
            +
                  @response = instance.delete(path, headers)
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                  expect_response('DELETE', nil)
         | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                it "should POST data" do
         | 
| 52 | 
            +
                  @response = instance.post(path, body, headers)
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                  expect_response('POST', body)
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                it "should PUT data" do
         | 
| 58 | 
            +
                  @response = instance.put(path, body, headers)
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                  expect_response('PUT', body)
         | 
| 61 | 
            +
                end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                protected
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                def expect_response(request_method, payload)
         | 
| 66 | 
            +
                  @response.should be_instance_of(Net::HTTPOK)
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                  body = YAML.load(@response.body)
         | 
| 69 | 
            +
                 
         | 
| 70 | 
            +
                  body['REQUEST_METHOD'].should == request_method
         | 
| 71 | 
            +
                  body['REQUEST_URI'].should == path
         | 
| 72 | 
            +
                  body['HTTP_X_AUTHORIZATION'].should == 'qwerty'
         | 
| 73 | 
            +
                  body['rack.input'].should == payload
         | 
| 74 | 
            +
                end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
              end
         | 
| 77 | 
            +
            end
         | 
    
        data/spec/spec_helper.rb
    ADDED
    
    | @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            Bundler.setup
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'active_resource/persistent'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            Dir["spec/support/**/*.rb"].each { |f| load f }
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            RSpec.configure do |config|
         | 
| 8 | 
            +
              config.before(:suite) do
         | 
| 9 | 
            +
                TestServer.start
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                TestUser.site = TestServer.uri
         | 
| 12 | 
            +
                TestPost.site = TestServer.uri
         | 
| 13 | 
            +
              end 
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              config.before(:each) do
         | 
| 16 | 
            +
                TestIPC.clear
         | 
| 17 | 
            +
              end 
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              config.after(:suite) do
         | 
| 20 | 
            +
                TestServer.stop
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
            end
         | 
| @@ -0,0 +1,127 @@ | |
| 1 | 
            +
            require 'sinatra'
         | 
| 2 | 
            +
            require 'multi_json'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            class TestApplication < Sinatra::Base
         | 
| 5 | 
            +
              before do
         | 
| 6 | 
            +
                TestHelper.log_request(env)
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              #
         | 
| 10 | 
            +
              # User resources
         | 
| 11 | 
            +
              #
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              get '/users/:id.json' do
         | 
| 14 | 
            +
                id = params[:id]
         | 
| 15 | 
            +
                data_halt({
         | 
| 16 | 
            +
                  'id'       => id,
         | 
| 17 | 
            +
                  'username' => "jack_#{id}",
         | 
| 18 | 
            +
                  'remote_port' => env['REMOTE_PORT']
         | 
| 19 | 
            +
                })
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              get '/users.json' do
         | 
| 23 | 
            +
                data_halt([
         | 
| 24 | 
            +
                  {
         | 
| 25 | 
            +
                    'id'       => 1,
         | 
| 26 | 
            +
                    'username' => "alice",
         | 
| 27 | 
            +
                    'remote_port' => env['REMOTE_PORT']
         | 
| 28 | 
            +
                  },
         | 
| 29 | 
            +
                  {
         | 
| 30 | 
            +
                    'id'       => 2,
         | 
| 31 | 
            +
                    'username' => "bob",
         | 
| 32 | 
            +
                    'remote_port' => env['REMOTE_PORT']
         | 
| 33 | 
            +
                  }
         | 
| 34 | 
            +
                ])
         | 
| 35 | 
            +
              end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
              post '/users.json' do
         | 
| 38 | 
            +
                user = MultiJson.load(request.body)
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                id = Time.now.to_i
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                halt 202, { 'Location' => "/users/#{id}" }, ''
         | 
| 43 | 
            +
              end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
              put '/users/:id.json' do
         | 
| 46 | 
            +
                id = params[:id]
         | 
| 47 | 
            +
                user = MultiJson.load(request.body)
         | 
| 48 | 
            +
                data_halt(user)
         | 
| 49 | 
            +
              end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
              delete '/users/:id.json' do
         | 
| 52 | 
            +
                id = params[:id]
         | 
| 53 | 
            +
                halt 200
         | 
| 54 | 
            +
              end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
              #
         | 
| 57 | 
            +
              # Post resources
         | 
| 58 | 
            +
              # 
         | 
| 59 | 
            +
             | 
| 60 | 
            +
              get '/posts/:id.json' do
         | 
| 61 | 
            +
                id = params[:id]
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                data_halt({
         | 
| 64 | 
            +
                  'id'    => id,
         | 
| 65 | 
            +
                  'title' => "hello_world_#{id}",
         | 
| 66 | 
            +
                  'remote_port' => env['REMOTE_PORT']
         | 
| 67 | 
            +
                })
         | 
| 68 | 
            +
              end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
              put '/posts/:id.json' do
         | 
| 71 | 
            +
                id = params[:id]
         | 
| 72 | 
            +
                post = MultiJson.load(request.body)
         | 
| 73 | 
            +
                data_halt(post)
         | 
| 74 | 
            +
              end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
              post '/posts.json' do
         | 
| 77 | 
            +
                post = MultiJson.load(request.body)
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                id = Time.now.to_i
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                halt 202, { 'Location' => "/posts/#{id}" }, ''
         | 
| 82 | 
            +
              end
         | 
| 83 | 
            +
             | 
| 84 | 
            +
              delete '/posts/:id.json' do
         | 
| 85 | 
            +
                id = params[:id]
         | 
| 86 | 
            +
                halt 200
         | 
| 87 | 
            +
              end
         | 
| 88 | 
            +
             | 
| 89 | 
            +
              #
         | 
| 90 | 
            +
              # Inspect other requests
         | 
| 91 | 
            +
              #
         | 
| 92 | 
            +
              head   '/*' do nil end
         | 
| 93 | 
            +
              get    '/*' do env_halt end
         | 
| 94 | 
            +
              delete '/*' do env_halt end
         | 
| 95 | 
            +
              post   '/*' do env_halt end
         | 
| 96 | 
            +
              put    '/*' do env_halt end
         | 
| 97 | 
            +
             | 
| 98 | 
            +
              protected
         | 
| 99 | 
            +
             | 
| 100 | 
            +
              def data_halt(data, status = 200)
         | 
| 101 | 
            +
                content_type :json
         | 
| 102 | 
            +
                body MultiJson.dump(data)
         | 
| 103 | 
            +
                halt status
         | 
| 104 | 
            +
              end
         | 
| 105 | 
            +
             | 
| 106 | 
            +
              def env_halt
         | 
| 107 | 
            +
                payload = {}
         | 
| 108 | 
            +
             | 
| 109 | 
            +
                env.sort.each do |key, value|
         | 
| 110 | 
            +
                  case key
         | 
| 111 | 
            +
                  when 'rack.input'
         | 
| 112 | 
            +
                    while line = value.gets
         | 
| 113 | 
            +
                      data ||= ""
         | 
| 114 | 
            +
                      data << line
         | 
| 115 | 
            +
                    end
         | 
| 116 | 
            +
                    payload[key] = data
         | 
| 117 | 
            +
                  when /^rack\./
         | 
| 118 | 
            +
                  else
         | 
| 119 | 
            +
                    payload[key] = value
         | 
| 120 | 
            +
                  end
         | 
| 121 | 
            +
                end
         | 
| 122 | 
            +
             | 
| 123 | 
            +
                content_type :text
         | 
| 124 | 
            +
                body payload.to_yaml
         | 
| 125 | 
            +
                halt 200
         | 
| 126 | 
            +
              end
         | 
| 127 | 
            +
            end
         | 
| @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            module TestHelper
         | 
| 2 | 
            +
              extend self
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              def log_request(env)
         | 
| 5 | 
            +
                data = [
         | 
| 6 | 
            +
                  env['REMOTE_PORT'],
         | 
| 7 | 
            +
                  env['REQUEST_METHOD'],
         | 
| 8 | 
            +
                  env['REQUEST_URI']
         | 
| 9 | 
            +
                ].join('|') 
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                TestIPC.push(data)
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              def logged_requests
         | 
| 15 | 
            +
                TestIPC.pull.map { |line| line.split('|') }
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
              def persistent_requests_logged?
         | 
| 19 | 
            +
                logged_requests.map { |line| line[0] }.uniq.size == 1
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            end
         | 
| @@ -0,0 +1,19 @@ | |
| 1 | 
            +
            module TestIPC
         | 
| 2 | 
            +
              extend self
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              def filename
         | 
| 5 | 
            +
                @filename = File.expand_path('../../../tmp/test_ipc.text', __FILE__)
         | 
| 6 | 
            +
              end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              def clear
         | 
| 9 | 
            +
                File.delete(filename) if File.exists?(filename)
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              def push(data)
         | 
| 13 | 
            +
                File.open(filename, "a+") { |f| f.puts(data) }
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              def pull
         | 
| 17 | 
            +
                File.exists?(filename) ? File.read(filename).split("\n") : []
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
            end
         | 
| @@ -0,0 +1,40 @@ | |
| 1 | 
            +
            require 'socket'
         | 
| 2 | 
            +
            require 'posix/spawn'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module TestServer
         | 
| 5 | 
            +
              extend self
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              def host
         | 
| 8 | 
            +
                'localhost'
         | 
| 9 | 
            +
              end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              def port
         | 
| 12 | 
            +
                9292
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              def uri
         | 
| 16 | 
            +
                URI.parse("http://#{host}:#{port}")
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              def pid
         | 
| 20 | 
            +
                @pid
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              def start
         | 
| 24 | 
            +
                @pid = POSIX::Spawn.spawn("passenger start --port #{port}", :out => 'test_server.output')
         | 
| 25 | 
            +
                sleep(1)
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              def stop
         | 
| 29 | 
            +
                Process.kill("TERM", pid) if pid
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              protected
         | 
| 33 | 
            +
             | 
| 34 | 
            +
              def find_available_port
         | 
| 35 | 
            +
                server = TCPServer.new('127.0.0.1', '9292')
         | 
| 36 | 
            +
                server.addr[1]
         | 
| 37 | 
            +
              ensure
         | 
| 38 | 
            +
                server.close if server
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,106 +1,97 @@ | |
| 1 | 
            -
            --- !ruby/object:Gem::Specification | 
| 1 | 
            +
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: activeresource-persistent
         | 
| 3 | 
            -
            version: !ruby/object:Gem::Version | 
| 4 | 
            -
               | 
| 3 | 
            +
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            +
              version: 0.1.0
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 | 
            -
              segments: 
         | 
| 7 | 
            -
              - 0
         | 
| 8 | 
            -
              - 0
         | 
| 9 | 
            -
              - 1
         | 
| 10 | 
            -
              version: 0.0.1
         | 
| 11 6 | 
             
            platform: ruby
         | 
| 12 | 
            -
            authors: | 
| 7 | 
            +
            authors:
         | 
| 13 8 | 
             
            - Andriy Yanko
         | 
| 14 9 | 
             
            autorequire: 
         | 
| 15 10 | 
             
            bindir: bin
         | 
| 16 11 | 
             
            cert_chain: []
         | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
            dependencies: 
         | 
| 21 | 
            -
            - !ruby/object:Gem::Dependency 
         | 
| 12 | 
            +
            date: 2012-04-25 00:00:00.000000000 Z
         | 
| 13 | 
            +
            dependencies:
         | 
| 14 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 22 15 | 
             
              name: net-http-persistent
         | 
| 23 | 
            -
               | 
| 24 | 
            -
              requirement: &id001 !ruby/object:Gem::Requirement 
         | 
| 16 | 
            +
              requirement: &16473480 !ruby/object:Gem::Requirement
         | 
| 25 17 | 
             
                none: false
         | 
| 26 | 
            -
                requirements: | 
| 27 | 
            -
                - -  | 
| 28 | 
            -
                  - !ruby/object:Gem::Version | 
| 29 | 
            -
                     | 
| 30 | 
            -
                    segments: 
         | 
| 31 | 
            -
                    - 2
         | 
| 32 | 
            -
                    - 5
         | 
| 33 | 
            -
                    version: "2.5"
         | 
| 18 | 
            +
                requirements:
         | 
| 19 | 
            +
                - - ! '>='
         | 
| 20 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 21 | 
            +
                    version: '2.5'
         | 
| 34 22 | 
             
              type: :runtime
         | 
| 35 | 
            -
              version_requirements: *id001
         | 
| 36 | 
            -
            - !ruby/object:Gem::Dependency 
         | 
| 37 | 
            -
              name: activeresource
         | 
| 38 23 | 
             
              prerelease: false
         | 
| 39 | 
            -
               | 
| 24 | 
            +
              version_requirements: *16473480
         | 
| 25 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 26 | 
            +
              name: activeresource
         | 
| 27 | 
            +
              requirement: &16472560 !ruby/object:Gem::Requirement
         | 
| 40 28 | 
             
                none: false
         | 
| 41 | 
            -
                requirements: | 
| 42 | 
            -
                - -  | 
| 43 | 
            -
                  - !ruby/object:Gem::Version | 
| 44 | 
            -
                    hash: 3
         | 
| 45 | 
            -
                    segments: 
         | 
| 46 | 
            -
                    - 2
         | 
| 47 | 
            -
                    - 3
         | 
| 48 | 
            -
                    - 0
         | 
| 29 | 
            +
                requirements:
         | 
| 30 | 
            +
                - - ! '>='
         | 
| 31 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 49 32 | 
             
                    version: 2.3.0
         | 
| 50 33 | 
             
              type: :runtime
         | 
| 51 | 
            -
               | 
| 34 | 
            +
              prerelease: false
         | 
| 35 | 
            +
              version_requirements: *16472560
         | 
| 52 36 | 
             
            description: HTTP persistent connection support for ActiveResource
         | 
| 53 | 
            -
            email: | 
| 37 | 
            +
            email:
         | 
| 54 38 | 
             
            - andriy.yanko@gmail.com
         | 
| 55 39 | 
             
            executables: []
         | 
| 56 | 
            -
             | 
| 57 40 | 
             
            extensions: []
         | 
| 58 | 
            -
             | 
| 59 41 | 
             
            extra_rdoc_files: []
         | 
| 60 | 
            -
             | 
| 61 | 
            -
            files: 
         | 
| 42 | 
            +
            files:
         | 
| 62 43 | 
             
            - .gitignore
         | 
| 63 44 | 
             
            - Gemfile
         | 
| 64 45 | 
             
            - LICENSE
         | 
| 65 46 | 
             
            - README.md
         | 
| 66 47 | 
             
            - Rakefile
         | 
| 67 48 | 
             
            - activeresource-persistent.gemspec
         | 
| 49 | 
            +
            - config.ru
         | 
| 68 50 | 
             
            - lib/active_resource/persistent.rb
         | 
| 69 51 | 
             
            - lib/active_resource/persistent/connection.rb
         | 
| 70 52 | 
             
            - lib/active_resource/persistent/http.rb
         | 
| 71 | 
            -
             | 
| 53 | 
            +
            - public/.gitkeep
         | 
| 54 | 
            +
            - spec/active_resource/connection_spec.rb
         | 
| 55 | 
            +
            - spec/active_resource/integration_spec.rb
         | 
| 56 | 
            +
            - spec/active_resource/persistent/http_spec.rb
         | 
| 57 | 
            +
            - spec/spec_helper.rb
         | 
| 58 | 
            +
            - spec/support/test_application.rb
         | 
| 59 | 
            +
            - spec/support/test_helper.rb
         | 
| 60 | 
            +
            - spec/support/test_ipc.rb
         | 
| 61 | 
            +
            - spec/support/test_resources.rb
         | 
| 62 | 
            +
            - spec/support/test_server.rb
         | 
| 72 63 | 
             
            homepage: https://github.com/railsware/activeresource-persistent
         | 
| 73 64 | 
             
            licenses: []
         | 
| 74 | 
            -
             | 
| 75 65 | 
             
            post_install_message: 
         | 
| 76 66 | 
             
            rdoc_options: []
         | 
| 77 | 
            -
             | 
| 78 | 
            -
            require_paths: 
         | 
| 67 | 
            +
            require_paths:
         | 
| 79 68 | 
             
            - lib
         | 
| 80 | 
            -
            required_ruby_version: !ruby/object:Gem::Requirement | 
| 69 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 81 70 | 
             
              none: false
         | 
| 82 | 
            -
              requirements: | 
| 83 | 
            -
              - -  | 
| 84 | 
            -
                - !ruby/object:Gem::Version | 
| 85 | 
            -
                   | 
| 86 | 
            -
             | 
| 87 | 
            -
                  - 0
         | 
| 88 | 
            -
                  version: "0"
         | 
| 89 | 
            -
            required_rubygems_version: !ruby/object:Gem::Requirement 
         | 
| 71 | 
            +
              requirements:
         | 
| 72 | 
            +
              - - ! '>='
         | 
| 73 | 
            +
                - !ruby/object:Gem::Version
         | 
| 74 | 
            +
                  version: '0'
         | 
| 75 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 90 76 | 
             
              none: false
         | 
| 91 | 
            -
              requirements: | 
| 92 | 
            -
              - -  | 
| 93 | 
            -
                - !ruby/object:Gem::Version | 
| 94 | 
            -
                   | 
| 95 | 
            -
                  segments: 
         | 
| 96 | 
            -
                  - 0
         | 
| 97 | 
            -
                  version: "0"
         | 
| 77 | 
            +
              requirements:
         | 
| 78 | 
            +
              - - ! '>='
         | 
| 79 | 
            +
                - !ruby/object:Gem::Version
         | 
| 80 | 
            +
                  version: '0'
         | 
| 98 81 | 
             
            requirements: []
         | 
| 99 | 
            -
             | 
| 100 82 | 
             
            rubyforge_project: 
         | 
| 101 | 
            -
            rubygems_version: 1. | 
| 83 | 
            +
            rubygems_version: 1.8.10
         | 
| 102 84 | 
             
            signing_key: 
         | 
| 103 85 | 
             
            specification_version: 3
         | 
| 104 86 | 
             
            summary: HTTP persistent connection support for ActiveResource
         | 
| 105 | 
            -
            test_files: | 
| 106 | 
            -
             | 
| 87 | 
            +
            test_files:
         | 
| 88 | 
            +
            - spec/active_resource/connection_spec.rb
         | 
| 89 | 
            +
            - spec/active_resource/integration_spec.rb
         | 
| 90 | 
            +
            - spec/active_resource/persistent/http_spec.rb
         | 
| 91 | 
            +
            - spec/spec_helper.rb
         | 
| 92 | 
            +
            - spec/support/test_application.rb
         | 
| 93 | 
            +
            - spec/support/test_helper.rb
         | 
| 94 | 
            +
            - spec/support/test_ipc.rb
         | 
| 95 | 
            +
            - spec/support/test_resources.rb
         | 
| 96 | 
            +
            - spec/support/test_server.rb
         | 
| 97 | 
            +
            has_rdoc: 
         |