-
Notifications
You must be signed in to change notification settings - Fork 33
/
uri.rb
88 lines (73 loc) · 2.79 KB
/
uri.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
module CloudKit
# A CloudKit::URI wraps a URI string, adding methods useful for routing
# in CloudKit as well as caching URI components for future comparisons.
class URI
# The string form of a URI.
attr_reader :string
# Create a new URI with the given string.
def initialize(string)
@string = string
end
# Return the resource collection URI fragment.
# Example: URI.new('/foos/123').collection_uri_fragment => '/foos
def collection_uri_fragment
"/#{components[0]}" rescue nil
end
# Splits a URI into its components
def components
@components ||= @string.split('/').reject{|x| x == '' || x == nil} rescue []
end
# Return the resource collection referenced by a URI.
# Example: URI.new('/foos/123').collection_type => :foos
def collection_type
components[0].to_sym rescue nil
end
# Return the URI for the current version of a resource.
# Example: URI.new('/foos/123/versions/abc').current_resource_uri => '/foos/123'
def current_resource_uri
"/#{components[0..1].join('/')}" rescue nil
end
# Returns true if URI matches /cloudkit-meta
def meta_uri?
return components.size == 1 && components[0] == 'cloudkit-meta'
end
# Returns true if URI matches /{collection}
def resource_collection_uri?
return components.size == 1 && components[0] != 'cloudkit-meta'
end
# Returns true if URI matches /{collection}/_resolved
def resolved_resource_collection_uri?
return components.size == 2 && components[1] == '_resolved'
end
# Returns true if URI matches /{collection}/{uuid}
def resource_uri?
return components.size == 2 && components[1] != '_resolved'
end
# Returns true if URI matches /{collection}/{uuid}/versions
def version_collection_uri?
return components.size == 3 && components[2] == 'versions'
end
# Returns true if URI matches /{collection}/{uuid}/versions/_resolved
def resolved_version_collection_uri?
return components.size == 4 && components[2] == 'versions' && components[3] == '_resolved'
end
# Returns true if URI matches /{collection}/{uuid}/versions/{etag}
def resource_version_uri?
return components.size == 4 && components[2] == 'versions' && components[3] != '_resolved'
end
# Returns a cannonical URI for a given URI/URI fragment, generating it if
# required.
# Example: URI.new('/items/123').cannoncal_uri_string => /items/123
#
# Example: URI.new('/items').cannonical_uri_string => /items/some-new-uuid
def cannonical_uri_string
@cannonical_uri_string ||= if resource_collection_uri?
"#{@string}/#{UUID.generate}"
elsif resource_uri?
@string
else
raise CloudKit::InvalidURIFormat
end
end
end
end