soar-registry-directory 0.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 +7 -0
 - data/README.md +82 -0
 - data/lib/soar/registry/directory/error.rb +9 -0
 - data/lib/soar/registry/directory/model.rb +54 -0
 - data/lib/soar/registry/directory/provider/dynamo_db.rb +118 -0
 - data/lib/soar/registry/directory/provider/stub.rb +73 -0
 - data/lib/soar/registry/directory/test/fixtures/entries.json +60 -0
 - data/lib/soar/registry/directory/test/fixtures/table_structure.json +63 -0
 - data/lib/soar/registry/directory/test/orchestrator.rb +67 -0
 - data/lib/soar/registry/directory/test/provider/dynamo_db.rb +89 -0
 - data/lib/soar/registry/directory/test/provider/stub.rb +81 -0
 - data/lib/soar/registry/directory.rb +11 -0
 - metadata +142 -0
 
    
        checksums.yaml
    ADDED
    
    | 
         @@ -0,0 +1,7 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            SHA1:
         
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 74f2f96f3112e94b32dbdf1df3158d4a7c90c243
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: bc374da550aeac5dfb1141a3e306aa6d3c2e0bbc
         
     | 
| 
      
 5 
     | 
    
         
            +
            SHA512:
         
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: c685cac5ebf8519e8115d4f3fbb96860c3221caf1f01a4f60600e4700201f9effc54bd73cbe4fb80b1d0c8f493526f556ca59c720fd28f8db8260e81b01f2401
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 598ec60e756b7a7d185d679632c7ea1649fee116d6e78d7792956ff1c824a277790fa9fedd9d3fe45dbe6e8fe33517549dacc0da999211ae42248c3eaa652f03
         
     | 
    
        data/README.md
    ADDED
    
    | 
         @@ -0,0 +1,82 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Soar::Registry::Directory
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            Directory model and providers used by soar registries
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            ## Quick start
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            ### Example data
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            ```json
         
     | 
| 
      
 10 
     | 
    
         
            +
            "mytable": [{
         
     | 
| 
      
 11 
     | 
    
         
            +
              "uuid": "1",
         
     | 
| 
      
 12 
     | 
    
         
            +
              "email": "test1@example.com"
         
     | 
| 
      
 13 
     | 
    
         
            +
            }, {
         
     | 
| 
      
 14 
     | 
    
         
            +
              "uuid": "2",
         
     | 
| 
      
 15 
     | 
    
         
            +
              "email": "test2@example.com"
         
     | 
| 
      
 16 
     | 
    
         
            +
            }]
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
            ```
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            ### Stub provider
         
     | 
| 
      
 21 
     | 
    
         
            +
            Create an instance of the stub provider by passing in the name, primary key and indexes of your table.
         
     | 
| 
      
 22 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 23 
     | 
    
         
            +
            > require 'soar/registry/directory'
         
     | 
| 
      
 24 
     | 
    
         
            +
            > provider = Soar::Registry::Directory::Provider::Stub.new({
         
     | 
| 
      
 25 
     | 
    
         
            +
                table: "mytable",
         
     | 
| 
      
 26 
     | 
    
         
            +
                primary_key: "uuid",
         
     | 
| 
      
 27 
     | 
    
         
            +
                index: ["uuid", "email"] 
         
     | 
| 
      
 28 
     | 
    
         
            +
            })
         
     | 
| 
      
 29 
     | 
    
         
            +
            ```
         
     | 
| 
      
 30 
     | 
    
         
            +
            ### DynamodDb Provider
         
     | 
| 
      
 31 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 32 
     | 
    
         
            +
            > provider = Soar::Registry::Directory::Provider::DynamoDb.new({
         
     | 
| 
      
 33 
     | 
    
         
            +
                credentials: {
         
     | 
| 
      
 34 
     | 
    
         
            +
                    username: "username",
         
     | 
| 
      
 35 
     | 
    
         
            +
                    password: "secret"
         
     | 
| 
      
 36 
     | 
    
         
            +
                },
         
     | 
| 
      
 37 
     | 
    
         
            +
                table: "mytable",
         
     | 
| 
      
 38 
     | 
    
         
            +
                index: ['uuid', 'email'],
         
     | 
| 
      
 39 
     | 
    
         
            +
                primary_key: "uuid",
         
     | 
| 
      
 40 
     | 
    
         
            +
                configuration: {
         
     | 
| 
      
 41 
     | 
    
         
            +
                    region: 'us-west-2'
         
     | 
| 
      
 42 
     | 
    
         
            +
                    endpoint: 'http://localhost:8000'
         
     | 
| 
      
 43 
     | 
    
         
            +
                }
         
     | 
| 
      
 44 
     | 
    
         
            +
            })
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
            ```
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
            ### The Model
         
     | 
| 
      
 49 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 50 
     | 
    
         
            +
            > directory = Soar::Registry::Directory.new(provider: provider)
         
     | 
| 
      
 51 
     | 
    
         
            +
            ```
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
            ## Tests
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
            ### Stub provider
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
            #### Local
         
     | 
| 
      
 58 
     | 
    
         
            +
            ```bash
         
     | 
| 
      
 59 
     | 
    
         
            +
            $ cucumber
         
     | 
| 
      
 60 
     | 
    
         
            +
            ```
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
            #### CI
         
     | 
| 
      
 63 
     | 
    
         
            +
            ```bash
         
     | 
| 
      
 64 
     | 
    
         
            +
            docker-compose --file docker-compose.stub.yml up --abort-on-container-exit --remove-orphans --build --force-recreate
         
     | 
| 
      
 65 
     | 
    
         
            +
            EXIT_CODE=$(docker ps -a -f "name=soar-registry-directory-test-provider-stub" -q | xargs docker inspect -f "{{ .State.ExitCode }}")
         
     | 
| 
      
 66 
     | 
    
         
            +
            exit $EXIT_CODE 
         
     | 
| 
      
 67 
     | 
    
         
            +
            ```
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
            ### DynamoDb provider
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
            #### Local
         
     | 
| 
      
 72 
     | 
    
         
            +
            ```bash
         
     | 
| 
      
 73 
     | 
    
         
            +
            $ docker-compose --file docker-compose.dynamo_db.yml up
         
     | 
| 
      
 74 
     | 
    
         
            +
            $ CONFIG_FILE=config.dynamo_db.yml TEST_PROVIDER=DynamoDb cucumber
         
     | 
| 
      
 75 
     | 
    
         
            +
            ```
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
            #### CI
         
     | 
| 
      
 78 
     | 
    
         
            +
            ```bash
         
     | 
| 
      
 79 
     | 
    
         
            +
            docker-compose --file docker-compose.ci.dynamo_db.yml up --abort-on-container-exit --remove-orphans --build --force-recreate
         
     | 
| 
      
 80 
     | 
    
         
            +
            EXIT_CODE=$(docker ps -a -f "name=soar-registry-directory-test-provider-dynamo_db" -q | xargs docker inspect -f "{{ .State.ExitCode }}")
         
     | 
| 
      
 81 
     | 
    
         
            +
            exit $EXIT_CODE 
         
     | 
| 
      
 82 
     | 
    
         
            +
            ```
         
     | 
| 
         @@ -0,0 +1,54 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'soar/registry/directory/error'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'soar/registry/directory/provider/stub'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'soar/registry/directory/provider/dynamo_db'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            module Soar
         
     | 
| 
      
 6 
     | 
    
         
            +
              module Registry
         
     | 
| 
      
 7 
     | 
    
         
            +
                module Directory
         
     | 
| 
      
 8 
     | 
    
         
            +
                  class Model 
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                    attr_reader :provider
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                    ##
         
     | 
| 
      
 13 
     | 
    
         
            +
                    # @param provider [Soar::Registry::Directory::Provider::Stub|Soar::Registry::Directory::Provider::DynamoDb] object
         
     | 
| 
      
 14 
     | 
    
         
            +
                    ##
         
     | 
| 
      
 15 
     | 
    
         
            +
                    def initialize(provider: nil)
         
     | 
| 
      
 16 
     | 
    
         
            +
                      @provider = provider
         
     | 
| 
      
 17 
     | 
    
         
            +
                    end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                    ##
         
     | 
| 
      
 20 
     | 
    
         
            +
                    # @param entity [Hash]
         
     | 
| 
      
 21 
     | 
    
         
            +
                    ##
         
     | 
| 
      
 22 
     | 
    
         
            +
                    def put(entity)
         
     | 
| 
      
 23 
     | 
    
         
            +
                      @provider.put(entity)
         
     | 
| 
      
 24 
     | 
    
         
            +
                    end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                    ##
         
     | 
| 
      
 27 
     | 
    
         
            +
                    # @param primary_key [String] 
         
     | 
| 
      
 28 
     | 
    
         
            +
                    # @return [Hash] the identity
         
     | 
| 
      
 29 
     | 
    
         
            +
                    # @raise [Soar::Registry:::Directory::Error::NoEntriesFound] if primary key not found
         
     | 
| 
      
 30 
     | 
    
         
            +
                    ##
         
     | 
| 
      
 31 
     | 
    
         
            +
                    def fetch(primary_key)
         
     | 
| 
      
 32 
     | 
    
         
            +
                      @provider.fetch(primary_key)
         
     | 
| 
      
 33 
     | 
    
         
            +
                    end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                    ##
         
     | 
| 
      
 36 
     | 
    
         
            +
                    # @param key [String] attribute name
         
     | 
| 
      
 37 
     | 
    
         
            +
                    # @param value [String] attribute value
         
     | 
| 
      
 38 
     | 
    
         
            +
                    # @return [Array] list of entries
         
     | 
| 
      
 39 
     | 
    
         
            +
                    ##
         
     | 
| 
      
 40 
     | 
    
         
            +
                    def search(key, value)
         
     | 
| 
      
 41 
     | 
    
         
            +
                      @provider.search(key, value)
         
     | 
| 
      
 42 
     | 
    
         
            +
                    end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                    ##
         
     | 
| 
      
 45 
     | 
    
         
            +
                    # @return [Array] a list of primary keys and global secondary indexes
         
     | 
| 
      
 46 
     | 
    
         
            +
                    ##
         
     | 
| 
      
 47 
     | 
    
         
            +
                    def index
         
     | 
| 
      
 48 
     | 
    
         
            +
                      @provider.index
         
     | 
| 
      
 49 
     | 
    
         
            +
                    end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                  end
         
     | 
| 
      
 52 
     | 
    
         
            +
                end
         
     | 
| 
      
 53 
     | 
    
         
            +
              end
         
     | 
| 
      
 54 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,118 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'aws-sdk'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'hashie'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'soar/registry/directory/error'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            module Soar
         
     | 
| 
      
 6 
     | 
    
         
            +
              module Registry
         
     | 
| 
      
 7 
     | 
    
         
            +
                module Directory
         
     | 
| 
      
 8 
     | 
    
         
            +
                  module Provider
         
     | 
| 
      
 9 
     | 
    
         
            +
                    class DynamoDb 
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                      LIMIT = 10
         
     | 
| 
      
 12 
     | 
    
         
            +
                      attr_reader :client
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                      ##
         
     | 
| 
      
 15 
     | 
    
         
            +
                      # @param credentials [Hash] { username: 'username', password: 'secret'}
         
     | 
| 
      
 16 
     | 
    
         
            +
                      # @param table [String]
         
     | 
| 
      
 17 
     | 
    
         
            +
                      # @param primary_key [String]
         
     | 
| 
      
 18 
     | 
    
         
            +
                      # @param index [Array] primary key should be the first item
         
     | 
| 
      
 19 
     | 
    
         
            +
                      # @param configuration [Hash] { region: 'us-west-2', endpoint: 'http://localhost:8000' }
         
     | 
| 
      
 20 
     | 
    
         
            +
                      ##
         
     | 
| 
      
 21 
     | 
    
         
            +
                      def initialize(credentials: nil, table: nil, primary_key: nil, index: nil, configuration: nil)
         
     | 
| 
      
 22 
     | 
    
         
            +
                        @table_name = table
         
     | 
| 
      
 23 
     | 
    
         
            +
                        @primary_key = primary_key
         
     | 
| 
      
 24 
     | 
    
         
            +
                        @index = index
         
     | 
| 
      
 25 
     | 
    
         
            +
                        @credentials = Hashie.symbolize_keys(credentials)
         
     | 
| 
      
 26 
     | 
    
         
            +
                        configuration[:credentials] = Aws::Credentials.new(@credentials[:username], @credentials[:password])
         
     | 
| 
      
 27 
     | 
    
         
            +
                        @client = Aws::DynamoDB::Client.new(Hashie.symbolize_keys(configuration))
         
     | 
| 
      
 28 
     | 
    
         
            +
                      end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                      ##
         
     | 
| 
      
 31 
     | 
    
         
            +
                      ##
         
     | 
| 
      
 32 
     | 
    
         
            +
                      def put(entity)
         
     | 
| 
      
 33 
     | 
    
         
            +
                        @client.put_item({
         
     | 
| 
      
 34 
     | 
    
         
            +
                          table_name: @table_name,
         
     | 
| 
      
 35 
     | 
    
         
            +
                          item: entity
         
     | 
| 
      
 36 
     | 
    
         
            +
                        })
         
     | 
| 
      
 37 
     | 
    
         
            +
                      end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                      ##
         
     | 
| 
      
 40 
     | 
    
         
            +
                      # @param [String] identity_id primary key of the identity
         
     | 
| 
      
 41 
     | 
    
         
            +
                      # @return [Hash] the identity
         
     | 
| 
      
 42 
     | 
    
         
            +
                      # @raise [Soar::Registry::Staff::Directory::DynamoDb::Error::UniqueIdentifierNotFoundError] if primary key not found
         
     | 
| 
      
 43 
     | 
    
         
            +
                      ##
         
     | 
| 
      
 44 
     | 
    
         
            +
                      def fetch(primary_key)
         
     | 
| 
      
 45 
     | 
    
         
            +
                        options = {
         
     | 
| 
      
 46 
     | 
    
         
            +
                          table_name: @table_name,
         
     | 
| 
      
 47 
     | 
    
         
            +
                          key: {
         
     | 
| 
      
 48 
     | 
    
         
            +
                            "#{@primary_key}": primary_key
         
     | 
| 
      
 49 
     | 
    
         
            +
                          }
         
     | 
| 
      
 50 
     | 
    
         
            +
                        }
         
     | 
| 
      
 51 
     | 
    
         
            +
                        identity = @client.get_item(options)
         
     | 
| 
      
 52 
     | 
    
         
            +
                        raise Soar::Registry::Directory::Error::NoEntriesFound if identity.item.nil?
         
     | 
| 
      
 53 
     | 
    
         
            +
                        identity.item
         
     | 
| 
      
 54 
     | 
    
         
            +
                      end
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
                      ##
         
     | 
| 
      
 57 
     | 
    
         
            +
                      # @param [String] identifier_attribute 
         
     | 
| 
      
 58 
     | 
    
         
            +
                      # @param [String] identifier_value
         
     | 
| 
      
 59 
     | 
    
         
            +
                      # @return [Array] list of identities
         
     | 
| 
      
 60 
     | 
    
         
            +
                      # @raise [ArgumentError] if query or index is not specified
         
     | 
| 
      
 61 
     | 
    
         
            +
                      ##
         
     | 
| 
      
 62 
     | 
    
         
            +
                      def search(key, value)
         
     | 
| 
      
 63 
     | 
    
         
            +
                        options = {
         
     | 
| 
      
 64 
     | 
    
         
            +
                          table_name: @table_name,
         
     | 
| 
      
 65 
     | 
    
         
            +
                          select: 'ALL_ATTRIBUTES',
         
     | 
| 
      
 66 
     | 
    
         
            +
                          limit: LIMIT,
         
     | 
| 
      
 67 
     | 
    
         
            +
                          key_condition_expression: "#{key} = :value",
         
     | 
| 
      
 68 
     | 
    
         
            +
                          expression_attribute_values: {
         
     | 
| 
      
 69 
     | 
    
         
            +
                            ":value": value 
         
     | 
| 
      
 70 
     | 
    
         
            +
                          }
         
     | 
| 
      
 71 
     | 
    
         
            +
                        }
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
                        options.merge!({index_name: "#{key}_index"}) if @index.include?(key)
         
     | 
| 
      
 74 
     | 
    
         
            +
                        identity = @client.query(options)
         
     | 
| 
      
 75 
     | 
    
         
            +
                        identity.items.map { |item| 
         
     | 
| 
      
 76 
     | 
    
         
            +
                          Hashie.stringify_keys(item)
         
     | 
| 
      
 77 
     | 
    
         
            +
                        }
         
     | 
| 
      
 78 
     | 
    
         
            +
                      end
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
                      ##
         
     | 
| 
      
 81 
     | 
    
         
            +
                      # @return [Array] a list of primary keys and global secondary indexes
         
     | 
| 
      
 82 
     | 
    
         
            +
                      ##
         
     | 
| 
      
 83 
     | 
    
         
            +
                      def index
         
     | 
| 
      
 84 
     | 
    
         
            +
                        resp = @client.describe_table({
         
     | 
| 
      
 85 
     | 
    
         
            +
                          table_name: @table_name
         
     | 
| 
      
 86 
     | 
    
         
            +
                        })
         
     | 
| 
      
 87 
     | 
    
         
            +
                        indexed_attributes = []
         
     | 
| 
      
 88 
     | 
    
         
            +
                        resp['table']['key_schema'].each { |key_schema|
         
     | 
| 
      
 89 
     | 
    
         
            +
                          indexed_attributes << key_schema['attribute_name']
         
     | 
| 
      
 90 
     | 
    
         
            +
                        }
         
     | 
| 
      
 91 
     | 
    
         
            +
                        resp['table']['global_secondary_indexes'].each { |index| 
         
     | 
| 
      
 92 
     | 
    
         
            +
                          index['key_schema'].each { |key_schema| 
         
     | 
| 
      
 93 
     | 
    
         
            +
                            indexed_attributes << key_schema['attribute_name']
         
     | 
| 
      
 94 
     | 
    
         
            +
                          }
         
     | 
| 
      
 95 
     | 
    
         
            +
                        }
         
     | 
| 
      
 96 
     | 
    
         
            +
                        indexed_attributes
         
     | 
| 
      
 97 
     | 
    
         
            +
                      end
         
     | 
| 
      
 98 
     | 
    
         
            +
             
     | 
| 
      
 99 
     | 
    
         
            +
                      ##
         
     | 
| 
      
 100 
     | 
    
         
            +
                      # Deletes existing table and creates a new one in its place
         
     | 
| 
      
 101 
     | 
    
         
            +
                      # @param name [String] table name
         
     | 
| 
      
 102 
     | 
    
         
            +
                      # @param structure [Hash] table structure
         
     | 
| 
      
 103 
     | 
    
         
            +
                      ##
         
     | 
| 
      
 104 
     | 
    
         
            +
                      def recreate_table(name: nil, structure: nil)
         
     | 
| 
      
 105 
     | 
    
         
            +
             
     | 
| 
      
 106 
     | 
    
         
            +
                        if @client.list_tables.table_names.include?(name) 
         
     | 
| 
      
 107 
     | 
    
         
            +
                          @client.delete_table({
         
     | 
| 
      
 108 
     | 
    
         
            +
                            table_name: name
         
     | 
| 
      
 109 
     | 
    
         
            +
                          })
         
     | 
| 
      
 110 
     | 
    
         
            +
                        end
         
     | 
| 
      
 111 
     | 
    
         
            +
                        @client.create_table(Hashie.symbolize_keys(structure))
         
     | 
| 
      
 112 
     | 
    
         
            +
                      end
         
     | 
| 
      
 113 
     | 
    
         
            +
             
     | 
| 
      
 114 
     | 
    
         
            +
                    end
         
     | 
| 
      
 115 
     | 
    
         
            +
                  end
         
     | 
| 
      
 116 
     | 
    
         
            +
                end
         
     | 
| 
      
 117 
     | 
    
         
            +
              end
         
     | 
| 
      
 118 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,73 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'soar/registry/directory/error'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'hashie'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'mince'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'hashy_db'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            module Soar
         
     | 
| 
      
 7 
     | 
    
         
            +
              module Registry
         
     | 
| 
      
 8 
     | 
    
         
            +
                module Directory
         
     | 
| 
      
 9 
     | 
    
         
            +
                  module Provider
         
     | 
| 
      
 10 
     | 
    
         
            +
                    class Stub
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                      @@interface = Mince::HashyDb::Interface
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                      ##
         
     | 
| 
      
 15 
     | 
    
         
            +
                      # @param table [String] table name
         
     | 
| 
      
 16 
     | 
    
         
            +
                      # @param primary_key [String]
         
     | 
| 
      
 17 
     | 
    
         
            +
                      # @param index [Array] primary key should be the first item 
         
     | 
| 
      
 18 
     | 
    
         
            +
                      ##
         
     | 
| 
      
 19 
     | 
    
         
            +
                      def initialize(table: nil, primary_key: nil, index: nil)
         
     | 
| 
      
 20 
     | 
    
         
            +
                        @table = table
         
     | 
| 
      
 21 
     | 
    
         
            +
                        @primary_key = primary_key
         
     | 
| 
      
 22 
     | 
    
         
            +
                        @index = index
         
     | 
| 
      
 23 
     | 
    
         
            +
                        @@interface.clear
         
     | 
| 
      
 24 
     | 
    
         
            +
                      end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                      ##
         
     | 
| 
      
 27 
     | 
    
         
            +
                      # @param entity [Hash]
         
     | 
| 
      
 28 
     | 
    
         
            +
                      ##
         
     | 
| 
      
 29 
     | 
    
         
            +
                      def put(entity)
         
     | 
| 
      
 30 
     | 
    
         
            +
                        @@interface.add(@table, entity)
         
     | 
| 
      
 31 
     | 
    
         
            +
                      end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                      ##
         
     | 
| 
      
 34 
     | 
    
         
            +
                      # @param uuid [String]
         
     | 
| 
      
 35 
     | 
    
         
            +
                      # @return entry [Hash] 
         
     | 
| 
      
 36 
     | 
    
         
            +
                      # @raise [Soar::Registry:::Directory::Error::NoEntriesFound] if primary key not found
         
     | 
| 
      
 37 
     | 
    
         
            +
                      ##
         
     | 
| 
      
 38 
     | 
    
         
            +
                      def fetch(primary_key)
         
     | 
| 
      
 39 
     | 
    
         
            +
                        entry = @@interface.get_for_key_with_value(@table, @primary_key, primary_key)
         
     | 
| 
      
 40 
     | 
    
         
            +
                        raise Soar::Registry::Directory::Error::NoEntriesFound if entry.nil?
         
     | 
| 
      
 41 
     | 
    
         
            +
                        entry
         
     | 
| 
      
 42 
     | 
    
         
            +
                      end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                      ##
         
     | 
| 
      
 45 
     | 
    
         
            +
                      # @param [String] identifier_attribute 
         
     | 
| 
      
 46 
     | 
    
         
            +
                      # @param [String] identifier_value
         
     | 
| 
      
 47 
     | 
    
         
            +
                      # @return [Array] list of identities
         
     | 
| 
      
 48 
     | 
    
         
            +
                      # @raise [ArgumentError] if query or index is not specified
         
     | 
| 
      
 49 
     | 
    
         
            +
                      ##
         
     | 
| 
      
 50 
     | 
    
         
            +
                      def search(key, value)
         
     | 
| 
      
 51 
     | 
    
         
            +
                        identities = []
         
     | 
| 
      
 52 
     | 
    
         
            +
                        @@interface.find_all(@table).each { |identity| 
         
     | 
| 
      
 53 
     | 
    
         
            +
                          if identity[key] == value
         
     | 
| 
      
 54 
     | 
    
         
            +
                            identities << identity
         
     | 
| 
      
 55 
     | 
    
         
            +
                          else
         
     | 
| 
      
 56 
     | 
    
         
            +
                            next
         
     | 
| 
      
 57 
     | 
    
         
            +
                          end
         
     | 
| 
      
 58 
     | 
    
         
            +
                        }
         
     | 
| 
      
 59 
     | 
    
         
            +
                        identities
         
     | 
| 
      
 60 
     | 
    
         
            +
                      end
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                      ##
         
     | 
| 
      
 63 
     | 
    
         
            +
                      # @return [Array] a list of primary keys and global secondary indexes
         
     | 
| 
      
 64 
     | 
    
         
            +
                      ##
         
     | 
| 
      
 65 
     | 
    
         
            +
                      def index
         
     | 
| 
      
 66 
     | 
    
         
            +
                        @index
         
     | 
| 
      
 67 
     | 
    
         
            +
                      end
         
     | 
| 
      
 68 
     | 
    
         
            +
                    end
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                  end
         
     | 
| 
      
 71 
     | 
    
         
            +
                end
         
     | 
| 
      
 72 
     | 
    
         
            +
              end
         
     | 
| 
      
 73 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,60 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            [
         
     | 
| 
      
 2 
     | 
    
         
            +
                {
         
     | 
| 
      
 3 
     | 
    
         
            +
                    "uuid": "identity-62936e70-1815-439b-bf89-8492855a7e6b",
         
     | 
| 
      
 4 
     | 
    
         
            +
                    "entity_id": "entity-2d931510-d99f-494a-8c67-87feb05e1594",
         
     | 
| 
      
 5 
     | 
    
         
            +
                    "email": "test+publisher@hetzner.co.za",
         
     | 
| 
      
 6 
     | 
    
         
            +
                    "roles": {
         
     | 
| 
      
 7 
     | 
    
         
            +
                        "staff": {
         
     | 
| 
      
 8 
     | 
    
         
            +
                            "department": "technical"
         
     | 
| 
      
 9 
     | 
    
         
            +
                        },
         
     | 
| 
      
 10 
     | 
    
         
            +
                        "configuration_publisher": {
         
     | 
| 
      
 11 
     | 
    
         
            +
                            "configuration_identifiers": ["*"]
         
     | 
| 
      
 12 
     | 
    
         
            +
                        }
         
     | 
| 
      
 13 
     | 
    
         
            +
                    }
         
     | 
| 
      
 14 
     | 
    
         
            +
                }, 
         
     | 
| 
      
 15 
     | 
    
         
            +
                {
         
     | 
| 
      
 16 
     | 
    
         
            +
                    "uuid": "identity-43353f18-8afe-11e6-ae22-56b6b6499611",
         
     | 
| 
      
 17 
     | 
    
         
            +
                    "entity_id": "entity-2d931510-d99f-494a-8c67-87feb05e1594",
         
     | 
| 
      
 18 
     | 
    
         
            +
                    "email": "test+consumer@hetzner.co.za",
         
     | 
| 
      
 19 
     | 
    
         
            +
                    "roles": {
         
     | 
| 
      
 20 
     | 
    
         
            +
                        "staff": {},
         
     | 
| 
      
 21 
     | 
    
         
            +
                        "configuration_consumer": {
         
     | 
| 
      
 22 
     | 
    
         
            +
                            "configuration_identifiers": ["*"]
         
     | 
| 
      
 23 
     | 
    
         
            +
                        }
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                    }
         
     | 
| 
      
 26 
     | 
    
         
            +
                }, 
         
     | 
| 
      
 27 
     | 
    
         
            +
                {
         
     | 
| 
      
 28 
     | 
    
         
            +
                    "uuid": "identity-820d5660-2204-4f7d-8c04-746313439b81",
         
     | 
| 
      
 29 
     | 
    
         
            +
                    "entity_id": "entity-bad85eb9-0713-4da7-8d36-07a8e4b00eab",
         
     | 
| 
      
 30 
     | 
    
         
            +
                    "email": "admin@hetzner.co.za",
         
     | 
| 
      
 31 
     | 
    
         
            +
                    "roles": {
         
     | 
| 
      
 32 
     | 
    
         
            +
                        "staff": {},
         
     | 
| 
      
 33 
     | 
    
         
            +
                        "configuration_publisher": {
         
     | 
| 
      
 34 
     | 
    
         
            +
                            "configuration_identifiers": ["*"]
         
     | 
| 
      
 35 
     | 
    
         
            +
                        },
         
     | 
| 
      
 36 
     | 
    
         
            +
                        "configuration_consumer": {
         
     | 
| 
      
 37 
     | 
    
         
            +
                            "configuration_identifiers": ["*"]
         
     | 
| 
      
 38 
     | 
    
         
            +
                        }
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                    },
         
     | 
| 
      
 41 
     | 
    
         
            +
                    "address": {
         
     | 
| 
      
 42 
     | 
    
         
            +
                        "detail": "Belvedere Office Park, Unit F",
         
     | 
| 
      
 43 
     | 
    
         
            +
                        "street": "Bella Rosa Street",
         
     | 
| 
      
 44 
     | 
    
         
            +
                        "suburb": "Tygervalley",
         
     | 
| 
      
 45 
     | 
    
         
            +
                        "city": "Durbanville",
         
     | 
| 
      
 46 
     | 
    
         
            +
                        "postal": "7550"
         
     | 
| 
      
 47 
     | 
    
         
            +
                    }
         
     | 
| 
      
 48 
     | 
    
         
            +
                },
         
     | 
| 
      
 49 
     | 
    
         
            +
                {
         
     | 
| 
      
 50 
     | 
    
         
            +
                    "uuid": "identity-1ff472a6-8df3-4f13-82c3-89fde26db3cf",
         
     | 
| 
      
 51 
     | 
    
         
            +
                    "entity_id": "entity-bad85eb9-0713-4da7-8d36-07a8e4b00eab",
         
     | 
| 
      
 52 
     | 
    
         
            +
                    "email": "none@example.com",
         
     | 
| 
      
 53 
     | 
    
         
            +
                    "client_nr": "C123456789",
         
     | 
| 
      
 54 
     | 
    
         
            +
                    "roles": {
         
     | 
| 
      
 55 
     | 
    
         
            +
                        "customer": {},
         
     | 
| 
      
 56 
     | 
    
         
            +
                        "reseller": {}
         
     | 
| 
      
 57 
     | 
    
         
            +
                    }
         
     | 
| 
      
 58 
     | 
    
         
            +
                }
         
     | 
| 
      
 59 
     | 
    
         
            +
            ]
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
         @@ -0,0 +1,63 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            {
         
     | 
| 
      
 2 
     | 
    
         
            +
                "table_name": "identities",
         
     | 
| 
      
 3 
     | 
    
         
            +
                "key_schema": [
         
     | 
| 
      
 4 
     | 
    
         
            +
                    {
         
     | 
| 
      
 5 
     | 
    
         
            +
                        "attribute_name": "uuid",
         
     | 
| 
      
 6 
     | 
    
         
            +
                        "key_type": "HASH" 
         
     | 
| 
      
 7 
     | 
    
         
            +
                    }
         
     | 
| 
      
 8 
     | 
    
         
            +
                ],
         
     | 
| 
      
 9 
     | 
    
         
            +
                "attribute_definitions": [
         
     | 
| 
      
 10 
     | 
    
         
            +
                    {
         
     | 
| 
      
 11 
     | 
    
         
            +
                        "attribute_name": "uuid",
         
     | 
| 
      
 12 
     | 
    
         
            +
                        "attribute_type": "S"
         
     | 
| 
      
 13 
     | 
    
         
            +
                    },
         
     | 
| 
      
 14 
     | 
    
         
            +
                    {
         
     | 
| 
      
 15 
     | 
    
         
            +
                        "attribute_name": "entity_id",
         
     | 
| 
      
 16 
     | 
    
         
            +
                        "attribute_type": "S"
         
     | 
| 
      
 17 
     | 
    
         
            +
                    },
         
     | 
| 
      
 18 
     | 
    
         
            +
                    {
         
     | 
| 
      
 19 
     | 
    
         
            +
                        "attribute_name": "email",
         
     | 
| 
      
 20 
     | 
    
         
            +
                        "attribute_type": "S"
         
     | 
| 
      
 21 
     | 
    
         
            +
                    }
         
     | 
| 
      
 22 
     | 
    
         
            +
                ],
         
     | 
| 
      
 23 
     | 
    
         
            +
                "global_secondary_indexes": [
         
     | 
| 
      
 24 
     | 
    
         
            +
                    {
         
     | 
| 
      
 25 
     | 
    
         
            +
                        "index_name": "email_index",
         
     | 
| 
      
 26 
     | 
    
         
            +
                        "key_schema": [
         
     | 
| 
      
 27 
     | 
    
         
            +
                        {
         
     | 
| 
      
 28 
     | 
    
         
            +
                            "attribute_name": "email",
         
     | 
| 
      
 29 
     | 
    
         
            +
                            "key_type": "HASH"
         
     | 
| 
      
 30 
     | 
    
         
            +
                        }
         
     | 
| 
      
 31 
     | 
    
         
            +
                        ],
         
     | 
| 
      
 32 
     | 
    
         
            +
                        "projection": {
         
     | 
| 
      
 33 
     | 
    
         
            +
                            "projection_type": "ALL"
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                        },
         
     | 
| 
      
 36 
     | 
    
         
            +
                        "provisioned_throughput": { 
         
     | 
| 
      
 37 
     | 
    
         
            +
                            "read_capacity_units": 10,
         
     | 
| 
      
 38 
     | 
    
         
            +
                            "write_capacity_units": 10
         
     | 
| 
      
 39 
     | 
    
         
            +
                        }
         
     | 
| 
      
 40 
     | 
    
         
            +
                    },
         
     | 
| 
      
 41 
     | 
    
         
            +
                    {
         
     | 
| 
      
 42 
     | 
    
         
            +
                        "index_name": "entity_id_index",
         
     | 
| 
      
 43 
     | 
    
         
            +
                        "key_schema": [
         
     | 
| 
      
 44 
     | 
    
         
            +
                        {
         
     | 
| 
      
 45 
     | 
    
         
            +
                            "attribute_name": "entity_id",
         
     | 
| 
      
 46 
     | 
    
         
            +
                            "key_type": "HASH"
         
     | 
| 
      
 47 
     | 
    
         
            +
                        }
         
     | 
| 
      
 48 
     | 
    
         
            +
                        ],
         
     | 
| 
      
 49 
     | 
    
         
            +
                        "projection": {
         
     | 
| 
      
 50 
     | 
    
         
            +
                            "projection_type": "ALL"
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
                        },
         
     | 
| 
      
 53 
     | 
    
         
            +
                        "provisioned_throughput": { 
         
     | 
| 
      
 54 
     | 
    
         
            +
                            "read_capacity_units": 10,
         
     | 
| 
      
 55 
     | 
    
         
            +
                            "write_capacity_units": 10
         
     | 
| 
      
 56 
     | 
    
         
            +
                        }
         
     | 
| 
      
 57 
     | 
    
         
            +
                    }
         
     | 
| 
      
 58 
     | 
    
         
            +
                ],
         
     | 
| 
      
 59 
     | 
    
         
            +
                "provisioned_throughput": { 
         
     | 
| 
      
 60 
     | 
    
         
            +
                    "read_capacity_units": 10,
         
     | 
| 
      
 61 
     | 
    
         
            +
                    "write_capacity_units": 10
         
     | 
| 
      
 62 
     | 
    
         
            +
                }
         
     | 
| 
      
 63 
     | 
    
         
            +
            }
         
     | 
| 
         @@ -0,0 +1,67 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'soar/registry/directory/test/provider/stub'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'soar/registry/directory/test/provider/dynamo_db'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            module Soar
         
     | 
| 
      
 5 
     | 
    
         
            +
              module Registry
         
     | 
| 
      
 6 
     | 
    
         
            +
                module Directory
         
     | 
| 
      
 7 
     | 
    
         
            +
                  module Test
         
     | 
| 
      
 8 
     | 
    
         
            +
                    class Orchestrator
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                      def initialize(provider)
         
     | 
| 
      
 11 
     | 
    
         
            +
                        raise ArgumentError if provider.nil?
         
     | 
| 
      
 12 
     | 
    
         
            +
                        @provider = provider
         
     | 
| 
      
 13 
     | 
    
         
            +
                      end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                      def given_existing_data
         
     | 
| 
      
 16 
     | 
    
         
            +
                        @provider.given_existing_data
         
     | 
| 
      
 17 
     | 
    
         
            +
                      end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                      def given_configured_directory
         
     | 
| 
      
 20 
     | 
    
         
            +
                        @provider.given_configured_directory
         
     | 
| 
      
 21 
     | 
    
         
            +
                      end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                      def put_entry
         
     | 
| 
      
 24 
     | 
    
         
            +
                        @provider.put_entry
         
     | 
| 
      
 25 
     | 
    
         
            +
                      end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                      def search_for_entry
         
     | 
| 
      
 28 
     | 
    
         
            +
                        @provider.search_for_entry
         
     | 
| 
      
 29 
     | 
    
         
            +
                      end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                      def fetch_entry
         
     | 
| 
      
 32 
     | 
    
         
            +
                        @provider.fetch_entry
         
     | 
| 
      
 33 
     | 
    
         
            +
                      end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                      def request_index
         
     | 
| 
      
 36 
     | 
    
         
            +
                        @provider.request_index
         
     | 
| 
      
 37 
     | 
    
         
            +
                      end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                      def persisted?
         
     | 
| 
      
 40 
     | 
    
         
            +
                        @provider.persisted?
         
     | 
| 
      
 41 
     | 
    
         
            +
                      end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                      def returned?
         
     | 
| 
      
 44 
     | 
    
         
            +
                        @provider.returned?
         
     | 
| 
      
 45 
     | 
    
         
            +
                      end
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                      def index?
         
     | 
| 
      
 48 
     | 
    
         
            +
                        @provider.index?
         
     | 
| 
      
 49 
     | 
    
         
            +
                      end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                      def single_entry?
         
     | 
| 
      
 52 
     | 
    
         
            +
                        @provider.single_entry?
         
     | 
| 
      
 53 
     | 
    
         
            +
                      end
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
                      def no_entries_found?
         
     | 
| 
      
 56 
     | 
    
         
            +
                        @provider.no_entries_found?
         
     | 
| 
      
 57 
     | 
    
         
            +
                      end
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                      def no_matching_entries?
         
     | 
| 
      
 60 
     | 
    
         
            +
                        @provider.no_matching_entries?
         
     | 
| 
      
 61 
     | 
    
         
            +
                      end
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
                    end
         
     | 
| 
      
 64 
     | 
    
         
            +
                  end
         
     | 
| 
      
 65 
     | 
    
         
            +
                end
         
     | 
| 
      
 66 
     | 
    
         
            +
              end
         
     | 
| 
      
 67 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,89 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'soar/registry/directory'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module Soar
         
     | 
| 
      
 4 
     | 
    
         
            +
              module Registry
         
     | 
| 
      
 5 
     | 
    
         
            +
                module Directory
         
     | 
| 
      
 6 
     | 
    
         
            +
                  module Test
         
     | 
| 
      
 7 
     | 
    
         
            +
                    module Provider
         
     | 
| 
      
 8 
     | 
    
         
            +
                      class DynamoDb
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                        def initialize
         
     | 
| 
      
 11 
     | 
    
         
            +
                          @configuration = YAML.load_file("config/#{ENV['CONFIG_FILE']}")
         
     | 
| 
      
 12 
     | 
    
         
            +
                          @table = @configuration['provider']['table']['name']
         
     | 
| 
      
 13 
     | 
    
         
            +
                          @index = @configuration['provider']['table']['index'] 
         
     | 
| 
      
 14 
     | 
    
         
            +
                          @entries = JSON.parse(File.read("lib/soar/registry/directory/test/fixtures/entries.json"))
         
     | 
| 
      
 15 
     | 
    
         
            +
                        end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                        def given_configured_directory
         
     | 
| 
      
 18 
     | 
    
         
            +
                          @directory = Soar::Registry::Directory.new({
         
     | 
| 
      
 19 
     | 
    
         
            +
                            provider: Soar::Registry::Directory::Provider::DynamoDb.new({
         
     | 
| 
      
 20 
     | 
    
         
            +
                              credentials: @configuration['provider']['credentials'], 
         
     | 
| 
      
 21 
     | 
    
         
            +
                              table: @table,
         
     | 
| 
      
 22 
     | 
    
         
            +
                              index: @index,
         
     | 
| 
      
 23 
     | 
    
         
            +
                              primary_key: @index[0],
         
     | 
| 
      
 24 
     | 
    
         
            +
                              configuration: @configuration['provider']['config']
         
     | 
| 
      
 25 
     | 
    
         
            +
                            })
         
     | 
| 
      
 26 
     | 
    
         
            +
                          })
         
     | 
| 
      
 27 
     | 
    
         
            +
                          @directory.provider.recreate_table({
         
     | 
| 
      
 28 
     | 
    
         
            +
                            name: @table, 
         
     | 
| 
      
 29 
     | 
    
         
            +
                            structure: JSON.parse(File.read("lib/soar/registry/directory/test/fixtures/table_structure.json"))
         
     | 
| 
      
 30 
     | 
    
         
            +
                          })
         
     | 
| 
      
 31 
     | 
    
         
            +
                        end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                        def given_existing_data
         
     | 
| 
      
 34 
     | 
    
         
            +
                          @entries.each{ |entry| 
         
     | 
| 
      
 35 
     | 
    
         
            +
                            @directory.put(entry)
         
     | 
| 
      
 36 
     | 
    
         
            +
                          }
         
     | 
| 
      
 37 
     | 
    
         
            +
                        end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                        def put_entry
         
     | 
| 
      
 40 
     | 
    
         
            +
                          @directory.put(@entries[0])
         
     | 
| 
      
 41 
     | 
    
         
            +
                        end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                        def search_for_entry
         
     | 
| 
      
 44 
     | 
    
         
            +
                          @result = @directory.search("email", @entries[0]['email'])
         
     | 
| 
      
 45 
     | 
    
         
            +
                        end
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                        def request_index
         
     | 
| 
      
 48 
     | 
    
         
            +
                          @result = @directory.index
         
     | 
| 
      
 49 
     | 
    
         
            +
                        end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                        def fetch_entry
         
     | 
| 
      
 52 
     | 
    
         
            +
                          begin
         
     | 
| 
      
 53 
     | 
    
         
            +
                            @result = @directory.fetch(@entries[0]['uuid'])
         
     | 
| 
      
 54 
     | 
    
         
            +
                          rescue Soar::Registry::Directory::Error::NoEntriesFound
         
     | 
| 
      
 55 
     | 
    
         
            +
                            @error = true
         
     | 
| 
      
 56 
     | 
    
         
            +
                          end
         
     | 
| 
      
 57 
     | 
    
         
            +
                        end
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                        def persisted?
         
     | 
| 
      
 60 
     | 
    
         
            +
                          @entries[0] == @directory.fetch(@entries[0]["uuid"])
         
     | 
| 
      
 61 
     | 
    
         
            +
                        end
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
                        def returned?
         
     | 
| 
      
 64 
     | 
    
         
            +
                          @result == [@entries[0]]
         
     | 
| 
      
 65 
     | 
    
         
            +
                        end
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                        def index?
         
     | 
| 
      
 68 
     | 
    
         
            +
                          @result == @index
         
     | 
| 
      
 69 
     | 
    
         
            +
                        end
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
                        def single_entry?
         
     | 
| 
      
 72 
     | 
    
         
            +
                          @result == @entries[0]
         
     | 
| 
      
 73 
     | 
    
         
            +
                        end
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
                        def no_entries_found?
         
     | 
| 
      
 76 
     | 
    
         
            +
                          @error
         
     | 
| 
      
 77 
     | 
    
         
            +
                        end
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
                        def no_matching_entries?
         
     | 
| 
      
 80 
     | 
    
         
            +
                          @result == []
         
     | 
| 
      
 81 
     | 
    
         
            +
                        end
         
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
      
 83 
     | 
    
         
            +
                      end
         
     | 
| 
      
 84 
     | 
    
         
            +
                    end
         
     | 
| 
      
 85 
     | 
    
         
            +
                  end
         
     | 
| 
      
 86 
     | 
    
         
            +
                end
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
              end
         
     | 
| 
      
 89 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,81 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'soar/registry/directory'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module Soar
         
     | 
| 
      
 4 
     | 
    
         
            +
              module Registry
         
     | 
| 
      
 5 
     | 
    
         
            +
                module Directory
         
     | 
| 
      
 6 
     | 
    
         
            +
                  module Test
         
     | 
| 
      
 7 
     | 
    
         
            +
                    module Provider
         
     | 
| 
      
 8 
     | 
    
         
            +
                      class Stub
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                        @@entry = {
         
     | 
| 
      
 11 
     | 
    
         
            +
                          "uuid" => SecureRandom.uuid,
         
     | 
| 
      
 12 
     | 
    
         
            +
                          "identifier" => SecureRandom.hex
         
     | 
| 
      
 13 
     | 
    
         
            +
                        }
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                        @@index = ["identity_id", "email", "entity_id"]
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                        def given_configured_directory
         
     | 
| 
      
 18 
     | 
    
         
            +
                          @directory = Soar::Registry::Directory.new({
         
     | 
| 
      
 19 
     | 
    
         
            +
                            provider: Soar::Registry::Directory::Provider::Stub.new({
         
     | 
| 
      
 20 
     | 
    
         
            +
                              table: "identities",
         
     | 
| 
      
 21 
     | 
    
         
            +
                              primary_key: "uuid",
         
     | 
| 
      
 22 
     | 
    
         
            +
                              index: @@index
         
     | 
| 
      
 23 
     | 
    
         
            +
                            })
         
     | 
| 
      
 24 
     | 
    
         
            +
                          })
         
     | 
| 
      
 25 
     | 
    
         
            +
                        end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                        def given_existing_data
         
     | 
| 
      
 28 
     | 
    
         
            +
                          @directory.put(@@entry)
         
     | 
| 
      
 29 
     | 
    
         
            +
                        end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                        def put_entry
         
     | 
| 
      
 32 
     | 
    
         
            +
                          @directory.put(@@entry)
         
     | 
| 
      
 33 
     | 
    
         
            +
                        end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                        def search_for_entry
         
     | 
| 
      
 36 
     | 
    
         
            +
                          @entry = @directory.search("identifier", @@entry['identifier'])
         
     | 
| 
      
 37 
     | 
    
         
            +
                        end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                        def request_index
         
     | 
| 
      
 40 
     | 
    
         
            +
                          @index = @directory.index
         
     | 
| 
      
 41 
     | 
    
         
            +
                        end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                        def fetch_entry
         
     | 
| 
      
 44 
     | 
    
         
            +
                          begin
         
     | 
| 
      
 45 
     | 
    
         
            +
                            @entry = @directory.fetch(@@entry['uuid'])
         
     | 
| 
      
 46 
     | 
    
         
            +
                          rescue Soar::Registry::Directory::Error::NoEntriesFound
         
     | 
| 
      
 47 
     | 
    
         
            +
                            @error = true
         
     | 
| 
      
 48 
     | 
    
         
            +
                          end
         
     | 
| 
      
 49 
     | 
    
         
            +
                        end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                        def persisted?
         
     | 
| 
      
 52 
     | 
    
         
            +
                          @@entry == @directory.fetch(@@entry["uuid"])
         
     | 
| 
      
 53 
     | 
    
         
            +
                        end
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
                        def returned?
         
     | 
| 
      
 56 
     | 
    
         
            +
                          @entry == [@@entry]
         
     | 
| 
      
 57 
     | 
    
         
            +
                        end
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                        def index?
         
     | 
| 
      
 60 
     | 
    
         
            +
                          @index == @@index
         
     | 
| 
      
 61 
     | 
    
         
            +
                        end
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
                        def single_entry?
         
     | 
| 
      
 64 
     | 
    
         
            +
                          @entry == @@entry
         
     | 
| 
      
 65 
     | 
    
         
            +
                        end
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                        def no_entries_found?
         
     | 
| 
      
 68 
     | 
    
         
            +
                          @error
         
     | 
| 
      
 69 
     | 
    
         
            +
                        end
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
                        def no_matching_entries?
         
     | 
| 
      
 72 
     | 
    
         
            +
                          @entry == []
         
     | 
| 
      
 73 
     | 
    
         
            +
                        end
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
                      end
         
     | 
| 
      
 76 
     | 
    
         
            +
                    end
         
     | 
| 
      
 77 
     | 
    
         
            +
                  end
         
     | 
| 
      
 78 
     | 
    
         
            +
                end
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
              end
         
     | 
| 
      
 81 
     | 
    
         
            +
            end
         
     | 
    
        metadata
    ADDED
    
    | 
         @@ -0,0 +1,142 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            --- !ruby/object:Gem::Specification
         
     | 
| 
      
 2 
     | 
    
         
            +
            name: soar-registry-directory
         
     | 
| 
      
 3 
     | 
    
         
            +
            version: !ruby/object:Gem::Version
         
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.0.1
         
     | 
| 
      
 5 
     | 
    
         
            +
            platform: ruby
         
     | 
| 
      
 6 
     | 
    
         
            +
            authors:
         
     | 
| 
      
 7 
     | 
    
         
            +
            - Charles Mulder
         
     | 
| 
      
 8 
     | 
    
         
            +
            autorequire: 
         
     | 
| 
      
 9 
     | 
    
         
            +
            bindir: bin
         
     | 
| 
      
 10 
     | 
    
         
            +
            cert_chain: []
         
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2016-11-30 00:00:00.000000000 Z
         
     | 
| 
      
 12 
     | 
    
         
            +
            dependencies:
         
     | 
| 
      
 13 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 14 
     | 
    
         
            +
              name: hashy_db
         
     | 
| 
      
 15 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 16 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 17 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 18 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 19 
     | 
    
         
            +
                    version: '2.1'
         
     | 
| 
      
 20 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 21 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 22 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 23 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 24 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 25 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 26 
     | 
    
         
            +
                    version: '2.1'
         
     | 
| 
      
 27 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 28 
     | 
    
         
            +
              name: mince
         
     | 
| 
      
 29 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 30 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 31 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 32 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 33 
     | 
    
         
            +
                    version: '2.3'
         
     | 
| 
      
 34 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 35 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 36 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 37 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 38 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 39 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 40 
     | 
    
         
            +
                    version: '2.3'
         
     | 
| 
      
 41 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 42 
     | 
    
         
            +
              name: aws-sdk
         
     | 
| 
      
 43 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 44 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 45 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 46 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 47 
     | 
    
         
            +
                    version: '2.6'
         
     | 
| 
      
 48 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 49 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 50 
     | 
    
         
            +
                    version: 2.6.6
         
     | 
| 
      
 51 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 52 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 53 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 54 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 55 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 56 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 57 
     | 
    
         
            +
                    version: '2.6'
         
     | 
| 
      
 58 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 59 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 60 
     | 
    
         
            +
                    version: 2.6.6
         
     | 
| 
      
 61 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 62 
     | 
    
         
            +
              name: aws-sdk-core
         
     | 
| 
      
 63 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 64 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 65 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 66 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 67 
     | 
    
         
            +
                    version: '2.6'
         
     | 
| 
      
 68 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 69 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 70 
     | 
    
         
            +
                    version: 2.6.28
         
     | 
| 
      
 71 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 72 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 73 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 74 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 75 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 76 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 77 
     | 
    
         
            +
                    version: '2.6'
         
     | 
| 
      
 78 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 79 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 80 
     | 
    
         
            +
                    version: 2.6.28
         
     | 
| 
      
 81 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 82 
     | 
    
         
            +
              name: hashie
         
     | 
| 
      
 83 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 84 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 85 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 86 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 87 
     | 
    
         
            +
                    version: '3.4'
         
     | 
| 
      
 88 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 89 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 90 
     | 
    
         
            +
                    version: 3.4.6
         
     | 
| 
      
 91 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 92 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 93 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 94 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 95 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 96 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 97 
     | 
    
         
            +
                    version: '3.4'
         
     | 
| 
      
 98 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 99 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 100 
     | 
    
         
            +
                    version: 3.4.6
         
     | 
| 
      
 101 
     | 
    
         
            +
            description: Directories for soar registries
         
     | 
| 
      
 102 
     | 
    
         
            +
            email: charles.mulder@hetzner.co.za
         
     | 
| 
      
 103 
     | 
    
         
            +
            executables: []
         
     | 
| 
      
 104 
     | 
    
         
            +
            extensions: []
         
     | 
| 
      
 105 
     | 
    
         
            +
            extra_rdoc_files: []
         
     | 
| 
      
 106 
     | 
    
         
            +
            files:
         
     | 
| 
      
 107 
     | 
    
         
            +
            - README.md
         
     | 
| 
      
 108 
     | 
    
         
            +
            - lib/soar/registry/directory.rb
         
     | 
| 
      
 109 
     | 
    
         
            +
            - lib/soar/registry/directory/error.rb
         
     | 
| 
      
 110 
     | 
    
         
            +
            - lib/soar/registry/directory/model.rb
         
     | 
| 
      
 111 
     | 
    
         
            +
            - lib/soar/registry/directory/provider/dynamo_db.rb
         
     | 
| 
      
 112 
     | 
    
         
            +
            - lib/soar/registry/directory/provider/stub.rb
         
     | 
| 
      
 113 
     | 
    
         
            +
            - lib/soar/registry/directory/test/fixtures/entries.json
         
     | 
| 
      
 114 
     | 
    
         
            +
            - lib/soar/registry/directory/test/fixtures/table_structure.json
         
     | 
| 
      
 115 
     | 
    
         
            +
            - lib/soar/registry/directory/test/orchestrator.rb
         
     | 
| 
      
 116 
     | 
    
         
            +
            - lib/soar/registry/directory/test/provider/dynamo_db.rb
         
     | 
| 
      
 117 
     | 
    
         
            +
            - lib/soar/registry/directory/test/provider/stub.rb
         
     | 
| 
      
 118 
     | 
    
         
            +
            homepage: https://gitlab.host-h.net/registries/directory
         
     | 
| 
      
 119 
     | 
    
         
            +
            licenses:
         
     | 
| 
      
 120 
     | 
    
         
            +
            - MIT
         
     | 
| 
      
 121 
     | 
    
         
            +
            metadata: {}
         
     | 
| 
      
 122 
     | 
    
         
            +
            post_install_message: 
         
     | 
| 
      
 123 
     | 
    
         
            +
            rdoc_options: []
         
     | 
| 
      
 124 
     | 
    
         
            +
            require_paths:
         
     | 
| 
      
 125 
     | 
    
         
            +
            - lib
         
     | 
| 
      
 126 
     | 
    
         
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         
     | 
| 
      
 127 
     | 
    
         
            +
              requirements:
         
     | 
| 
      
 128 
     | 
    
         
            +
              - - ">="
         
     | 
| 
      
 129 
     | 
    
         
            +
                - !ruby/object:Gem::Version
         
     | 
| 
      
 130 
     | 
    
         
            +
                  version: '0'
         
     | 
| 
      
 131 
     | 
    
         
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
      
 132 
     | 
    
         
            +
              requirements:
         
     | 
| 
      
 133 
     | 
    
         
            +
              - - ">="
         
     | 
| 
      
 134 
     | 
    
         
            +
                - !ruby/object:Gem::Version
         
     | 
| 
      
 135 
     | 
    
         
            +
                  version: '0'
         
     | 
| 
      
 136 
     | 
    
         
            +
            requirements: []
         
     | 
| 
      
 137 
     | 
    
         
            +
            rubyforge_project: 
         
     | 
| 
      
 138 
     | 
    
         
            +
            rubygems_version: 2.5.1
         
     | 
| 
      
 139 
     | 
    
         
            +
            signing_key: 
         
     | 
| 
      
 140 
     | 
    
         
            +
            specification_version: 4
         
     | 
| 
      
 141 
     | 
    
         
            +
            summary: Soar Registry Directory
         
     | 
| 
      
 142 
     | 
    
         
            +
            test_files: []
         
     |