rom-event_store 0.0.1 → 0.0.2
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/.gitignore +1 -0
- data/.rubocop.yml +4 -0
- data/.travis.yml +7 -1
- data/lib/rom/event_store/commands.rb +13 -0
- data/lib/rom/event_store/connection.rb +104 -0
- data/lib/rom/event_store/dataset.rb +41 -0
- data/lib/rom/event_store/relation.rb +9 -0
- data/lib/rom/event_store/repository.rb +25 -0
- data/lib/rom/event_store/version.rb +1 -1
- data/lib/rom/event_store.rb +6 -5
- data/rom-event_store.gemspec +2 -0
- metadata +41 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 7cf49a845b2891de79c5be6b742089243f0a8afb
         | 
| 4 | 
            +
              data.tar.gz: 872a3a6f385f8262afa37a8fe53c2c96c14dc861
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 89f984a4f66ed78410a7a0dee95c3fbe484de11c246ea837a0b3f18815edcb905eb2da6a3d34f0e1b1352070e6509f09d8f3f477c6d406c05568d2ba0a09a0c3
         | 
| 7 | 
            +
              data.tar.gz: 84dee31899fca106b31c004b1490c728ba1c5bd69b1053c6197b97af14e96fb99b0727f539a5c7941c1f33a7ca02cb076682067a6858d5ddcb2ce3e96dbc5188
         | 
    
        data/.gitignore
    CHANGED
    
    
    
        data/.rubocop.yml
    CHANGED
    
    
    
        data/.travis.yml
    CHANGED
    
    | @@ -5,7 +5,13 @@ bundler_args: --without yard guard benchmarks tools | |
| 5 5 | 
             
            env:
         | 
| 6 6 | 
             
              global:
         | 
| 7 7 | 
             
                - JRUBY_OPTS='--dev -J-Xmx1024M'
         | 
| 8 | 
            -
                - CODECLIMATE_REPO_TOKEN= | 
| 8 | 
            +
                - CODECLIMATE_REPO_TOKEN=1180196768475653637086abfbc1c302a26abde3b8698a8e36c92b4004d193f3
         | 
| 9 | 
            +
            install:
         | 
| 10 | 
            +
              - "wget -nc http://download.geteventstore.com/binaries/EventStore-OSS-Linux-v3.0.3.tar.gz"
         | 
| 11 | 
            +
              - "tar -xvzf EventStore-OSS-Linux-v3.0.3.tar.gz"
         | 
| 12 | 
            +
              - "mv EventStore-OSS-Linux-v3.0.3 .event_store"
         | 
| 13 | 
            +
              - "cd .event_store && ./run-node.sh --db ./ESData &"
         | 
| 14 | 
            +
              - "bundle install"
         | 
| 9 15 | 
             
            script: "bundle exec rake ci"
         | 
| 10 16 | 
             
            rvm:
         | 
| 11 17 | 
             
              - 2.0
         | 
| @@ -0,0 +1,104 @@ | |
| 1 | 
            +
            require 'net/http'
         | 
| 2 | 
            +
            require 'json'
         | 
| 3 | 
            +
            require 'securerandom'
         | 
| 4 | 
            +
            require 'transproc/all'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module ROM
         | 
| 7 | 
            +
              module EventStore
         | 
| 8 | 
            +
                class Connection
         | 
| 9 | 
            +
                  EVENTS_CONTENT_TYPE = 'application/vnd.eventstore.events+json'
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  def initialize(uri)
         | 
| 12 | 
            +
                    uri = URI("http://#{uri}")
         | 
| 13 | 
            +
                    @http = Net::HTTP.new(uri.host, uri.port)
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  def events(category, stream_id = nil)
         | 
| 17 | 
            +
                    events = __get__(stream_uri(category, stream_id))['entries'] || []
         | 
| 18 | 
            +
                    events.map { |event| AtomMapper[event] }
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  def append(category, stream_id, events)
         | 
| 22 | 
            +
                    __post__(stream_uri!(category, stream_id), events)
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                  private
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  ConnectionFailedError = Class.new(StandardError)
         | 
| 28 | 
            +
                  UndefinedStreamError = Class.new(StandardError)
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  def stream_uri(category, stream_id)
         | 
| 31 | 
            +
                    stream = stream_id ? "#{category}-#{stream_id}" : category
         | 
| 32 | 
            +
                    "/streams/#{stream}?embed=body"
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  def stream_uri!(category, stream_id)
         | 
| 36 | 
            +
                    raise UndefinedStreamError unless stream_id
         | 
| 37 | 
            +
                    stream_uri(category, stream_id)
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  def __get__(stream)
         | 
| 41 | 
            +
                    response = @http.get(stream, 'Accept' => 'application/json')
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                    case response.code.to_i
         | 
| 44 | 
            +
                    when 200
         | 
| 45 | 
            +
                      JSON.parse(response.body)
         | 
| 46 | 
            +
                    when 404
         | 
| 47 | 
            +
                      nil
         | 
| 48 | 
            +
                    else
         | 
| 49 | 
            +
                      raise ConnectionFailedError
         | 
| 50 | 
            +
                    end
         | 
| 51 | 
            +
                  end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                  def __post__(stream, events)
         | 
| 54 | 
            +
                    payload = events.map { |event| AtomMapper.prepare(event) }.to_json
         | 
| 55 | 
            +
                    response = @http.post(stream, payload,
         | 
| 56 | 
            +
                                          'Content-Type' => EVENTS_CONTENT_TYPE)
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                    case response.code.to_i
         | 
| 59 | 
            +
                    when 201
         | 
| 60 | 
            +
                      nil
         | 
| 61 | 
            +
                    else
         | 
| 62 | 
            +
                      raise ConnectionFailedError
         | 
| 63 | 
            +
                    end
         | 
| 64 | 
            +
                  end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                  module AtomMapper
         | 
| 67 | 
            +
                    extend Transproc::Composer
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                    ALIASES = {
         | 
| 70 | 
            +
                      eventId: :id,
         | 
| 71 | 
            +
                      eventType: :type,
         | 
| 72 | 
            +
                      eventNumber: :number,
         | 
| 73 | 
            +
                      updated: :created_at
         | 
| 74 | 
            +
                    }.freeze
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                    ATTRS = (ALIASES.values + [:data]).freeze
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                    MAPPER = compose do |ops|
         | 
| 79 | 
            +
                      ops << t(:symbolize_keys!)
         | 
| 80 | 
            +
                      ops << t(:map_hash!, ALIASES)
         | 
| 81 | 
            +
                      ops << t(:map_key!, :created_at, t(:to_time))
         | 
| 82 | 
            +
                      ops << t(-> event { event.keep_if { |key| ATTRS.include?(key) } })
         | 
| 83 | 
            +
                    end
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                    def self.[](event)
         | 
| 86 | 
            +
                      if event['isJson']
         | 
| 87 | 
            +
                        event['data'] = JSON.parse(event['data'])
         | 
| 88 | 
            +
                        t(:symbolize_keys!)[event['data']]
         | 
| 89 | 
            +
                      end
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                      MAPPER[event]
         | 
| 92 | 
            +
                    end
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                    def self.prepare(event)
         | 
| 95 | 
            +
                      {
         | 
| 96 | 
            +
                        eventId: SecureRandom.uuid,
         | 
| 97 | 
            +
                        eventType: event[:type],
         | 
| 98 | 
            +
                        data: event[:data]
         | 
| 99 | 
            +
                      }
         | 
| 100 | 
            +
                    end
         | 
| 101 | 
            +
                  end
         | 
| 102 | 
            +
                end
         | 
| 103 | 
            +
              end
         | 
| 104 | 
            +
            end
         | 
| @@ -0,0 +1,41 @@ | |
| 1 | 
            +
            module ROM
         | 
| 2 | 
            +
              module EventStore
         | 
| 3 | 
            +
                class Dataset
         | 
| 4 | 
            +
                  def initialize(name, connection, options = {})
         | 
| 5 | 
            +
                    @name = name
         | 
| 6 | 
            +
                    @connection = connection
         | 
| 7 | 
            +
                    @options = options
         | 
| 8 | 
            +
                  end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  def from_stream(id)
         | 
| 11 | 
            +
                    __new__(stream: id)
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  def stream
         | 
| 15 | 
            +
                    @options[:stream]
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  def events
         | 
| 19 | 
            +
                    @connection.events(@name, stream)
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  def append(events)
         | 
| 23 | 
            +
                    @connection.append(@name, stream, events)
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  def each
         | 
| 27 | 
            +
                    if block_given?
         | 
| 28 | 
            +
                      events.each { |event| yield(event) }
         | 
| 29 | 
            +
                    else
         | 
| 30 | 
            +
                      to_enum
         | 
| 31 | 
            +
                    end
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  private
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                  def __new__(new_opts = {})
         | 
| 37 | 
            +
                    self.class.new(@name, @connection, @options.merge(new_opts))
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
              end
         | 
| 41 | 
            +
            end
         | 
| @@ -0,0 +1,25 @@ | |
| 1 | 
            +
            require 'rom/event_store/connection'
         | 
| 2 | 
            +
            require 'rom/event_store/dataset'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module ROM
         | 
| 5 | 
            +
              module EventStore
         | 
| 6 | 
            +
                class Repository < ROM::Repository
         | 
| 7 | 
            +
                  def initialize(uri)
         | 
| 8 | 
            +
                    @connection = Connection.new(uri)
         | 
| 9 | 
            +
                    @categories = {}
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  def [](name)
         | 
| 13 | 
            +
                    @categories[name]
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  def dataset(name)
         | 
| 17 | 
            +
                    @categories[name] = Dataset.new(name, connection)
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  def dataset?(name)
         | 
| 21 | 
            +
                    @categories.key?(name)
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
            end
         | 
    
        data/lib/rom/event_store.rb
    CHANGED
    
    | @@ -1,7 +1,8 @@ | |
| 1 | 
            +
            require 'rom'
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require 'rom/event_store/version'
         | 
| 4 | 
            +
            require 'rom/event_store/repository'
         | 
| 5 | 
            +
            require 'rom/event_store/relation'
         | 
| 6 | 
            +
            require 'rom/event_store/commands'
         | 
| 2 7 |  | 
| 3 | 
            -
             | 
| 4 | 
            -
              module EventStore
         | 
| 5 | 
            -
                # Your code goes here...
         | 
| 6 | 
            -
              end
         | 
| 7 | 
            -
            end
         | 
| 8 | 
            +
            ROM.register_adapter(:event_store, ROM::EventStore)
         | 
    
        data/rom-event_store.gemspec
    CHANGED
    
    | @@ -19,7 +19,9 @@ Gem::Specification.new do |spec| | |
| 19 19 | 
             
              spec.executables   = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
         | 
| 20 20 | 
             
              spec.require_paths = ['lib']
         | 
| 21 21 |  | 
| 22 | 
            +
              spec.add_dependency 'inflecto', '~> 0.0.2'
         | 
| 22 23 | 
             
              spec.add_runtime_dependency 'rom', '~> 0.6'
         | 
| 24 | 
            +
              spec.add_runtime_dependency 'transproc', '~> 0.1', '>= 0.1.2'
         | 
| 23 25 |  | 
| 24 26 | 
             
              spec.add_development_dependency 'bundler'
         | 
| 25 27 | 
             
              spec.add_development_dependency 'rake'
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: rom-event_store
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0. | 
| 4 | 
            +
              version: 0.0.2
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Héctor Ramón
         | 
| @@ -9,8 +9,22 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: exe
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2015-03- | 
| 12 | 
            +
            date: 2015-03-31 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 15 | 
            +
              name: inflecto
         | 
| 16 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 17 | 
            +
                requirements:
         | 
| 18 | 
            +
                - - "~>"
         | 
| 19 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 20 | 
            +
                    version: 0.0.2
         | 
| 21 | 
            +
              type: :runtime
         | 
| 22 | 
            +
              prerelease: false
         | 
| 23 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 24 | 
            +
                requirements:
         | 
| 25 | 
            +
                - - "~>"
         | 
| 26 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 27 | 
            +
                    version: 0.0.2
         | 
| 14 28 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 29 | 
             
              name: rom
         | 
| 16 30 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -25,6 +39,26 @@ dependencies: | |
| 25 39 | 
             
                - - "~>"
         | 
| 26 40 | 
             
                  - !ruby/object:Gem::Version
         | 
| 27 41 | 
             
                    version: '0.6'
         | 
| 42 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 43 | 
            +
              name: transproc
         | 
| 44 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 45 | 
            +
                requirements:
         | 
| 46 | 
            +
                - - "~>"
         | 
| 47 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 48 | 
            +
                    version: '0.1'
         | 
| 49 | 
            +
                - - ">="
         | 
| 50 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 51 | 
            +
                    version: 0.1.2
         | 
| 52 | 
            +
              type: :runtime
         | 
| 53 | 
            +
              prerelease: false
         | 
| 54 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 55 | 
            +
                requirements:
         | 
| 56 | 
            +
                - - "~>"
         | 
| 57 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 58 | 
            +
                    version: '0.1'
         | 
| 59 | 
            +
                - - ">="
         | 
| 60 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            +
                    version: 0.1.2
         | 
| 28 62 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 29 63 | 
             
              name: bundler
         | 
| 30 64 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -84,6 +118,11 @@ files: | |
| 84 118 | 
             
            - README.md
         | 
| 85 119 | 
             
            - Rakefile
         | 
| 86 120 | 
             
            - lib/rom/event_store.rb
         | 
| 121 | 
            +
            - lib/rom/event_store/commands.rb
         | 
| 122 | 
            +
            - lib/rom/event_store/connection.rb
         | 
| 123 | 
            +
            - lib/rom/event_store/dataset.rb
         | 
| 124 | 
            +
            - lib/rom/event_store/relation.rb
         | 
| 125 | 
            +
            - lib/rom/event_store/repository.rb
         | 
| 87 126 | 
             
            - lib/rom/event_store/version.rb
         | 
| 88 127 | 
             
            - rom-event_store.gemspec
         | 
| 89 128 | 
             
            homepage: https://github.com/rom-eventstore/rom-event_store
         |