pebbles-uid 0.0.8 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +20 -17
- data/lib/pebbles-uid.rb +26 -63
- data/lib/pebbles-uid/class_methods.rb +62 -0
- data/lib/pebbles-uid/query.rb +22 -22
- data/lib/pebbles-uid/version.rb +1 -1
- data/spec/query_spec.rb +16 -21
- data/spec/uid_spec.rb +19 -10
- metadata +4 -5
- data/lib/pebbles-uid/cache_key.rb +0 -13
- data/lib/pebbles-uid/parse.rb +0 -14
    
        data/README.md
    CHANGED
    
    | @@ -4,21 +4,21 @@ Handle unique identifiers in the Pebblestack universe conveniently. | |
| 4 4 |  | 
| 5 5 | 
             
            ## Unique Identifiers
         | 
| 6 6 |  | 
| 7 | 
            -
            A valid Uid is in the format `genus[. | 
| 7 | 
            +
            A valid Uid is in the format `genus[.epiteth]:path[$oid]`.
         | 
| 8 8 |  | 
| 9 | 
            -
            ###  | 
| 9 | 
            +
            ### Species
         | 
| 10 10 |  | 
| 11 | 
            -
            The  | 
| 11 | 
            +
            The species is one or more dot-delimited labels.
         | 
| 12 12 |  | 
| 13 | 
            -
            The first label uniquely identifies which pebble the resource originated from.
         | 
| 13 | 
            +
            The first label, the genus, uniquely identifies which pebble the resource originated from.
         | 
| 14 14 |  | 
| 15 | 
            -
            Any secondary labels are grouped into  | 
| 15 | 
            +
            Any secondary labels are grouped into an `epiteth`, which identify sub-types within a given pebble.
         | 
| 16 16 |  | 
| 17 17 | 
             
            ```
         | 
| 18 18 | 
             
            post.doc
         | 
| 19 19 | 
             
            ```
         | 
| 20 20 |  | 
| 21 | 
            -
            Here the genus is `post`, and the  | 
| 21 | 
            +
            Here the genus is `post`, and the epiteth is `doc`.
         | 
| 22 22 |  | 
| 23 23 | 
             
            ### Path
         | 
| 24 24 |  | 
| @@ -35,7 +35,7 @@ post.card:tourism.norway.west-coast$42 | |
| 35 35 |  | 
| 36 36 | 
             
            The object identifier can be nearly any string, including another uid.
         | 
| 37 37 |  | 
| 38 | 
            -
            The oid _MUST_ be unique for any  | 
| 38 | 
            +
            The oid _MUST_ be unique for any species and realm.
         | 
| 39 39 |  | 
| 40 40 | 
             
            There are currently two characters which cannot be included in an oid:
         | 
| 41 41 |  | 
| @@ -49,19 +49,19 @@ Oid is optional when creating a new resource. | |
| 49 49 |  | 
| 50 50 | 
             
            Across the pebblestack universe, you can query for a specific resource by passing a full Uid.
         | 
| 51 51 |  | 
| 52 | 
            -
            In addition, the wildcard query ` | 
| 52 | 
            +
            In addition, the wildcard query `species:realm.*$oid` will identify a single resource, e.g.:
         | 
| 53 53 |  | 
| 54 54 | 
             
            ```
         | 
| 55 55 | 
             
            post.card:tourism.*$42
         | 
| 56 56 | 
             
            ```
         | 
| 57 57 |  | 
| 58 | 
            -
            If a specific resource is targeted (i.e.  | 
| 58 | 
            +
            If a specific resource is targeted (i.e. species and oid are both unambiguous), then realm is required.
         | 
| 59 59 |  | 
| 60 60 | 
             
            ### For a collection of resources
         | 
| 61 61 |  | 
| 62 62 | 
             
            #### Asterisks
         | 
| 63 63 |  | 
| 64 | 
            -
            The most permissive query consists of any  | 
| 64 | 
            +
            The most permissive query consists of any species in any path, with any oid (implied):
         | 
| 65 65 |  | 
| 66 66 | 
             
            ```
         | 
| 67 67 | 
             
            *:*
         | 
| @@ -75,7 +75,7 @@ This is the equivalent to: | |
| 75 75 |  | 
| 76 76 | 
             
            Queries may not be made across multiple realms at one time. If realm is not specified in the path, then it is assumed that the application verifies realm if necessary.
         | 
| 77 77 |  | 
| 78 | 
            -
            In the context of a  | 
| 78 | 
            +
            In the context of a species or a path, you may specify any number of labels and terminate with an asterisk, which means: zero or more labels follow. E.g.:
         | 
| 79 79 |  | 
| 80 80 | 
             
            ```
         | 
| 81 81 | 
             
            post.*:tourism.europe.*
         | 
| @@ -99,7 +99,7 @@ In the context of an oid, you either know the oid you want, or you don't. A quer | |
| 99 99 |  | 
| 100 100 | 
             
            A pipe signifies _or_.
         | 
| 101 101 |  | 
| 102 | 
            -
            This can be used in  | 
| 102 | 
            +
            This can be used in species at any position:
         | 
| 103 103 |  | 
| 104 104 | 
             
            ```
         | 
| 105 105 | 
             
            unit|group:*
         | 
| @@ -139,7 +139,7 @@ NOTE: realm is required in this case, because each term in the list must refer t | |
| 139 139 |  | 
| 140 140 | 
             
            #### Caret
         | 
| 141 141 |  | 
| 142 | 
            -
            In both  | 
| 142 | 
            +
            In both species and paths, a caret indicates ancestry up to the specified point:
         | 
| 143 143 |  | 
| 144 144 | 
             
            ```
         | 
| 145 145 | 
             
            post:realm.europe.^norway.fjords.food
         | 
| @@ -178,10 +178,13 @@ uid = Pebbles::Uid.new('post.card:tourism.norway.fjords$1234') | |
| 178 178 | 
             
            uid.realm
         | 
| 179 179 | 
             
            => "tourism"
         | 
| 180 180 |  | 
| 181 | 
            -
            uid. | 
| 181 | 
            +
            uid.species
         | 
| 182 182 | 
             
            => "post.card"
         | 
| 183 183 |  | 
| 184 | 
            -
            uid. | 
| 184 | 
            +
            uid.genus
         | 
| 185 | 
            +
            => "post"
         | 
| 186 | 
            +
             | 
| 187 | 
            +
            uid.epiteth
         | 
| 185 188 | 
             
            => "card"
         | 
| 186 189 |  | 
| 187 190 | 
             
            uid.path
         | 
| @@ -194,7 +197,7 @@ uid.to_s | |
| 194 197 | 
             
            => 'post.card:tourism.norway.fjords$1234'
         | 
| 195 198 |  | 
| 196 199 | 
             
            uid.to_hash
         | 
| 197 | 
            -
            => {' | 
| 200 | 
            +
            => {'species_0' => 'post', 'species_1' => 'card', 'path_0' => 'tourism', 'path_1' => 'norway', 'path_2' => 'fjords', 'oid' => '1234'}
         | 
| 198 201 | 
             
            ```
         | 
| 199 202 |  | 
| 200 203 | 
             
            ### Uid Queries
         | 
| @@ -209,7 +212,7 @@ query.collection? | |
| 209 212 | 
             
            => true
         | 
| 210 213 |  | 
| 211 214 | 
             
            query.to_hash
         | 
| 212 | 
            -
            => {' | 
| 215 | 
            +
            => {'species_0' => 'post', 'species_1' => 'card', 'path_0' => 'tourism', 'path_1' => ['norway', nil], ['fjords', 'mountains', nil]}
         | 
| 213 216 | 
             
            ```
         | 
| 214 217 |  | 
| 215 218 | 
             
            ## TODO
         | 
    
        data/lib/pebbles-uid.rb
    CHANGED
    
    | @@ -1,8 +1,7 @@ | |
| 1 1 | 
             
            require "pebbles-uid/version"
         | 
| 2 2 |  | 
| 3 3 | 
             
            require 'pebbles-uid/wildcard'
         | 
| 4 | 
            -
            require 'pebbles-uid/ | 
| 5 | 
            -
            require 'pebbles-uid/cache_key'
         | 
| 4 | 
            +
            require 'pebbles-uid/class_methods'
         | 
| 6 5 | 
             
            require 'pebbles-uid/query'
         | 
| 7 6 | 
             
            require "pebbles-uid/conditions"
         | 
| 8 7 | 
             
            require "pebbles-uid/labels"
         | 
| @@ -11,56 +10,11 @@ require "pebbles-uid/oid" | |
| 11 10 | 
             
            module Pebbles
         | 
| 12 11 | 
             
              class Uid
         | 
| 13 12 |  | 
| 14 | 
            -
                 | 
| 15 | 
            -
             | 
| 16 | 
            -
                  def parse(s)
         | 
| 17 | 
            -
                    /^(?<genus>.*):(?<path>[^\$]*)\$?(?<oid>.*)$/ =~ s
         | 
| 18 | 
            -
                    [genus, path, oid.empty? ? nil : oid]
         | 
| 19 | 
            -
                  end
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                  def build(genus, path, oid)
         | 
| 22 | 
            -
                    s = "#{genus}:#{path}"
         | 
| 23 | 
            -
                    s << "$#{oid}" if oid
         | 
| 24 | 
            -
                    s
         | 
| 25 | 
            -
                  end
         | 
| 26 | 
            -
             | 
| 27 | 
            -
                  def query(s, options = {})
         | 
| 28 | 
            -
                    Pebbles::Uid::Query.new(s, options)
         | 
| 29 | 
            -
                  end
         | 
| 30 | 
            -
             | 
| 31 | 
            -
                  def genus(s)
         | 
| 32 | 
            -
                    parse(s)[0]
         | 
| 33 | 
            -
                  end
         | 
| 34 | 
            -
             | 
| 35 | 
            -
                  def path(s)
         | 
| 36 | 
            -
                    parse(s)[1]
         | 
| 37 | 
            -
                  end
         | 
| 38 | 
            -
             | 
| 39 | 
            -
                  def oid(s)
         | 
| 40 | 
            -
                    parse(s)[2]
         | 
| 41 | 
            -
                  end
         | 
| 42 | 
            -
             | 
| 43 | 
            -
                  def valid_path?(path)
         | 
| 44 | 
            -
                    return false if path.empty?
         | 
| 45 | 
            -
                    Labels.new(path).valid_with?(/^[a-z0-9_-]+$/)
         | 
| 46 | 
            -
                  end
         | 
| 47 | 
            -
             | 
| 48 | 
            -
                  def valid_genus?(genus)
         | 
| 49 | 
            -
                    return false if genus.empty?
         | 
| 50 | 
            -
                    Labels.new(genus).valid_with?(/^[a-z0-9_-]+$/)
         | 
| 51 | 
            -
                  end
         | 
| 52 | 
            -
             | 
| 53 | 
            -
                  def valid_oid?(oid)
         | 
| 54 | 
            -
                    return true if !oid || oid.empty?
         | 
| 55 | 
            -
                    !!(oid =~ /^[^,|]+$/)
         | 
| 56 | 
            -
                  end
         | 
| 57 | 
            -
                end
         | 
| 58 | 
            -
             | 
| 59 | 
            -
                attr_reader :genus, :path, :oid
         | 
| 13 | 
            +
                attr_reader :species, :path, :oid
         | 
| 60 14 | 
             
                def initialize(s)
         | 
| 61 | 
            -
                  @ | 
| 62 | 
            -
                  unless  | 
| 63 | 
            -
                    raise ArgumentError.new("Invalid Uid: #{s}.  | 
| 15 | 
            +
                  @species, @path, @oid = self.class.parse(s)
         | 
| 16 | 
            +
                  unless valid_species?
         | 
| 17 | 
            +
                    raise ArgumentError.new("Invalid Uid: #{s}. Species is invalid.")
         | 
| 64 18 | 
             
                  end
         | 
| 65 19 | 
             
                  unless valid_path?
         | 
| 66 20 | 
             
                    raise ArgumentError.new("Invalid Uid: #{s}. Path is invalid.")
         | 
| @@ -70,12 +24,21 @@ module Pebbles | |
| 70 24 | 
             
                    raise ArgumentError.new("Invalid Uid: #{s}. Cannot have wildcard oid.")
         | 
| 71 25 | 
             
                  end
         | 
| 72 26 |  | 
| 73 | 
            -
                  if  | 
| 74 | 
            -
                    raise ArgumentError.new("Invalid Uid: #{s}.  | 
| 27 | 
            +
                  if species.empty?
         | 
| 28 | 
            +
                    raise ArgumentError.new("Invalid Uid: #{s}. Species is required.")
         | 
| 75 29 | 
             
                  end
         | 
| 76 30 | 
             
                  if path.empty?
         | 
| 77 31 | 
             
                    raise ArgumentError.new("Invalid Uid: #{s}. Realm is required.")
         | 
| 78 32 | 
             
                  end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                def epiteth
         | 
| 37 | 
            +
                  @epiteth ||= species.split('.')[1..-1].join('.')
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                def genus
         | 
| 41 | 
            +
                  @genus ||= species.split('.').first
         | 
| 79 42 | 
             
                end
         | 
| 80 43 |  | 
| 81 44 | 
             
                def realm
         | 
| @@ -83,23 +46,23 @@ module Pebbles | |
| 83 46 | 
             
                end
         | 
| 84 47 |  | 
| 85 48 | 
             
                def species
         | 
| 86 | 
            -
                  @species ||=  | 
| 49 | 
            +
                  @species ||= species_labels.tail.join('.')
         | 
| 87 50 | 
             
                end
         | 
| 88 51 |  | 
| 89 52 | 
             
                def path_labels
         | 
| 90 53 | 
             
                  @path_labels ||= Labels.new(path, :name => 'path')
         | 
| 91 54 | 
             
                end
         | 
| 92 55 |  | 
| 93 | 
            -
                def  | 
| 94 | 
            -
                  @ | 
| 56 | 
            +
                def species_labels
         | 
| 57 | 
            +
                  @species_labels ||= Labels.new(species, :name => 'species')
         | 
| 95 58 | 
             
                end
         | 
| 96 59 |  | 
| 97 60 | 
             
                def valid?
         | 
| 98 | 
            -
                   | 
| 61 | 
            +
                  valid_species? && valid_path? && valid_oid?
         | 
| 99 62 | 
             
                end
         | 
| 100 63 |  | 
| 101 | 
            -
                def  | 
| 102 | 
            -
                  self.class. | 
| 64 | 
            +
                def valid_species?
         | 
| 65 | 
            +
                  self.class.valid_species?(species)
         | 
| 103 66 | 
             
                end
         | 
| 104 67 |  | 
| 105 68 | 
             
                def valid_path?
         | 
| @@ -115,21 +78,21 @@ module Pebbles | |
| 115 78 | 
             
                end
         | 
| 116 79 |  | 
| 117 80 | 
             
                def to_s
         | 
| 118 | 
            -
                  Pebbles::Uid.build  | 
| 81 | 
            +
                  Pebbles::Uid.build species, path, oid
         | 
| 119 82 | 
             
                end
         | 
| 120 83 |  | 
| 121 84 | 
             
                def parsed
         | 
| 122 | 
            -
                  [ | 
| 85 | 
            +
                  [species, path, oid].compact
         | 
| 123 86 | 
             
                end
         | 
| 124 87 |  | 
| 125 88 | 
             
                def to_hash
         | 
| 126 | 
            -
                  hash =  | 
| 89 | 
            +
                  hash = species_labels.to_hash.merge(path_labels.to_hash)
         | 
| 127 90 | 
             
                  hash = hash.merge(:oid => oid) if oid?
         | 
| 128 91 | 
             
                  hash
         | 
| 129 92 | 
             
                end
         | 
| 130 93 |  | 
| 131 94 | 
             
                def cache_key
         | 
| 132 | 
            -
                  "#{ | 
| 95 | 
            +
                  "#{species}:#{realm}.*$#{oid}"
         | 
| 133 96 | 
             
                end
         | 
| 134 97 |  | 
| 135 98 | 
             
              end
         | 
| @@ -0,0 +1,62 @@ | |
| 1 | 
            +
            module Pebbles
         | 
| 2 | 
            +
              class Uid
         | 
| 3 | 
            +
                class << self
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                  def parse(s)
         | 
| 6 | 
            +
                    /^(?<species>.*):(?<path>[^\$]*)\$?(?<oid>.*)$/ =~ s
         | 
| 7 | 
            +
                    [species, path, oid.empty? ? nil : oid]
         | 
| 8 | 
            +
                  end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  def build(species, path, oid)
         | 
| 11 | 
            +
                    s = "#{species}:#{path}"
         | 
| 12 | 
            +
                    s << "$#{oid}" if oid
         | 
| 13 | 
            +
                    s
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  def query(s, options = {})
         | 
| 17 | 
            +
                    Pebbles::Uid::Query.new(s, options)
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  def cache_key(uid)
         | 
| 21 | 
            +
                    species, path, oid = parse(uid)
         | 
| 22 | 
            +
                    "#{species}:#{Labels.new(path).first}.*$#{oid}"
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                  def species(s)
         | 
| 26 | 
            +
                    parse(s)[0]
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                  def genus(s)
         | 
| 30 | 
            +
                    parse(s)[0].split('.').first
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                  def epiteth(s)
         | 
| 34 | 
            +
                    parse(s)[0].split('.')[1..-1].join('.')
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                  def path(s)
         | 
| 38 | 
            +
                    parse(s)[1]
         | 
| 39 | 
            +
                  end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  def oid(s)
         | 
| 42 | 
            +
                    parse(s)[2]
         | 
| 43 | 
            +
                  end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                  def valid_path?(path)
         | 
| 46 | 
            +
                    return false if path.empty?
         | 
| 47 | 
            +
                    Labels.new(path).valid_with?(/^[a-z0-9_-]+$/)
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  def valid_species?(species)
         | 
| 51 | 
            +
                    return false if species.empty?
         | 
| 52 | 
            +
                    Labels.new(species).valid_with?(/^[a-z0-9_-]+$/)
         | 
| 53 | 
            +
                  end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                  def valid_oid?(oid)
         | 
| 56 | 
            +
                    return true if !oid || oid.empty?
         | 
| 57 | 
            +
                    !!(oid =~ /^[^,|]+$/)
         | 
| 58 | 
            +
                  end
         | 
| 59 | 
            +
                end
         | 
| 60 | 
            +
              end
         | 
| 61 | 
            +
            end
         | 
| 62 | 
            +
             | 
    
        data/lib/pebbles-uid/query.rb
    CHANGED
    
    | @@ -4,11 +4,11 @@ module Pebbles | |
| 4 4 |  | 
| 5 5 | 
             
                  NO_MARKER = Class.new
         | 
| 6 6 |  | 
| 7 | 
            -
                  attr_reader :term, :terms, : | 
| 8 | 
            -
                    : | 
| 7 | 
            +
                  attr_reader :term, :terms, :species, :path, :oid,
         | 
| 8 | 
            +
                    :species_name, :path_name, :suffix, :stop
         | 
| 9 9 | 
             
                  def initialize(term, options = {})
         | 
| 10 10 | 
             
                    @term = term
         | 
| 11 | 
            -
                    @ | 
| 11 | 
            +
                    @species_name = options.fetch(:species) { 'species' }
         | 
| 12 12 | 
             
                    @path_name = options.fetch(:path) { 'path' }
         | 
| 13 13 | 
             
                    @suffix = options[:suffix]
         | 
| 14 14 | 
             
                    @stop = options.fetch(:stop) { NO_MARKER }
         | 
| @@ -20,7 +20,7 @@ module Pebbles | |
| 20 20 | 
             
                    end
         | 
| 21 21 |  | 
| 22 22 | 
             
                    if !list?
         | 
| 23 | 
            -
                      @ | 
| 23 | 
            +
                      @species, @path, @oid = Pebbles::Uid.parse(term)
         | 
| 24 24 | 
             
                    end
         | 
| 25 25 | 
             
                  end
         | 
| 26 26 |  | 
| @@ -47,16 +47,16 @@ module Pebbles | |
| 47 47 | 
             
                    @path && @path.split('.').reject {|s| s == '*'}.length > 0
         | 
| 48 48 | 
             
                  end
         | 
| 49 49 |  | 
| 50 | 
            -
                  def  | 
| 51 | 
            -
                    @ | 
| 50 | 
            +
                  def species?
         | 
| 51 | 
            +
                    @species && @species != '*'
         | 
| 52 52 | 
             
                  end
         | 
| 53 53 |  | 
| 54 | 
            -
                  def  | 
| 55 | 
            -
                    ! | 
| 54 | 
            +
                  def epiteth?
         | 
| 55 | 
            +
                    !species_wrapper.tail.empty?
         | 
| 56 56 | 
             
                  end
         | 
| 57 57 |  | 
| 58 | 
            -
                  def  | 
| 59 | 
            -
                     | 
| 58 | 
            +
                  def epiteth
         | 
| 59 | 
            +
                    species_wrapper.tail.join('.')
         | 
| 60 60 | 
             
                  end
         | 
| 61 61 |  | 
| 62 62 | 
             
                  def oid?
         | 
| @@ -72,7 +72,7 @@ module Pebbles | |
| 72 72 | 
             
                      raise RuntimeError.new('Cannot compute a conditions hash for a list of uids')
         | 
| 73 73 | 
             
                    end
         | 
| 74 74 |  | 
| 75 | 
            -
                    hash =  | 
| 75 | 
            +
                    hash = species_wrapper.to_hash.merge(path_wrapper.to_hash)
         | 
| 76 76 | 
             
                    if oid?
         | 
| 77 77 | 
             
                      oid_key = ['oid', suffix].compact.join('_').to_sym
         | 
| 78 78 | 
             
                      hash = hash.merge(oid_key => oid)
         | 
| @@ -86,13 +86,13 @@ module Pebbles | |
| 86 86 |  | 
| 87 87 | 
             
                  private
         | 
| 88 88 |  | 
| 89 | 
            -
                  def  | 
| 90 | 
            -
                    unless @ | 
| 91 | 
            -
                      options = {:name =>  | 
| 89 | 
            +
                  def species_wrapper
         | 
| 90 | 
            +
                    unless @species_wrapper
         | 
| 91 | 
            +
                      options = {:name => species_name, :suffix => suffix}
         | 
| 92 92 | 
             
                      options.merge!(:stop => stop) if use_stop_marker?
         | 
| 93 | 
            -
                      @ | 
| 93 | 
            +
                      @species_wrapper = Labels.new(species, options)
         | 
| 94 94 | 
             
                    end
         | 
| 95 | 
            -
                    @ | 
| 95 | 
            +
                    @species_wrapper
         | 
| 96 96 | 
             
                  end
         | 
| 97 97 |  | 
| 98 98 | 
             
                  def path_wrapper
         | 
| @@ -106,21 +106,21 @@ module Pebbles | |
| 106 106 |  | 
| 107 107 | 
             
                  def wildcard_query?
         | 
| 108 108 | 
             
                    return false if term.include?(',')
         | 
| 109 | 
            -
                     | 
| 110 | 
            -
                    return true if Labels.new( | 
| 109 | 
            +
                    species, _, oid = Pebbles::Uid.parse(term)
         | 
| 110 | 
            +
                    return true if Labels.new(species).wildcard?
         | 
| 111 111 | 
             
                    return true if oid.nil? || oid.empty? || oid == '*'
         | 
| 112 112 | 
             
                    false
         | 
| 113 113 | 
             
                  end
         | 
| 114 114 |  | 
| 115 115 | 
             
                  def extract_terms
         | 
| 116 116 | 
             
                    term.split(',').map do |uid|
         | 
| 117 | 
            -
                       | 
| 118 | 
            -
                       | 
| 117 | 
            +
                      _species, _path, _oid = Pebbles::Uid.parse(uid)
         | 
| 118 | 
            +
                      species_labels = Labels.new(_species)
         | 
| 119 119 | 
             
                      path_labels = Labels.new(_path)
         | 
| 120 120 | 
             
                      oid_box = Oid.new(_oid)
         | 
| 121 121 |  | 
| 122 122 | 
             
                      raise ArgumentError.new('Realm must be specified') if path_labels.empty? || path_labels.first == '*'
         | 
| 123 | 
            -
                      raise ArgumentError.new(' | 
| 123 | 
            +
                      raise ArgumentError.new('Species must unambiguous') if species_labels.ambiguous?
         | 
| 124 124 | 
             
                      raise ArgumentError.new('Oid must be unambiguous') if oid_box.ambiguous?
         | 
| 125 125 |  | 
| 126 126 | 
             
                      @realm ||= path_labels.first
         | 
| @@ -128,7 +128,7 @@ module Pebbles | |
| 128 128 |  | 
| 129 129 | 
             
                      if oid_box.multiple?
         | 
| 130 130 | 
             
                        _oid.split('|').map do |s|
         | 
| 131 | 
            -
                          "#{ | 
| 131 | 
            +
                          "#{_species}:#{_path}$#{s}"
         | 
| 132 132 | 
             
                        end
         | 
| 133 133 | 
             
                      else
         | 
| 134 134 | 
             
                        uid
         | 
    
        data/lib/pebbles-uid/version.rb
    CHANGED
    
    
    
        data/spec/query_spec.rb
    CHANGED
    
    | @@ -1,9 +1,4 @@ | |
| 1 | 
            -
            require 'pebbles-uid | 
| 2 | 
            -
            require 'pebbles-uid/cache_key'
         | 
| 3 | 
            -
            require 'pebbles-uid/labels'
         | 
| 4 | 
            -
            require 'pebbles-uid/conditions'
         | 
| 5 | 
            -
            require 'pebbles-uid/oid'
         | 
| 6 | 
            -
            require 'pebbles-uid/query'
         | 
| 1 | 
            +
            require 'pebbles-uid'
         | 
| 7 2 |  | 
| 8 3 | 
             
            describe Pebbles::Uid::Query do
         | 
| 9 4 |  | 
| @@ -17,7 +12,7 @@ describe Pebbles::Uid::Query do | |
| 17 12 | 
             
                its(:list?) { should == false }
         | 
| 18 13 | 
             
                its(:collection?) { should == false }
         | 
| 19 14 | 
             
                its(:cache_keys) { should eq(['post:area51.*$abc']) }
         | 
| 20 | 
            -
                its(:to_hash) { should eq(: | 
| 15 | 
            +
                its(:to_hash) { should eq(:species_0_ => 'post', :path_0_ => 'area51', :oid_ => 'abc') }
         | 
| 21 16 |  | 
| 22 17 | 
             
                it "handles a wildcard path if realm is given" do
         | 
| 23 18 | 
             
                  query = Pebbles::Uid::Query.new('post:area51.*$abc')
         | 
| @@ -73,7 +68,7 @@ describe Pebbles::Uid::Query do | |
| 73 68 | 
             
                  ->{ Pebbles::Uid::Query.new('post:area51$abc,post:area52$xyz') }.should raise_error(ArgumentError)
         | 
| 74 69 | 
             
                end
         | 
| 75 70 |  | 
| 76 | 
            -
                it "bails with unspecific  | 
| 71 | 
            +
                it "bails with unspecific species" do
         | 
| 77 72 | 
             
                  ->{ Pebbles::Uid::Query.new('post.*:area51$abc,post:area51$xyz') }.should raise_error(ArgumentError)
         | 
| 78 73 | 
             
                end
         | 
| 79 74 |  | 
| @@ -101,7 +96,7 @@ describe Pebbles::Uid::Query do | |
| 101 96 | 
             
                context "everything" do
         | 
| 102 97 | 
             
                  subject { Pebbles::Uid::Query.new('*:*') }
         | 
| 103 98 |  | 
| 104 | 
            -
                  its(: | 
| 99 | 
            +
                  its(:species?) { should == false }
         | 
| 105 100 | 
             
                  its(:path?) { should == false }
         | 
| 106 101 | 
             
                  its(:oid?) { should == false }
         | 
| 107 102 |  | 
| @@ -115,25 +110,25 @@ describe Pebbles::Uid::Query do | |
| 115 110 | 
             
                context "everything, with any oid" do
         | 
| 116 111 | 
             
                  subject { Pebbles::Uid::Query.new('*:*$*') }
         | 
| 117 112 |  | 
| 118 | 
            -
                  its(: | 
| 113 | 
            +
                  its(:species?) { should == false }
         | 
| 119 114 | 
             
                  its(:path?) { should == false }
         | 
| 120 115 | 
             
                  its(:oid?) { should == false }
         | 
| 121 116 | 
             
                  its(:to_hash) { should == {} }
         | 
| 122 117 | 
             
                end
         | 
| 123 118 |  | 
| 124 | 
            -
                context "a  | 
| 119 | 
            +
                context "a species" do
         | 
| 125 120 | 
             
                  subject { Pebbles::Uid::Query.new('beast:*$*') }
         | 
| 126 | 
            -
                  its(: | 
| 127 | 
            -
                  its(: | 
| 128 | 
            -
                  its(: | 
| 129 | 
            -
                  its(:to_hash) { should == {: | 
| 121 | 
            +
                  its(:species?) { should == true }
         | 
| 122 | 
            +
                  its(:species) { should eq('beast') }
         | 
| 123 | 
            +
                  its(:epiteth?) { should == false }
         | 
| 124 | 
            +
                  its(:to_hash) { should == {:species_0 => 'beast'} }
         | 
| 130 125 | 
             
                end
         | 
| 131 126 |  | 
| 132 | 
            -
                context "a  | 
| 127 | 
            +
                context "a epiteth" do
         | 
| 133 128 | 
             
                  subject { Pebbles::Uid::Query.new('beast.mythical.hairy:*$*') }
         | 
| 134 | 
            -
                  its(: | 
| 135 | 
            -
                  its(: | 
| 136 | 
            -
                  its(:to_hash) { should == {: | 
| 129 | 
            +
                  its(:epiteth?) { should == true }
         | 
| 130 | 
            +
                  its(:epiteth) { should eq('mythical.hairy') }
         | 
| 131 | 
            +
                  its(:to_hash) { should == {:species_0 => 'beast', :species_1 => 'mythical', :species_2 => 'hairy'} }
         | 
| 137 132 | 
             
                end
         | 
| 138 133 |  | 
| 139 134 | 
             
                context "a path" do
         | 
| @@ -150,7 +145,7 @@ describe Pebbles::Uid::Query do | |
| 150 145 | 
             
                end
         | 
| 151 146 |  | 
| 152 147 | 
             
                context "a typical search" do
         | 
| 153 | 
            -
                  subject { Pebbles::Uid::Query.new('beast:myths.*', : | 
| 148 | 
            +
                  subject { Pebbles::Uid::Query.new('beast:myths.*', :species => 'klass', :path => 'label', :suffix => '') }
         | 
| 154 149 | 
             
                  its(:to_hash) { should == {:klass_0_ => 'beast', :label_0_ => 'myths'} }
         | 
| 155 150 | 
             
                  its(:next_path_label) { should == :label_1_ }
         | 
| 156 151 | 
             
                end
         | 
| @@ -162,7 +157,7 @@ describe Pebbles::Uid::Query do | |
| 162 157 | 
             
                end
         | 
| 163 158 |  | 
| 164 159 | 
             
                context "a search with stops" do
         | 
| 165 | 
            -
                  subject { Pebbles::Uid::Query.new('beast:myths$*', : | 
| 160 | 
            +
                  subject { Pebbles::Uid::Query.new('beast:myths$*', :species => 'klass', :path => 'label', :suffix => '', :stop => nil) }
         | 
| 166 161 | 
             
                  its(:to_hash) { should == {:klass_0_ => 'beast', :klass_1_ => nil, :label_0_ => 'myths', :label_1_ => nil} }
         | 
| 167 162 | 
             
                  its(:next_path_label) { should == :label_1_ }
         | 
| 168 163 | 
             
                end
         | 
    
        data/spec/uid_spec.rb
    CHANGED
    
    | @@ -14,7 +14,15 @@ describe Pebbles::Uid do | |
| 14 14 |  | 
| 15 15 | 
             
              describe "extracts elements" do
         | 
| 16 16 | 
             
                specify "genus" do
         | 
| 17 | 
            -
                  Pebbles::Uid.genus(uid).should eq('post | 
| 17 | 
            +
                  Pebbles::Uid.genus(uid).should eq('post')
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                specify "species" do
         | 
| 21 | 
            +
                  Pebbles::Uid.species(uid).should eq('post.card')
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                specify "epiteth" do
         | 
| 25 | 
            +
                  Pebbles::Uid.epiteth('post.picture.card:a.b.c$1').should eq('picture.card')
         | 
| 18 26 | 
             
                end
         | 
| 19 27 |  | 
| 20 28 | 
             
                specify "path" do
         | 
| @@ -31,7 +39,7 @@ describe Pebbles::Uid do | |
| 31 39 | 
             
              end
         | 
| 32 40 |  | 
| 33 41 | 
             
              describe "must" do
         | 
| 34 | 
            -
                specify "have a  | 
| 42 | 
            +
                specify "have a species" do
         | 
| 35 43 | 
             
                  ->{ Pebbles::Uid.new(':tourism.norway$1') }.should raise_error(ArgumentError)
         | 
| 36 44 | 
             
                end
         | 
| 37 45 |  | 
| @@ -47,7 +55,7 @@ describe Pebbles::Uid do | |
| 47 55 | 
             
              end
         | 
| 48 56 |  | 
| 49 57 | 
             
              describe "rejects" do
         | 
| 50 | 
            -
                it "wildcard  | 
| 58 | 
            +
                it "wildcard species" do
         | 
| 51 59 | 
             
                  ->{ Pebbles::Uid.new('post.*:tourism$1') }.should raise_error(ArgumentError)
         | 
| 52 60 | 
             
                  ->{ Pebbles::Uid.new('post|card:tourism$1') }.should raise_error(ArgumentError)
         | 
| 53 61 | 
             
                  ->{ Pebbles::Uid.new('post.^b.c:tourism$1') }.should raise_error(ArgumentError)
         | 
| @@ -78,10 +86,10 @@ describe Pebbles::Uid do | |
| 78 86 | 
             
                end
         | 
| 79 87 | 
             
              end
         | 
| 80 88 |  | 
| 81 | 
            -
              context " | 
| 89 | 
            +
              context "species" do
         | 
| 82 90 | 
             
                %w(- . _ 8).each do |char|
         | 
| 83 | 
            -
                  it "accepts #{char} in a  | 
| 84 | 
            -
                    Pebbles::Uid. | 
| 91 | 
            +
                  it "accepts #{char} in a species" do
         | 
| 92 | 
            +
                    Pebbles::Uid.valid_species?("uni#{char}corn").should == true
         | 
| 85 93 | 
             
                  end
         | 
| 86 94 | 
             
                end
         | 
| 87 95 |  | 
| @@ -120,8 +128,9 @@ describe Pebbles::Uid do | |
| 120 128 |  | 
| 121 129 | 
             
                its(:to_s) { should eq(uid) }
         | 
| 122 130 | 
             
                its(:realm) { should eq('tourism') }
         | 
| 123 | 
            -
                its(:genus) { should eq('post | 
| 124 | 
            -
                its(:species) { should eq('card') }
         | 
| 131 | 
            +
                its(:genus) { should eq('post') }
         | 
| 132 | 
            +
                its(:species) { should eq('post.card') }
         | 
| 133 | 
            +
                its(:epiteth) { should eq('card') }
         | 
| 125 134 | 
             
                its(:path) { should eq('tourism.norway.fjords') }
         | 
| 126 135 | 
             
                its(:oid) { should eq('1234') }
         | 
| 127 136 | 
             
                its(:oid?) { should == true }
         | 
| @@ -129,12 +138,12 @@ describe Pebbles::Uid do | |
| 129 138 | 
             
                its(:cache_key) { should eq('post.card:tourism.*$1234') }
         | 
| 130 139 |  | 
| 131 140 | 
             
                its(:to_hash) do
         | 
| 132 | 
            -
                  should eq(: | 
| 141 | 
            +
                  should eq(:species_0 => 'post', :species_1 => 'card', :path_0 => 'tourism', :path_1 => 'norway', :path_2 => 'fjords', :oid => '1234')
         | 
| 133 142 | 
             
                end
         | 
| 134 143 |  | 
| 135 144 | 
             
                context "without an oid" do
         | 
| 136 145 | 
             
                  it "excludes the oid key from the hash" do
         | 
| 137 | 
            -
                    Pebbles::Uid.new('post.doc:a.b.c').to_hash.should eq(: | 
| 146 | 
            +
                    Pebbles::Uid.new('post.doc:a.b.c').to_hash.should eq(:species_0 => 'post', :species_1 => 'doc', :path_0 => 'a', :path_1 => 'b', :path_2 => 'c')
         | 
| 138 147 | 
             
                  end
         | 
| 139 148 | 
             
                end
         | 
| 140 149 |  | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: pebbles-uid
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0. | 
| 4 | 
            +
              version: 0.0.9
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -13,7 +13,7 @@ date: 2012-10-16 00:00:00.000000000 Z | |
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: rspec
         | 
| 16 | 
            -
              requirement: & | 
| 16 | 
            +
              requirement: &70250797645480 !ruby/object:Gem::Requirement
         | 
| 17 17 | 
             
                none: false
         | 
| 18 18 | 
             
                requirements:
         | 
| 19 19 | 
             
                - - ! '>='
         | 
| @@ -21,7 +21,7 @@ dependencies: | |
| 21 21 | 
             
                    version: '0'
         | 
| 22 22 | 
             
              type: :development
         | 
| 23 23 | 
             
              prerelease: false
         | 
| 24 | 
            -
              version_requirements: * | 
| 24 | 
            +
              version_requirements: *70250797645480
         | 
| 25 25 | 
             
            description: Handle pebble UIDs conveniently.
         | 
| 26 26 | 
             
            email:
         | 
| 27 27 | 
             
            - katrina.owen@gmail.com
         | 
| @@ -35,11 +35,10 @@ files: | |
| 35 35 | 
             
            - README.md
         | 
| 36 36 | 
             
            - Rakefile
         | 
| 37 37 | 
             
            - lib/pebbles-uid.rb
         | 
| 38 | 
            -
            - lib/pebbles-uid/ | 
| 38 | 
            +
            - lib/pebbles-uid/class_methods.rb
         | 
| 39 39 | 
             
            - lib/pebbles-uid/conditions.rb
         | 
| 40 40 | 
             
            - lib/pebbles-uid/labels.rb
         | 
| 41 41 | 
             
            - lib/pebbles-uid/oid.rb
         | 
| 42 | 
            -
            - lib/pebbles-uid/parse.rb
         | 
| 43 42 | 
             
            - lib/pebbles-uid/query.rb
         | 
| 44 43 | 
             
            - lib/pebbles-uid/version.rb
         | 
| 45 44 | 
             
            - lib/pebbles-uid/wildcard.rb
         |