twirl 0.1.0 → 0.2.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/lib/twirl/cluster.rb +15 -2
- data/lib/twirl/mirror.rb +19 -0
- data/lib/twirl/version.rb +1 -1
- data/test/cluster_test.rb +35 -0
- data/test/mirror_test.rb +24 -0
- data/twirl.gemspec +1 -1
- metadata +6 -3
    
        data/lib/twirl/cluster.rb
    CHANGED
    
    | @@ -1,6 +1,7 @@ | |
| 1 1 | 
             
            require "forwardable"
         | 
| 2 2 | 
             
            require "kjess"
         | 
| 3 3 | 
             
            require "twirl/item"
         | 
| 4 | 
            +
            require "twirl/mirror"
         | 
| 4 5 | 
             
            require "twirl/instrumenters/noop"
         | 
| 5 6 |  | 
| 6 7 | 
             
            module Twirl
         | 
| @@ -30,6 +31,9 @@ module Twirl | |
| 30 31 | 
             
                # Private: What should be used to instrument all the things.
         | 
| 31 32 | 
             
                attr_reader :instrumenter
         | 
| 32 33 |  | 
| 34 | 
            +
                # Private: What handles dumping and loading values.
         | 
| 35 | 
            +
                attr_reader :encoder
         | 
| 36 | 
            +
             | 
| 33 37 | 
             
                # Private: What errors should be considered retryable.
         | 
| 34 38 | 
             
                attr_reader :retryable_errors
         | 
| 35 39 |  | 
| @@ -47,6 +51,7 @@ module Twirl | |
| 47 51 | 
             
                #                                  before rotating to the next client (default: 100)
         | 
| 48 52 | 
             
                #           :retries - The Number of times a command should be retried (default: 5).
         | 
| 49 53 | 
             
                #           :instrumenter - Where to send instrumention (defaults: noop).
         | 
| 54 | 
            +
                #           :encoder - What to use to dump/load vlues (defaults: mirror).
         | 
| 50 55 | 
             
                def initialize(clients, options = {})
         | 
| 51 56 | 
             
                  @client_index = 0
         | 
| 52 57 | 
             
                  @command_count = 0
         | 
| @@ -54,6 +59,7 @@ module Twirl | |
| 54 59 | 
             
                  @retries = options.fetch(:retries, 5)
         | 
| 55 60 | 
             
                  @commands_per_client = options.fetch(:commands_per_client, 100)
         | 
| 56 61 | 
             
                  @instrumenter = options.fetch(:instrumenter, Instrumenters::Noop)
         | 
| 62 | 
            +
                  @encoder = options.fetch(:encoder, Mirror)
         | 
| 57 63 | 
             
                  @retryable_errors = options.fetch(:retryable_errors, RetryableErrors)
         | 
| 58 64 | 
             
                end
         | 
| 59 65 |  | 
| @@ -73,11 +79,16 @@ module Twirl | |
| 73 79 | 
             
                  with_retries { |tries|
         | 
| 74 80 | 
             
                    @instrumenter.instrument("op.twirl") { |payload|
         | 
| 75 81 | 
             
                      payload[:op] = :set
         | 
| 76 | 
            -
                      payload[:bytes] = item.size
         | 
| 82 | 
            +
                      payload[:bytes] = item.to_s.size
         | 
| 77 83 | 
             
                      payload[:queue_name] = queue_name
         | 
| 78 84 | 
             
                      payload[:retry] = tries != @retries
         | 
| 79 85 |  | 
| 80 | 
            -
                       | 
| 86 | 
            +
                      value = if item
         | 
| 87 | 
            +
                        @encoder.dump(item)
         | 
| 88 | 
            +
                      else
         | 
| 89 | 
            +
                        nil
         | 
| 90 | 
            +
                      end
         | 
| 91 | 
            +
                      client.set(queue_name, value, expiration)
         | 
| 81 92 | 
             
                    }
         | 
| 82 93 | 
             
                  }
         | 
| 83 94 | 
             
                end
         | 
| @@ -244,6 +255,7 @@ module Twirl | |
| 244 255 |  | 
| 245 256 | 
             
                      if value = client.send(op, queue_name, *args)
         | 
| 246 257 | 
             
                        payload[:bytes] = value.size
         | 
| 258 | 
            +
                        value = @encoder.load(value) if value
         | 
| 247 259 | 
             
                        Item.new queue_name, value, client, @instrumenter
         | 
| 248 260 | 
             
                      else
         | 
| 249 261 | 
             
                        rotate_for_next_op
         | 
| @@ -304,6 +316,7 @@ module Twirl | |
| 304 316 | 
             
                  }
         | 
| 305 317 | 
             
                end
         | 
| 306 318 |  | 
| 319 | 
            +
                # Private: Retries an operation a number of times if it raises exception.
         | 
| 307 320 | 
             
                def with_retries
         | 
| 308 321 | 
             
                  tries = @retries
         | 
| 309 322 | 
             
                  begin
         | 
    
        data/lib/twirl/mirror.rb
    ADDED
    
    
    
        data/lib/twirl/version.rb
    CHANGED
    
    
    
        data/test/cluster_test.rb
    CHANGED
    
    | @@ -15,6 +15,7 @@ class ClusterTest < Minitest::Test | |
| 15 15 | 
             
                assert_equal [KJess::NetworkError, KJess::ServerError],
         | 
| 16 16 | 
             
                  cluster.retryable_errors
         | 
| 17 17 | 
             
                assert_equal Twirl::Instrumenters::Noop, cluster.instrumenter
         | 
| 18 | 
            +
                assert_equal Twirl::Mirror, cluster.encoder
         | 
| 18 19 | 
             
              end
         | 
| 19 20 |  | 
| 20 21 | 
             
              def test_initialize_shuffles_clients
         | 
| @@ -31,6 +32,12 @@ class ClusterTest < Minitest::Test | |
| 31 32 | 
             
                assert_equal instrumenter, cluster.instrumenter
         | 
| 32 33 | 
             
              end
         | 
| 33 34 |  | 
| 35 | 
            +
              def test_overriding_encoder
         | 
| 36 | 
            +
                encoder = Object.new
         | 
| 37 | 
            +
                cluster = Twirl::Cluster.new([], encoder: encoder)
         | 
| 38 | 
            +
                assert_equal encoder, cluster.encoder
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
             | 
| 34 41 | 
             
              def test_overriding_retryable_errors
         | 
| 35 42 | 
             
                retryable_errors = StandardError
         | 
| 36 43 | 
             
                cluster = Twirl::Cluster.new([], retryable_errors: retryable_errors)
         | 
| @@ -466,4 +473,32 @@ class ClusterTest < Minitest::Test | |
| 466 473 | 
             
                  end
         | 
| 467 474 | 
             
                end
         | 
| 468 475 | 
             
              end
         | 
| 476 | 
            +
             | 
| 477 | 
            +
              def test_values_dumped_and_loaded_by_encoder
         | 
| 478 | 
            +
                encoder = Minitest::Mock.new
         | 
| 479 | 
            +
                encoder.expect :dump, :dump, ["data"]
         | 
| 480 | 
            +
                encoder.expect :load, :load, ["data"]
         | 
| 481 | 
            +
             | 
| 482 | 
            +
                cluster = build(:mock_cluster, encoder: encoder)
         | 
| 483 | 
            +
                cluster[0].expect :set, true, ["testing", :dump, 0]
         | 
| 484 | 
            +
                cluster.set("testing", "data")
         | 
| 485 | 
            +
             | 
| 486 | 
            +
                cluster[0].expect :get, "data", ["testing", {}]
         | 
| 487 | 
            +
                assert_equal :load, cluster.get("testing").value
         | 
| 488 | 
            +
             | 
| 489 | 
            +
                encoder.verify
         | 
| 490 | 
            +
              end
         | 
| 491 | 
            +
             | 
| 492 | 
            +
              def test_nil_values_not_dumped_or_loaded
         | 
| 493 | 
            +
                encoder = Minitest::Mock.new
         | 
| 494 | 
            +
             | 
| 495 | 
            +
                cluster = build(:mock_cluster, encoder: encoder)
         | 
| 496 | 
            +
                cluster[0].expect :set, true, ["testing", nil, 0]
         | 
| 497 | 
            +
                cluster.set("testing", nil)
         | 
| 498 | 
            +
             | 
| 499 | 
            +
                cluster[0].expect :get, nil, ["testing", {}]
         | 
| 500 | 
            +
                assert_nil cluster.get("testing")
         | 
| 501 | 
            +
             | 
| 502 | 
            +
                encoder.verify
         | 
| 503 | 
            +
              end
         | 
| 469 504 | 
             
            end
         | 
    
        data/test/mirror_test.rb
    ADDED
    
    | @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            require "helper"
         | 
| 2 | 
            +
            require "twirl/mirror"
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            class MirrorTest < Minitest::Test
         | 
| 5 | 
            +
              def test_dump
         | 
| 6 | 
            +
                data = "data"
         | 
| 7 | 
            +
                assert_equal data, Twirl::Mirror.dump(data)
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              def test_load
         | 
| 11 | 
            +
                data = "data"
         | 
| 12 | 
            +
                assert_equal data, Twirl::Mirror.load(data)
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              def test_dump
         | 
| 16 | 
            +
                data = "data"
         | 
| 17 | 
            +
                assert_equal data, Twirl::Mirror.new.dump(data)
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              def test_load
         | 
| 21 | 
            +
                data = "data"
         | 
| 22 | 
            +
                assert_equal data, Twirl::Mirror.new.load(data)
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
            end
         | 
    
        data/twirl.gemspec
    CHANGED
    
    | @@ -10,7 +10,7 @@ Gem::Specification.new do |spec| | |
| 10 10 | 
             
              spec.email         = ["nunemaker@gmail.com"]
         | 
| 11 11 | 
             
              spec.description   = %q{Wrapper for kjess that works with multiple kestrel instances intelligently.}
         | 
| 12 12 | 
             
              spec.summary       = %q{Wrapper for kjess that works with multiple kestrel instances intelligently.}
         | 
| 13 | 
            -
              spec.homepage      = ""
         | 
| 13 | 
            +
              spec.homepage      = "https://github.com/jnunemaker/twirl"
         | 
| 14 14 | 
             
              spec.license       = "MIT"
         | 
| 15 15 |  | 
| 16 16 | 
             
              spec.files         = `git ls-files`.split($/)
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: twirl
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.2.0
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2013-09- | 
| 12 | 
            +
            date: 2013-09-16 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: kjess
         | 
| @@ -65,6 +65,7 @@ files: | |
| 65 65 | 
             
            - lib/twirl/instrumenters/memory.rb
         | 
| 66 66 | 
             
            - lib/twirl/instrumenters/noop.rb
         | 
| 67 67 | 
             
            - lib/twirl/item.rb
         | 
| 68 | 
            +
            - lib/twirl/mirror.rb
         | 
| 68 69 | 
             
            - lib/twirl/server.rb
         | 
| 69 70 | 
             
            - lib/twirl/version.rb
         | 
| 70 71 | 
             
            - script/bootstrap
         | 
| @@ -80,10 +81,11 @@ files: | |
| 80 81 | 
             
            - test/instrumenters/noop_test.rb
         | 
| 81 82 | 
             
            - test/integration/cluster_test.rb
         | 
| 82 83 | 
             
            - test/item_test.rb
         | 
| 84 | 
            +
            - test/mirror_test.rb
         | 
| 83 85 | 
             
            - test/support/fake_udp_socket.rb
         | 
| 84 86 | 
             
            - test/twirl_test.rb
         | 
| 85 87 | 
             
            - twirl.gemspec
         | 
| 86 | 
            -
            homepage:  | 
| 88 | 
            +
            homepage: https://github.com/jnunemaker/twirl
         | 
| 87 89 | 
             
            licenses:
         | 
| 88 90 | 
             
            - MIT
         | 
| 89 91 | 
             
            post_install_message: 
         | 
| @@ -117,5 +119,6 @@ test_files: | |
| 117 119 | 
             
            - test/instrumenters/noop_test.rb
         | 
| 118 120 | 
             
            - test/integration/cluster_test.rb
         | 
| 119 121 | 
             
            - test/item_test.rb
         | 
| 122 | 
            +
            - test/mirror_test.rb
         | 
| 120 123 | 
             
            - test/support/fake_udp_socket.rb
         | 
| 121 124 | 
             
            - test/twirl_test.rb
         |