-
Notifications
You must be signed in to change notification settings - Fork 129
/
Copy pathglobal_id.rb
79 lines (64 loc) · 1.86 KB
/
global_id.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
require 'active_support/core_ext/string/inflections' # For #model_class constantize
require 'active_support/core_ext/array/access'
require 'active_support/core_ext/object/try' # For #find
require 'active_support/core_ext/module/delegation'
require 'global_id/uri/gid'
class GlobalID
class << self
attr_reader :app
def create(model, options = {})
if app = options.fetch(:app) { GlobalID.app }
params = options.except(:app, :verifier, :for)
new URI::GID.create(app, model, params), options
else
raise ArgumentError, 'An app is required to create a GlobalID. ' \
'Pass the :app option or set the default GlobalID.app.'
end
end
def find(gid, options = {})
parse(gid, options).try(:find, options)
end
def parse(gid, options = {})
gid.is_a?(self) ? gid : new(gid, options)
rescue URI::Error
parse_encoded_gid(gid, options)
end
def app=(app)
@app = URI::GID.validate_app(app)
end
private
def parse_encoded_gid(gid, options)
new(Base64.urlsafe_decode64(gid), options) rescue nil
end
end
attr_reader :uri
delegate :app, :model_name, :model_id, :params, :to_s, :deconstruct_keys, to: :uri
def initialize(gid, options = {})
@uri = gid.is_a?(URI::GID) ? gid : URI::GID.parse(gid)
end
def find(options = {})
Locator.locate self, options
end
def model_class
@model_class ||= begin
model = model_name.constantize
if model <= GlobalID
raise ArgumentError, "GlobalID and SignedGlobalID cannot be used as model_class."
end
model
end
end
def ==(other)
other.is_a?(GlobalID) && @uri == other.uri
end
alias_method :eql?, :==
def hash
self.class.hash | @uri.hash
end
def to_param
Base64.urlsafe_encode64(to_s, padding: false)
end
def as_json(*)
to_s
end
end