social_nets_db 0.0.4 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +18 -0
- data/Gemfile.lock +1 -1
- data/README.md +66 -102
- data/lib/social_nets_db/db.yml +2 -2
- data/lib/social_nets_db/fn_validations.rb +33 -33
- data/lib/social_nets_db/social_net.rb +37 -13
- data/lib/social_nets_db/support.rb +9 -29
- data/lib/social_nets_db/tag_helper.rb +28 -28
- data/lib/social_nets_db/version.rb +1 -1
- data/lib/social_nets_db.rb +1 -3
- data/social_nets_db.gemspec +14 -13
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3b07bc3f5bac88fb0cd2995b67cb093d86e3c7f9c2305862485e92bf52f4d440
|
4
|
+
data.tar.gz: 013df8d860fdfc63cd909d26636d47c0ebf25de19d6a461e2d6e2021aaa371f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 97b15945fa4e52ea9b26c8306765d50025891b157bb2c4318d150aee07a25af17c50e7168cca7952813da7e29f3c4c7d6599d11abcdb2885562d569802758e39
|
7
|
+
data.tar.gz: 276f11e57a87fc304e815b114a49a549df8e12b838ad28ea9b76e5d7b22cf32da055db98b2319862b4d5ce155874f6d9c3d2089f8501208457d3cab44c874fb0
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,23 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [0.0.8] - 2022-01-03
|
4
|
+
|
5
|
+
- Corrects VK domain
|
6
|
+
|
7
|
+
## [0.0.7] - 2021-12-03
|
8
|
+
|
9
|
+
- Improves and corrects user page method
|
10
|
+
- Corrects .all method
|
11
|
+
- More documentation
|
12
|
+
|
13
|
+
## [0.0.6] - 2021-12-03
|
14
|
+
|
15
|
+
- Corrects data source of accessor methods
|
16
|
+
|
17
|
+
## [0.0.5] - 2021-12-03
|
18
|
+
|
19
|
+
- Corrects an error in `uids`
|
20
|
+
|
3
21
|
## [0.0.4] - 2021-12-03
|
4
22
|
|
5
23
|
- Corrects an error in `values_for_select`
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# Social nets DB
|
2
2
|
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/social_nets_db.svg)](https://badge.fury.io/rb/social_nets_db)
|
4
|
+
|
3
5
|
## Installation
|
4
6
|
|
5
7
|
```ruby
|
@@ -9,27 +11,24 @@ gem "social_nets_db"
|
|
9
11
|
|
10
12
|
## Internals
|
11
13
|
|
12
|
-
It stores data about social nets in a
|
14
|
+
It stores data about popular social nets, video hostings etc. in a YAML file [`db.yml`](https://github.com/sergeypedan/social-nets-db/blob/master/lib/social_nets_db/db.yml):
|
13
15
|
|
14
16
|
```yaml
|
15
|
-
|
17
|
+
behance:
|
16
18
|
name: Behance
|
17
|
-
uid: behance
|
18
19
|
icons:
|
19
|
-
font_awesome_4:
|
20
|
+
font_awesome_4: behance
|
20
21
|
color: "#1769ff"
|
21
|
-
|
22
|
+
domain: behance.com
|
22
23
|
tags:
|
23
|
-
- recruiting
|
24
24
|
- art
|
25
25
|
- design
|
26
|
+
- recruiting
|
26
27
|
profile_url:
|
27
|
-
by_username: https
|
28
|
-
by_account_id: "https
|
28
|
+
by_username: "https://${domain}/${uid}"
|
29
|
+
by_account_id: "https://${domain}/${uid}"
|
29
30
|
```
|
30
31
|
|
31
|
-
[Peek into the source](https://github.com/sergeypedan/social-nets-db/blob/master/lib/social_net_db/db.yml).
|
32
|
-
|
33
32
|
Everything else is just helpers around this simple DB: finders, accessors & view helpers.
|
34
33
|
|
35
34
|
|
@@ -47,18 +46,20 @@ ruby:
|
|
47
46
|
{ net_uid: "instagram", username: "dhh" },
|
48
47
|
{ net_uid: "facebook", username: "d-h-h" },
|
49
48
|
{ net_uid: "twitter", username: "d_h_h" },
|
50
|
-
{ net_uid: "upwork", account_id: "401298374012374" }
|
49
|
+
{ net_uid: "upwork", account_id: "401298374012374" },
|
50
|
+
{ net_uid: "email", username: "elon@musk.io" },
|
51
|
+
{ net_uid: "website", username: "musk.io" }
|
51
52
|
]
|
52
53
|
|
53
54
|
ul
|
54
55
|
- accounts.each do |account|
|
55
|
-
- net = SocialNetsDB.find account[:net_uid]
|
56
|
+
- net = SocialNetsDB::SocialNet.find account[:net_uid]
|
56
57
|
li
|
57
|
-
=
|
58
|
+
- fa_icon_uid = net.icons["font_awesome_4"] || "link"
|
59
|
+
= fa_icon fa_icon_uid, class: "fw", style: "color: #{net.color}"
|
58
60
|
=< link_to net.name, \
|
59
61
|
net.user_page(username: account[:username], account_id: account[:account_id]), \
|
60
|
-
target: "_blank",
|
61
|
-
rel: "noopener noreferrer"
|
62
|
+
target: "_blank", rel: "noopener noreferrer"
|
62
63
|
```
|
63
64
|
|
64
65
|
Here the gem:
|
@@ -66,15 +67,13 @@ Here the gem:
|
|
66
67
|
- builds the URL to user page
|
67
68
|
|
68
69
|
```ruby
|
69
|
-
net.user_page(username: account[:username])
|
70
|
-
# "https://facebook.com/dhh"
|
70
|
+
net.user_page(username: account[:username]) #=> "https://facebook.com/dhh"
|
71
71
|
```
|
72
72
|
|
73
73
|
- gives you the correct name of the social net
|
74
74
|
|
75
75
|
```ruby
|
76
|
-
net.name
|
77
|
-
# "Facebook"
|
76
|
+
net.name #=> "Facebook"
|
78
77
|
```
|
79
78
|
|
80
79
|
### 2. To help building a `<select>` with social nets when storing user's account link
|
@@ -84,7 +83,7 @@ Here the gem:
|
|
84
83
|
= f.fields_for :social_net_accounts do |sna|
|
85
84
|
.form-group
|
86
85
|
= sna.label :social_net_uid, class: "control-label"
|
87
|
-
= sna.select :social_net_uid, SocialNetsDB.values_for_select, {}, class: "form-control"
|
86
|
+
= sna.select :social_net_uid, SocialNetsDB::SocialNet.values_for_select, {}, class: "form-control"
|
88
87
|
```
|
89
88
|
|
90
89
|
which produces
|
@@ -109,19 +108,21 @@ See section “[Using with Rails](#use-with-rails)” below for more details.
|
|
109
108
|
|
110
109
|
## API
|
111
110
|
|
112
|
-
###
|
111
|
+
### Find a social net record
|
113
112
|
|
114
|
-
|
113
|
+
Use either one:
|
115
114
|
|
116
115
|
```ruby
|
117
|
-
social_net = SocialNetsDB.find("facebook")
|
116
|
+
social_net = SocialNetsDB::SocialNet.find("facebook")
|
117
|
+
social_net = SocialNetsDB::SocialNet.find_by(uid: "facebook")
|
118
|
+
social_net = SocialNetsDB::SocialNet.find_by_uid("facebook")
|
118
119
|
# => #<SocialNetsDB:0x00007fddc0041b40 @uid="facebook">
|
119
120
|
```
|
120
121
|
|
121
122
|
Which are supported UIDs?
|
122
123
|
|
123
124
|
```ruby
|
124
|
-
SocialNetsDB.uids
|
125
|
+
SocialNetsDB::SocialNet.uids
|
125
126
|
#=> [
|
126
127
|
# "behance",
|
127
128
|
# "dribble",
|
@@ -131,97 +132,45 @@ SocialNetsDB.uids
|
|
131
132
|
# "habr",
|
132
133
|
# "github",
|
133
134
|
# "instagram",
|
134
|
-
#
|
135
|
-
# "linkedin",
|
136
|
-
# "medium",
|
137
|
-
# "my.mail.ru",
|
138
|
-
# "odnoklassniki",
|
139
|
-
# "stackoverflow",
|
140
|
-
# "telegram",
|
141
|
-
# "twitter",
|
142
|
-
# "upwork",
|
143
|
-
# "vkontakte",
|
144
|
-
# "youtube"
|
135
|
+
# ...
|
145
136
|
# ]
|
146
137
|
```
|
147
138
|
|
148
|
-
If you try to initialize with an unsupported UID, and you will also get the list along with an Exception:
|
149
|
-
|
150
|
-
```ruby
|
151
|
-
SocialNetsDB.find("diaspora")
|
152
|
-
# ArgumentError (Social net with UID test is not supported.
|
153
|
-
#
|
154
|
-
# Currently supported UIDs are: behance, dribble, facebook, github, instagram, livejournal, linkedin, medium, my.mail.ru, odnoklassniki, stackoverflow, telegram, twitter, vkontakte, youtube)
|
155
|
-
```
|
156
|
-
|
157
|
-
### find_by
|
158
|
-
|
159
|
-
If you don't want to rescue exceptions while initializing, you can use `find_by(uid:)` instead.
|
160
|
-
|
161
|
-
It returns an instance:
|
162
|
-
|
163
|
-
```ruby
|
164
|
-
SocialNetsDB.find_by(uid: "facebook")
|
165
|
-
# => #<SocialNetsDB:0x00007fddc0041b40 @uid="facebook">
|
166
|
-
```
|
167
|
-
|
168
|
-
or `nil`:
|
169
|
-
|
170
|
-
```ruby
|
171
|
-
SocialNetsDB.find_by(uid: "blabla")
|
172
|
-
# => nil
|
173
|
-
```
|
174
|
-
|
175
139
|
### Data
|
176
140
|
|
177
141
|
```ruby
|
178
|
-
social_net.to_h
|
179
|
-
#
|
180
|
-
#
|
181
|
-
#
|
182
|
-
#
|
183
|
-
#
|
184
|
-
#
|
185
|
-
#
|
186
|
-
#
|
187
|
-
#
|
188
|
-
#
|
189
|
-
#
|
190
|
-
# }
|
142
|
+
social_net.to_h #=>
|
143
|
+
# {
|
144
|
+
# "name" => "Facebook",
|
145
|
+
# "icons" => { "font_awesome_4" => "facebook" },
|
146
|
+
# "color" => "#3C5A99",
|
147
|
+
# "domain" => "facebook.com",
|
148
|
+
# "tags" => ["social net"],
|
149
|
+
# "profile_url" => {
|
150
|
+
# "by_username" => "https://${domain}/${uid}",
|
151
|
+
# "by_account_id" => "https://${domain}/${uid}"
|
152
|
+
# }
|
153
|
+
# }
|
191
154
|
```
|
192
155
|
|
193
156
|
### Property accessors
|
194
157
|
|
195
158
|
```ruby
|
196
|
-
social_net.color
|
197
|
-
social_net.
|
198
|
-
social_net.
|
199
|
-
social_net.
|
200
|
-
social_net.url
|
159
|
+
social_net.color #=> "#3C5A99"
|
160
|
+
social_net.name #=> "Facebook"
|
161
|
+
social_net.uid #=> "facebook"
|
162
|
+
social_net.domain #=> "facebook.com"
|
163
|
+
social_net.url #=> "https://facebook.com"
|
164
|
+
social_net.icons #=> { "font_awesome_4" => "facebook" }
|
201
165
|
```
|
202
166
|
|
203
167
|
### FontAwesome icon
|
204
168
|
|
205
|
-
Assumes you have [FontAwesome](https://fontawesome.com/v4.7.0/) installed. Just builds the HTML tag.
|
206
|
-
|
207
169
|
```ruby
|
208
|
-
social_net.
|
209
|
-
#=> <span class="fa fa-facebook" style="color: #3C5A99"></span>
|
170
|
+
social_net.icons["font_awesome_4"] #=> "facebook"
|
210
171
|
```
|
211
172
|
|
212
|
-
|
213
|
-
|
214
|
-
```ruby
|
215
|
-
social_net.fa_icon(class: "fa-fw", id: "my-id", style: "margin-top: 10px")
|
216
|
-
#=> <span class="fa fa-facebook fa-fw" style="color: #3C5A99; margin-top: 10px;" id="my-id"></span>
|
217
|
-
```
|
218
|
-
|
219
|
-
Exporting social net brand color to `styles` attribute can be turned off by passing `color: false` Hash pair among others:
|
220
|
-
|
221
|
-
```ruby
|
222
|
-
social_net.fa_icon(color: false, class: "fa-fw", id: "my-id", style: "margin-top: 10px")
|
223
|
-
#=> <span class="fa fa-facebook fa-fw" style="cmargin-top: 10px;" id="my-id"></span>
|
224
|
-
```
|
173
|
+
Currently, only FontAwesome v4 icons are store. I plan adding newer version of FA, maybe other icon providers, and also SVGs.
|
225
174
|
|
226
175
|
### User's page URL
|
227
176
|
|
@@ -230,7 +179,7 @@ social_net.user_page(username: "dhh") #=> "https://facebook.com/dhh
|
|
230
179
|
social_net.user_page(account_id: "id1234566789") #=> "https://facebook.com/account/id1234566789"
|
231
180
|
```
|
232
181
|
|
233
|
-
If you pass a username,
|
182
|
+
If you pass a username, while the `SocialNet` supports user page URLs only via account ids, the method call will return `nil`.
|
234
183
|
|
235
184
|
You can check which is supported
|
236
185
|
|
@@ -250,13 +199,13 @@ This gem is Rails-agnostic, but you can use it in Rails like so:
|
|
250
199
|
= f.fields_for :social_net_accounts do |sna|
|
251
200
|
.form-group
|
252
201
|
= sna.label :social_net_uid, class: "control-label"
|
253
|
-
= sna.select :social_net_uid, SocialNetsDB.values_for_select, {}, class: "form-control"
|
202
|
+
= sna.select :social_net_uid, SocialNetsDB::SocialNet.values_for_select, {}, class: "form-control"
|
254
203
|
```
|
255
204
|
|
256
205
|
because
|
257
206
|
|
258
207
|
```ruby
|
259
|
-
SocialNetsDB.values_for_select
|
208
|
+
SocialNetsDB::SocialNet.values_for_select
|
260
209
|
#=> [
|
261
210
|
# ["Behance", "behance"],
|
262
211
|
# ["Dribble", "dribble"],
|
@@ -284,16 +233,31 @@ model User < ApplicationRecord
|
|
284
233
|
end
|
285
234
|
```
|
286
235
|
|
236
|
+
This would be a standard approach:
|
237
|
+
|
238
|
+
```ruby
|
239
|
+
# model SocialNet < ApplicationRecord
|
240
|
+
# has_many :social_net_accounts
|
241
|
+
# end
|
242
|
+
```
|
243
|
+
|
244
|
+
but instead we will use `SocialNetsDB::SocialNet` class instead of an ActiveRecord class:
|
245
|
+
|
246
|
+
```ruby
|
247
|
+
SocialNetsDB::SocialNet.find("facebook")
|
248
|
+
SocialNetsDB::SocialNet.find_by(uid: "facebook")
|
249
|
+
```
|
250
|
+
|
287
251
|
```ruby
|
288
252
|
model SocialNetAccount < ApplicationRecord
|
289
253
|
belongs_to :user
|
290
254
|
|
291
255
|
validates :account_id, presence: true, if: Proc.new { |record| record.username.blank? }
|
292
|
-
validates :social_net_uid, presence: true, inclusion: { in: SocialNetsDB.uids }
|
256
|
+
validates :social_net_uid, presence: true, inclusion: { in: SocialNetsDB::SocialNet.uids }
|
293
257
|
validates :username, presence: true, if: Proc.new { |record| record.account_id.blank? }
|
294
258
|
|
295
259
|
def social_net
|
296
|
-
@social_net ||= SocialNetsDB.find(self.social_net_uid)
|
260
|
+
@social_net ||= SocialNetsDB::SocialNet.find(self.social_net_uid)
|
297
261
|
end
|
298
262
|
|
299
263
|
def user_page
|
data/lib/social_nets_db/db.yml
CHANGED
@@ -483,7 +483,7 @@ vkontakte:
|
|
483
483
|
icons:
|
484
484
|
font_awesome_4: "vk"
|
485
485
|
color: "#45668e"
|
486
|
-
domain:
|
486
|
+
domain: vk.com
|
487
487
|
tags:
|
488
488
|
- social net
|
489
489
|
profile_url:
|
@@ -503,7 +503,7 @@ youtube:
|
|
503
503
|
by_account_id: "https://${domain}/channel/${uid}"
|
504
504
|
|
505
505
|
youtube_profile:
|
506
|
-
name: YouTube
|
506
|
+
name: YouTube profile
|
507
507
|
icons:
|
508
508
|
font_awesome_4: "youtube"
|
509
509
|
color: "#ff0000"
|
@@ -2,44 +2,44 @@
|
|
2
2
|
|
3
3
|
module FnValidations
|
4
4
|
|
5
|
-
|
5
|
+
module_function
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
7
|
+
def validate_argument_type! argument, permitted_types
|
8
|
+
types = Array(permitted_types)
|
9
|
+
type_names = types.map { |klass| "`#{klass}`" }.join(" or ")
|
10
|
+
valid = types.any? { |type| argument.is_a? type }
|
11
|
+
message = "#{type_names} is expected, you pass a `#{argument.class}` (#{argument})"
|
12
|
+
fail TypeError, message unless valid
|
13
|
+
argument
|
14
|
+
end
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
16
|
+
def validate_collection_item_types! collection, permitted_types
|
17
|
+
types = Array(permitted_types)
|
18
|
+
type_names = types.map { |name| "`#{name}`" }.join(" or ")
|
19
|
+
valid = collection.all? { |item| types.include?(item.class) }
|
20
|
+
message = "#{type_names} is expected, one the items you pass is of incorrect type"
|
21
|
+
fail TypeError, message unless valid
|
22
|
+
collection
|
23
|
+
end
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
25
|
+
def validate_argument_boolean! argument
|
26
|
+
validate_argument_type! argument, [TrueClass, FalseClass]
|
27
|
+
end
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
29
|
+
def validate_argument_presence! argument
|
30
|
+
validate_argument_type! argument, [String, Symbol]
|
31
|
+
return argument if argument.is_a?(Symbol)
|
32
|
+
message = "You must pass a non-empty String, you are passing #{argument.inspect}"
|
33
|
+
fail ArgumentError, message unless argument.is_a?(String) && argument != ""
|
34
|
+
argument
|
35
|
+
end
|
36
36
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
37
|
+
def validate_argument_positive! argument
|
38
|
+
validate_argument_type! argument, Numeric
|
39
|
+
message = "You must pass a positive value, you pass #{argument.inspect}"
|
40
|
+
fail ArgumentError, message unless argument.positive?
|
41
|
+
argument
|
42
|
+
end
|
43
43
|
|
44
44
|
end
|
45
45
|
|
@@ -9,6 +9,9 @@ class SocialNetsDB
|
|
9
9
|
extend FnValidations
|
10
10
|
include FnValidations
|
11
11
|
|
12
|
+
# @param [String, Symbol] uid Social net UID (which must be among the top-level keys in db.yml)
|
13
|
+
# @param [Hash] data
|
14
|
+
#
|
12
15
|
def initialize(uid, data)
|
13
16
|
validate_argument_type! data, Hash
|
14
17
|
validate_argument_type! uid, [String, Symbol]
|
@@ -17,34 +20,46 @@ class SocialNetsDB
|
|
17
20
|
|
18
21
|
attr_accessor :uid
|
19
22
|
|
20
|
-
[:color, :domain, :icons, :name].each do |method_symbol|
|
23
|
+
[:color, :domain, :icons, :name, :tags].each do |method_symbol|
|
21
24
|
define_method(method_symbol) do
|
22
|
-
|
25
|
+
fallback_value = method_symbol == :tags ? [] : nil
|
26
|
+
@data.fetch(method_symbol.to_s, fallback_value)
|
23
27
|
end
|
24
28
|
end
|
25
29
|
|
30
|
+
# @return [Hash] Raw data we have on the initialized social net
|
31
|
+
#
|
26
32
|
def to_h
|
27
33
|
self.class.send :raw_data_for, @uid
|
28
34
|
end
|
29
35
|
|
36
|
+
# @return [String] full URL of the social net
|
37
|
+
#
|
30
38
|
def url
|
31
39
|
"https://#{domain}"
|
32
40
|
end
|
33
41
|
|
42
|
+
# @return [String] full URL of user’s page in the social net
|
43
|
+
# @param [String, Symbol, Integer] username
|
44
|
+
# @param [String, Symbol, Integer] username
|
45
|
+
# @example
|
46
|
+
# SocialNetsDB::SocialNet.find("facebook").user_page(username: "dhh")
|
47
|
+
# #=> "https://facebook.com/dhh"
|
48
|
+
#
|
34
49
|
def user_page(username: nil, account_id: nil)
|
35
50
|
return unless page = to_h["profile_url"]
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
fail ArgumentError, "Either a username or an account id must be provided" unless present_str?(account_id)
|
44
|
-
template.sub("${domain}", domain.to_s).sub("${uid}", account_id)
|
51
|
+
fail(ArgumentError, "Either a username or an account id must be provided") if [username, account_id].none?
|
52
|
+
if username && page["by_username"]
|
53
|
+
validate_argument_type! username, [String, Symbol, Integer]
|
54
|
+
page["by_username"].sub("${domain}", domain.to_s).sub("${uid}", username.to_s)
|
55
|
+
elsif account_id && page["by_account_id"]
|
56
|
+
validate_argument_type! account_id, [String, Symbol, Integer]
|
57
|
+
page["by_account_id"].sub("${domain}", domain.to_s).sub("${uid}", account_id.to_s)
|
45
58
|
end
|
46
59
|
end
|
47
60
|
|
61
|
+
# @return [Array] available methods for bilding user page URL
|
62
|
+
#
|
48
63
|
def user_page_methods
|
49
64
|
["account_id", "username"].select { |key| present_str? to_h.dig("profile_url", "by_#{key}") }
|
50
65
|
end
|
@@ -55,12 +70,15 @@ class SocialNetsDB
|
|
55
70
|
class << self
|
56
71
|
|
57
72
|
# TODO this must be transofrmed into array of structs
|
73
|
+
# @return [Array<SocialNetsDB::SocialNet>] a list of all social nets initialized as objects
|
58
74
|
def all
|
59
|
-
RECORDS
|
75
|
+
RECORDS.map { |uid, data| new(uid, data) }
|
60
76
|
end
|
61
77
|
|
78
|
+
|
62
79
|
# @param [String] name Social network name
|
63
80
|
# @param [String, Symbol] uid Social network UID
|
81
|
+
# @return [SocialNetsDB::SocialNet, nil]
|
64
82
|
#
|
65
83
|
def find_by(name: nil, uid: nil)
|
66
84
|
return find_by_uid(uid) if present_str?(uid)
|
@@ -68,13 +86,19 @@ class SocialNetsDB
|
|
68
86
|
fail ArgumentError, "`name:` or `uid:` must be provided. You are passing name: #{name.inspect}, uid: #{uid.inspect}"
|
69
87
|
end
|
70
88
|
|
89
|
+
|
90
|
+
# @param [String] name Social network name
|
91
|
+
# @return [SocialNetsDB::SocialNet, nil]
|
92
|
+
#
|
71
93
|
def find_by_name(name)
|
72
94
|
validate_argument_presence! name
|
73
95
|
return unless record = RECORDS.select { |uid, data| data["name"] == name }.first
|
74
96
|
find_by_uid record[0]
|
75
97
|
end
|
76
98
|
|
99
|
+
|
77
100
|
# @param [String, Symbol] uid Social network UID
|
101
|
+
# @return [SocialNetsDB::SocialNet, nil]
|
78
102
|
#
|
79
103
|
def find_by_uid(uid)
|
80
104
|
validate_argument_type! uid, String
|
@@ -96,7 +120,7 @@ class SocialNetsDB
|
|
96
120
|
end
|
97
121
|
|
98
122
|
def uids
|
99
|
-
RECORDS.map
|
123
|
+
RECORDS.keys.map(&:to_s)
|
100
124
|
end
|
101
125
|
|
102
126
|
def values_for_select
|
@@ -2,35 +2,15 @@
|
|
2
2
|
|
3
3
|
module Support
|
4
4
|
|
5
|
-
|
5
|
+
extend FnValidations
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
# From https://avdi.codes/recursively-symbolize-keys/
|
17
|
-
#
|
18
|
-
def recursively_symbolize_keys(hash)
|
19
|
-
validate_argument_type! hash, Hash
|
20
|
-
hash.inject({}) { |result, (key, value)|
|
21
|
-
new_key = case key
|
22
|
-
when String then key.to_sym
|
23
|
-
else key
|
24
|
-
end
|
25
|
-
|
26
|
-
new_value = case value
|
27
|
-
when Hash then symbolize_keys(value)
|
28
|
-
else value
|
29
|
-
end
|
30
|
-
|
31
|
-
result[new_key] = new_value
|
32
|
-
result
|
33
|
-
}
|
34
|
-
end
|
7
|
+
# Direct analogue of Rails' `String#present?`
|
8
|
+
#
|
9
|
+
# @return [Boolean] is the passed argument is a non-empty String
|
10
|
+
# @param arg [Any] the thing to check
|
11
|
+
#
|
12
|
+
def present_str?(arg)
|
13
|
+
arg.is_a?(String) && arg != ""
|
14
|
+
end
|
35
15
|
|
36
16
|
end
|
@@ -4,33 +4,33 @@ require_relative "support"
|
|
4
4
|
|
5
5
|
module TagHelper
|
6
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
|
-
|
7
|
+
include Support
|
8
|
+
|
9
|
+
def tag_attributes_to_s(options)
|
10
|
+
fail ArgumentError, "A Hash must be passed, you pass #{options.class}: #{options.inspect}" unless options.is_a? Hash
|
11
|
+
options.map { |pair| stringify_pair(*pair) }
|
12
|
+
.reject { |stringified_attribute| [nil, ""].include?(stringified_attribute) }
|
13
|
+
.join(" ")
|
14
|
+
end
|
15
|
+
|
16
|
+
private def stringify_pair(attribute_name, attribute_value)
|
17
|
+
str_value = stringify_value(attribute_value)
|
18
|
+
return "" if [nil, ""].include? str_value
|
19
|
+
"#{attribute_name}=\"#{str_value}\""
|
20
|
+
end
|
21
|
+
|
22
|
+
private def stringify_value(value)
|
23
|
+
value.is_a?(Array) ? value.join(" ") : value.to_s
|
24
|
+
end
|
25
|
+
|
26
|
+
def merge_style_values(existing:, incoming:)
|
27
|
+
return existing unless present_str? incoming
|
28
|
+
[existing, "#{incoming};"].join("; ").gsub(";;", ";")
|
29
|
+
end
|
30
|
+
|
31
|
+
def merge_class_values(existing:, incoming:)
|
32
|
+
return existing unless present_str? incoming
|
33
|
+
[existing, incoming]
|
34
|
+
end
|
35
35
|
|
36
36
|
end
|
data/lib/social_nets_db.rb
CHANGED
@@ -10,8 +10,6 @@ require_relative "social_nets_db/social_net"
|
|
10
10
|
|
11
11
|
class SocialNetsDB
|
12
12
|
|
13
|
-
|
14
|
-
# RECORDS = YAML.load_file(File.expand_path("social_nets_db/db.yml", __dir__)).map { _1.transform_keys(&:to_sym) }.freeze
|
15
|
-
RECORDS = YAML.load_file(File.expand_path("social_nets_db/db.yml", __dir__)).freeze
|
13
|
+
RECORDS = YAML.load_file(File.expand_path("social_nets_db/db.yml", __dir__)).freeze
|
16
14
|
|
17
15
|
end
|
data/social_nets_db.gemspec
CHANGED
@@ -8,19 +8,20 @@
|
|
8
8
|
require_relative "lib/social_nets_db/version"
|
9
9
|
|
10
10
|
Gem::Specification.new do |spec|
|
11
|
-
spec.name
|
12
|
-
spec.version
|
13
|
-
spec.authors
|
14
|
-
spec.email
|
15
|
-
spec.license
|
16
|
-
|
17
|
-
spec.summary
|
18
|
-
spec.description
|
19
|
-
|
20
|
-
spec.homepage
|
21
|
-
spec.metadata
|
22
|
-
|
23
|
-
|
11
|
+
spec.name = "social_nets_db"
|
12
|
+
spec.version = SocialNetsDB::VERSION
|
13
|
+
spec.authors = ["Sergey Pedan"]
|
14
|
+
spec.email = ["sergey.pedan@gmail.com"]
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.summary = "A non-comprehensive database of social nets packed in a Ruby gem"
|
18
|
+
spec.description = "#{spec.summary}. We have helpers for color, user page URL, FontAwesome icon, social net domain, some tags for grouping social nets, etc."
|
19
|
+
|
20
|
+
spec.homepage = "https://sergeypedan.ru/open_source_projects/social-nets-db"
|
21
|
+
spec.metadata = { "changelog_uri" => "https://github.com/sergeypedan/social-nets-db/blob/master/CHANGELOG.md",
|
22
|
+
"documentation_uri" => "https://www.rubydoc.info/gems/#{spec.name}",
|
23
|
+
"homepage_uri" => spec.homepage,
|
24
|
+
"source_code_uri" => "https://github.com/sergeypedan/social-nets-db" }
|
24
25
|
|
25
26
|
spec.extra_rdoc_files = Dir["README*", "LICENSE*"]
|
26
27
|
spec.rdoc_options = ["--charset=UTF-8"]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: social_nets_db
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sergey Pedan
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -146,13 +146,14 @@ files:
|
|
146
146
|
- lib/social_nets_db/tag_helper.rb
|
147
147
|
- lib/social_nets_db/version.rb
|
148
148
|
- social_nets_db.gemspec
|
149
|
-
homepage: https://
|
149
|
+
homepage: https://sergeypedan.ru/open_source_projects/social-nets-db
|
150
150
|
licenses:
|
151
151
|
- MIT
|
152
152
|
metadata:
|
153
153
|
changelog_uri: https://github.com/sergeypedan/social-nets-db/blob/master/CHANGELOG.md
|
154
|
-
|
155
|
-
|
154
|
+
documentation_uri: https://www.rubydoc.info/gems/social_nets_db
|
155
|
+
homepage_uri: https://sergeypedan.ru/open_source_projects/social-nets-db
|
156
|
+
source_code_uri: https://github.com/sergeypedan/social-nets-db
|
156
157
|
post_install_message:
|
157
158
|
rdoc_options:
|
158
159
|
- "--charset=UTF-8"
|