-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
/
hash.rb
128 lines (118 loc) · 3.55 KB
/
hash.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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
class Hash
# Return a hash that includes everything but the given keys.
#
# @param keys [Array, Set]
# @return [Hash]
def except(*keys)
self.dup.except!(keys)
end
# Replaces the hash without the given keys.
#
# @param keys [Array, Set]
# @return [Hash]
def except!(*keys)
keys.each{|key| delete(key)}
self
end
# Merges self with another hash, recursively
#
# @param hash [Hash] The hash to merge
# @return [Hash]
def deep_merge(hash)
target = self.dup
hash.keys.each do |key|
if hash[key].is_a?(Hash) && self[key].is_a?(Hash)
target[key] = target[key].deep_merge(hash[key])
next
end
target[key] = hash[key]
end
target
end
# Take a list and merge it into the hash with the correct key
#
# @param list [Integer, String, Twitter::List] A Twitter list ID, slug, or object.
# @return [Hash]
def merge_list!(list)
case list
when Integer
self[:list_id] = list
when String
self[:slug] = list
when Twitter::List
if list.id
self[:list_id] = list.id
elsif list.slug
self[:slug] = list.slug
end
self.merge_owner!(list.user)
end
self
end
# Take an owner and merge it into the hash with the correct key
#
# @param user[Integer, String, Twitter::User] A Twitter user ID, screen_name, or object.
# @return [Hash]
def merge_owner!(user)
self.merge_user!(user, "owner")
self[:owner_id] = self.delete(:owner_user_id) unless self[:owner_user_id].nil?
self
end
# Take a user and merge it into the hash with the correct key
#
# @param user[Integer, String, Twitter::User] A Twitter user ID, screen_name, or object.
# @return [Hash]
def merge_user(user, prefix=nil, suffix=nil)
self.dup.merge_user!(user, prefix, suffix)
end
# Take a user and merge it into the hash with the correct key
#
# @param user[Integer, String, Twitter::User] A Twitter user ID, screen_name, or object.
# @return [Hash]
def merge_user!(user, prefix=nil, suffix=nil)
case user
when Integer
self[[prefix, "user_id", suffix].compact.join("_").to_sym] = user
when String
self[[prefix, "screen_name", suffix].compact.join("_").to_sym] = user
when Twitter::User
if user.id
self[[prefix, "user_id", suffix].compact.join("_").to_sym] = user.id
elsif user.screen_name
self[[prefix, "screen_name", suffix].compact.join("_").to_sym] = user.screen_name
end
end
self
end
# Take a multiple users and merge them into the hash with the correct keys
#
# @param users [Array<Integer, String, Twitter::User>, Set<Integer, String, Twitter::User>] An array of Twitter user IDs, screen_names, or objects.
# @return [Hash]
def merge_users(*users)
self.dup.merge_users!(users)
end
# Take a multiple users and merge them into the hash with the correct keys
#
# @param users [Array<Integer, String, Twitter::User>, Set<Integer, String, Twitter::User>] An array of Twitter user IDs, screen_names, or objects.
# @return [Hash]
def merge_users!(*users)
user_ids, screen_names = [], []
users.flatten.each do |user|
case user
when Integer
user_ids << user
when String
screen_names << user
when Twitter::User
if user.id
user_ids << user.id
elsif user.screen_name
screen_names << user.screen_name
end
end
end
self[:user_id] = user_ids.join(',') unless user_ids.empty?
self[:screen_name] = screen_names.join(',') unless screen_names.empty?
self
end
end