Class: Keep::Locator

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

Constant Summary collapse

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

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.



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

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>


19
20
21
# File 'lib/arvados/keep.rb', line 19

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>


19
20
21
# File 'lib/arvados/keep.rb', line 19

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>


19
20
21
# File 'lib/arvados/keep.rb', line 19

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.



35
36
37
38
39
40
41
# File 'lib/arvados/keep.rb', line 35

def self.parse(tok)
  begin
    Locator.parse!(tok)
  rescue ArgumentError => e
    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.



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/arvados/keep.rb', line 45

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

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

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

  Locator.new(tokhash, toksize, tokhints)
end

.valid?(tok) ⇒ Boolean

Returns:

  • (Boolean)


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

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.



72
73
74
# File 'lib/arvados/keep.rb', line 72

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

#strip_hintsObject



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

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

#strip_hints!Object



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

def strip_hints!
  @hints = []
  self
end

#to_sObject



90
91
92
93
94
95
96
# File 'lib/arvados/keep.rb', line 90

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

#without_signatureObject

Returns an unsigned Locator.



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

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