Class: Keep::Locator

Inherits:
Object
  • Object
show all
Defined in:
lib/arvados/keep.rb

Constant Summary collapse

LOCATOR_REGEXP =
/^([[:xdigit:]]{32})(\+([[:digit:]]+))?((\+([[:upper:]][[:alnum:]@_-]*))+)?\z/

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(hasharg, sizearg, hintarg) ⇒ Locator

Returns a new instance of Locator.



27
28
29
30
31
# File 'lib/arvados/keep.rb', line 27

def initialize(hasharg, sizearg, hintarg)
  @hash = hasharg
  @size = sizearg
  @hints = hintarg
end

Instance Attribute Details

#hashObject (readonly)

A Locator is used to parse and manipulate Keep locator strings.

Locators obey the following syntax:

locator      ::= address hint*
address      ::= digest size-hint
digest       ::= <32 hexadecimal digits>
size-hint    ::= "+" [0-9]+
hint         ::= "+" hint-type hint-content
hint-type    ::= [A-Z]
hint-content ::= [A-Za-z0-9@_-]+

Individual hints may have their own required format:

sign-hint      ::= "+A" <40 lowercase hex digits> "@" sign-timestamp
sign-timestamp ::= <8 lowercase hex digits>


23
24
25
# File 'lib/arvados/keep.rb', line 23

def hash
  @hash
end

#hintsObject (readonly)

A Locator is used to parse and manipulate Keep locator strings.

Locators obey the following syntax:

locator      ::= address hint*
address      ::= digest size-hint
digest       ::= <32 hexadecimal digits>
size-hint    ::= "+" [0-9]+
hint         ::= "+" hint-type hint-content
hint-type    ::= [A-Z]
hint-content ::= [A-Za-z0-9@_-]+

Individual hints may have their own required format:

sign-hint      ::= "+A" <40 lowercase hex digits> "@" sign-timestamp
sign-timestamp ::= <8 lowercase hex digits>


23
24
25
# File 'lib/arvados/keep.rb', line 23

def hints
  @hints
end

#sizeObject (readonly)

A Locator is used to parse and manipulate Keep locator strings.

Locators obey the following syntax:

locator      ::= address hint*
address      ::= digest size-hint
digest       ::= <32 hexadecimal digits>
size-hint    ::= "+" [0-9]+
hint         ::= "+" hint-type hint-content
hint-type    ::= [A-Z]
hint-content ::= [A-Za-z0-9@_-]+

Individual hints may have their own required format:

sign-hint      ::= "+A" <40 lowercase hex digits> "@" sign-timestamp
sign-timestamp ::= <8 lowercase hex digits>


23
24
25
# File 'lib/arvados/keep.rb', line 23

def size
  @size
end

Class Method Details

.parse(tok) ⇒ Object

Locator.parse returns a Locator object parsed from the string tok. Returns nil if tok could not be parsed as a valid locator.



39
40
41
42
43
44
45
# File 'lib/arvados/keep.rb', line 39

def self.parse(tok)
  begin
    Locator.parse!(tok)
  rescue ArgumentError
    nil
  end
end

.parse!(tok) ⇒ Object

Locator.parse! returns a Locator object parsed from the string tok, raising an ArgumentError if tok cannot be parsed.



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/arvados/keep.rb', line 49

def self.parse!(tok)
  if tok.nil? or tok.empty?
    raise ArgumentError.new "locator is nil or empty"
  end

  m = LOCATOR_REGEXP.match(tok)
  unless m
    raise ArgumentError.new "not a valid locator #{tok}"
  end

  tokhash, _, toksize, _, _, trailer = m[1..6]
  tokhints = []
  if trailer
    trailer.split('+').each do |hint|
      if hint =~ /^[[:upper:]][[:alnum:]@_-]*$/
        tokhints.push(hint)
      else
        raise ArgumentError.new "invalid hint #{hint}"
      end
    end
  end

  Locator.new(tokhash, toksize, tokhints)
end

.valid?(tok) ⇒ Boolean

Returns:

  • (Boolean)


33
34
35
# File 'lib/arvados/keep.rb', line 33

def self.valid? tok
  !!(LOCATOR_REGEXP.match tok)
end

Instance Method Details

#signatureObject

Returns the signature hint supplied with this locator, or nil if the locator was not signed.



76
77
78
# File 'lib/arvados/keep.rb', line 76

def signature
  @hints.grep(/^A/).first
end

#strip_hintsObject



85
86
87
# File 'lib/arvados/keep.rb', line 85

def strip_hints
  Locator.new(@hash, @size, [])
end

#strip_hints!Object



89
90
91
92
# File 'lib/arvados/keep.rb', line 89

def strip_hints!
  @hints = []
  self
end

#to_sObject



94
95
96
97
98
99
100
# File 'lib/arvados/keep.rb', line 94

def to_s
  if @size
    [ @hash, @size, *@hints ].join('+')
  else
    [ @hash, *@hints ].join('+')
  end
end

#without_signatureObject

Returns an unsigned Locator.



81
82
83
# File 'lib/arvados/keep.rb', line 81

def without_signature
  Locator.new(@hash, @size, @hints.reject { |o| o.start_with?("A") })
end