social_nets_db 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +0 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +72 -0
- data/LICENSE.txt +21 -0
- data/README.md +325 -0
- data/Rakefile +18 -0
- data/lib/social_nets_db/db.yml +525 -0
- data/lib/social_nets_db/fn_validations.rb +67 -0
- data/lib/social_nets_db/social_net.rb +111 -0
- data/lib/social_nets_db/support.rb +36 -0
- data/lib/social_nets_db/svg/gettr.svg +5 -0
- data/lib/social_nets_db/tag_helper.rb +36 -0
- data/lib/social_nets_db/version.rb +5 -0
- data/lib/social_nets_db.rb +17 -0
- data/social_nets_db.gemspec +45 -0
- metadata +176 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: d0f34a54ddd600c3eca0d252f6268ccbf1e1218a759cd6e45480e9ec0a861739
|
4
|
+
data.tar.gz: c710e00c6e326708c27e635328bf31716c74dbe21e7b29f4b66dd0d40ff03ee0
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 528c882f2b6e55a309493fd44577b3e0fa4629035b9cf9cb582d84f7a1ac9ce58d023e9ba9f481cb958022bcb446d71ab206d78a9fbaf96f5ff5b90fc4a69c1f
|
7
|
+
data.tar.gz: bcf8336c308bd6f60b3702380d2c059f360c9ade03fcea818c4e27855172c2ae1f0a45191258ae7084e426745a57d9e1590815379aadc79b57a339206b82a4f5
|
data/CHANGELOG.md
ADDED
File without changes
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
social_nets_db (0.0.1)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
ast (2.4.2)
|
10
|
+
bundler-audit (0.9.0.1)
|
11
|
+
bundler (>= 1.2.0, < 3)
|
12
|
+
thor (~> 1.0)
|
13
|
+
byebug (11.1.3)
|
14
|
+
coderay (1.1.3)
|
15
|
+
diff-lcs (1.4.4)
|
16
|
+
method_source (1.0.0)
|
17
|
+
parallel (1.21.0)
|
18
|
+
parser (3.0.3.1)
|
19
|
+
ast (~> 2.4.1)
|
20
|
+
pry (0.14.1)
|
21
|
+
coderay (~> 1.1)
|
22
|
+
method_source (~> 1.0)
|
23
|
+
pry-byebug (3.8.0)
|
24
|
+
byebug (~> 11.0)
|
25
|
+
pry (~> 0.10)
|
26
|
+
rainbow (3.0.0)
|
27
|
+
rake (13.0.6)
|
28
|
+
regexp_parser (2.1.1)
|
29
|
+
rexml (3.2.5)
|
30
|
+
rspec (3.10.0)
|
31
|
+
rspec-core (~> 3.10.0)
|
32
|
+
rspec-expectations (~> 3.10.0)
|
33
|
+
rspec-mocks (~> 3.10.0)
|
34
|
+
rspec-core (3.10.1)
|
35
|
+
rspec-support (~> 3.10.0)
|
36
|
+
rspec-expectations (3.10.1)
|
37
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
38
|
+
rspec-support (~> 3.10.0)
|
39
|
+
rspec-mocks (3.10.2)
|
40
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
41
|
+
rspec-support (~> 3.10.0)
|
42
|
+
rspec-support (3.10.3)
|
43
|
+
rubocop (1.23.0)
|
44
|
+
parallel (~> 1.10)
|
45
|
+
parser (>= 3.0.0.0)
|
46
|
+
rainbow (>= 2.2.2, < 4.0)
|
47
|
+
regexp_parser (>= 1.8, < 3.0)
|
48
|
+
rexml
|
49
|
+
rubocop-ast (>= 1.12.0, < 2.0)
|
50
|
+
ruby-progressbar (~> 1.7)
|
51
|
+
unicode-display_width (>= 1.4.0, < 3.0)
|
52
|
+
rubocop-ast (1.14.0)
|
53
|
+
parser (>= 3.0.1.1)
|
54
|
+
ruby-progressbar (1.11.0)
|
55
|
+
thor (1.1.0)
|
56
|
+
unicode-display_width (2.1.0)
|
57
|
+
|
58
|
+
PLATFORMS
|
59
|
+
x86_64-darwin-17
|
60
|
+
|
61
|
+
DEPENDENCIES
|
62
|
+
bundler (>= 2, < 3)
|
63
|
+
bundler-audit (>= 0.9, < 1)
|
64
|
+
pry (< 1)
|
65
|
+
pry-byebug (~> 3)
|
66
|
+
rake (~> 13)
|
67
|
+
rspec (~> 3)
|
68
|
+
rubocop (~> 1)
|
69
|
+
social_nets_db!
|
70
|
+
|
71
|
+
BUNDLED WITH
|
72
|
+
2.2.27
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2019 Sergey Pedan
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,325 @@
|
|
1
|
+
# Social nets DB
|
2
|
+
|
3
|
+
## Installation
|
4
|
+
|
5
|
+
```ruby
|
6
|
+
gem "social_nets_db"
|
7
|
+
```
|
8
|
+
|
9
|
+
|
10
|
+
## Internals
|
11
|
+
|
12
|
+
It stores data about social nets in a Ruby hash like so:
|
13
|
+
|
14
|
+
```yaml
|
15
|
+
-
|
16
|
+
name: Behance
|
17
|
+
uid: behance
|
18
|
+
icons:
|
19
|
+
font_awesome: "behance"
|
20
|
+
color: "#1769ff"
|
21
|
+
url: behance.com
|
22
|
+
tags:
|
23
|
+
- recruiting
|
24
|
+
- art
|
25
|
+
- design
|
26
|
+
profile_url:
|
27
|
+
by_username: https://behance.com/${username}
|
28
|
+
by_account_id: "https://behance.com/${account_id}"
|
29
|
+
```
|
30
|
+
|
31
|
+
[Peek into the source](https://github.com/sergeypedan/social-nets-db/blob/master/lib/social_net_db/db.yml).
|
32
|
+
|
33
|
+
Everything else is just helpers around this simple DB: finders, accessors & view helpers.
|
34
|
+
|
35
|
+
|
36
|
+
## Usage
|
37
|
+
|
38
|
+
There are 2 primary use cases for this gem:
|
39
|
+
|
40
|
+
### 1. To help create lists of links to social net accounts
|
41
|
+
|
42
|
+
Like in the footer of a website:
|
43
|
+
|
44
|
+
```ruby
|
45
|
+
ruby:
|
46
|
+
accounts = [
|
47
|
+
{ net_uid: "instagram", username: "dhh" },
|
48
|
+
{ net_uid: "facebook", username: "d-h-h" },
|
49
|
+
{ net_uid: "twitter", username: "d_h_h" },
|
50
|
+
{ net_uid: "upwork", account_id: "401298374012374" }
|
51
|
+
]
|
52
|
+
|
53
|
+
ul
|
54
|
+
- accounts.each do |account|
|
55
|
+
- net = SocialNetsDB.find account[:net_uid]
|
56
|
+
li
|
57
|
+
= fa_icon net.icons["font_awesome"], style: "color: #{net.color}"
|
58
|
+
=< link_to net.name, \
|
59
|
+
net.user_page(username: account[:username], account_id: account[:account_id]), \
|
60
|
+
target: "_blank", \
|
61
|
+
rel: "noopener noreferrer"
|
62
|
+
```
|
63
|
+
|
64
|
+
Here the gem:
|
65
|
+
|
66
|
+
- builds the URL to user page
|
67
|
+
|
68
|
+
```ruby
|
69
|
+
net.user_page(username: account[:username])
|
70
|
+
# "https://facebook.com/dhh"
|
71
|
+
```
|
72
|
+
|
73
|
+
- gives you the correct name of the social net
|
74
|
+
|
75
|
+
```ruby
|
76
|
+
net.name
|
77
|
+
# "Facebook"
|
78
|
+
```
|
79
|
+
|
80
|
+
### 2. To help building a `<select>` with social nets when storing user's account link
|
81
|
+
|
82
|
+
```ruby
|
83
|
+
= form_for @user do |f|
|
84
|
+
= f.fields_for :social_net_accounts do |sna|
|
85
|
+
.form-group
|
86
|
+
= sna.label :social_net_uid, class: "control-label"
|
87
|
+
= sna.select :social_net_uid, SocialNetsDB.values_for_select, {}, class: "form-control"
|
88
|
+
```
|
89
|
+
|
90
|
+
which produces
|
91
|
+
|
92
|
+
```html
|
93
|
+
<form action="/users" method="POST">
|
94
|
+
<div class="form-group">
|
95
|
+
<label for="user_social_net_accounts_attributes_123_social_net_uid">Social net UID</label>
|
96
|
+
<select required="required" class="form-control" name="user[social_net_accounts_attributes][123][social_net_uid]">
|
97
|
+
<option value="">Choose a social net:</option>
|
98
|
+
<option value="behance">Behance</option>
|
99
|
+
<option value="dribble">Dribble</option>
|
100
|
+
<option value="facebook">Facebook</option>
|
101
|
+
<!-- ... -->
|
102
|
+
</select>
|
103
|
+
</div>
|
104
|
+
</form>
|
105
|
+
```
|
106
|
+
|
107
|
+
See section “[Using with Rails](#use-with-rails)” below for more details.
|
108
|
+
|
109
|
+
|
110
|
+
## API
|
111
|
+
|
112
|
+
### Instance of `SocialNetsDB` class
|
113
|
+
|
114
|
+
Initialize an instance with social net UID.
|
115
|
+
|
116
|
+
```ruby
|
117
|
+
social_net = SocialNetsDB.find("facebook")
|
118
|
+
# => #<SocialNetsDB:0x00007fddc0041b40 @uid="facebook">
|
119
|
+
```
|
120
|
+
|
121
|
+
Which are supported UIDs?
|
122
|
+
|
123
|
+
```ruby
|
124
|
+
SocialNetsDB.uids
|
125
|
+
#=> [
|
126
|
+
# "behance",
|
127
|
+
# "dribble",
|
128
|
+
# "facebook",
|
129
|
+
# "fl.ru",
|
130
|
+
# "freelansim",
|
131
|
+
# "habr",
|
132
|
+
# "github",
|
133
|
+
# "instagram",
|
134
|
+
# "livejournal",
|
135
|
+
# "linkedin",
|
136
|
+
# "medium",
|
137
|
+
# "my.mail.ru",
|
138
|
+
# "odnoklassniki",
|
139
|
+
# "stackoverflow",
|
140
|
+
# "telegram",
|
141
|
+
# "twitter",
|
142
|
+
# "upwork",
|
143
|
+
# "vkontakte",
|
144
|
+
# "youtube"
|
145
|
+
# ]
|
146
|
+
```
|
147
|
+
|
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
|
+
### Data
|
176
|
+
|
177
|
+
```ruby
|
178
|
+
social_net.to_h
|
179
|
+
# => {
|
180
|
+
# name: "Facebook",
|
181
|
+
# uid: "facebook",
|
182
|
+
# fa_id: "facebook",
|
183
|
+
# color: "crimson",
|
184
|
+
# url: "https://facebook.com",
|
185
|
+
# user_page: {
|
186
|
+
# by_username: "https://facebook.com/${username}",
|
187
|
+
# by_account_id: "https://facebook.com/${account_id}",
|
188
|
+
# methods: [:account_id, :username]
|
189
|
+
# }
|
190
|
+
# }
|
191
|
+
```
|
192
|
+
|
193
|
+
### Property accessors
|
194
|
+
|
195
|
+
```ruby
|
196
|
+
social_net.color #=> "#3C5A99"
|
197
|
+
social_net.fa_icon_id #=> "facebook"
|
198
|
+
social_net.name #=> "Facebook"
|
199
|
+
social_net.uid #=> "facebook"
|
200
|
+
social_net.url #=> "https://facebook.com"
|
201
|
+
```
|
202
|
+
|
203
|
+
### FontAwesome icon
|
204
|
+
|
205
|
+
Assumes you have [FontAwesome](https://fontawesome.com/v4.7.0/) installed. Just builds the HTML tag.
|
206
|
+
|
207
|
+
```ruby
|
208
|
+
social_net.fa_icon
|
209
|
+
#=> <span class="fa fa-facebook" style="color: #3C5A99"></span>
|
210
|
+
```
|
211
|
+
|
212
|
+
It accepts a Hash with attributes, like Rails `tag_helper` (but not for `data: {}` — maybe later):
|
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
|
+
```
|
225
|
+
|
226
|
+
### User's page URL
|
227
|
+
|
228
|
+
```ruby
|
229
|
+
social_net.user_page(username: "dhh") #=> "https://facebook.com/dhh"
|
230
|
+
social_net.user_page(account_id: "id1234566789") #=> "https://facebook.com/account/id1234566789"
|
231
|
+
```
|
232
|
+
|
233
|
+
If you pass a username, whild the `SocialNet` supports user page URLs only via account ids, the method call will return `nil`.
|
234
|
+
|
235
|
+
You can check which is supported
|
236
|
+
|
237
|
+
```ruby
|
238
|
+
social_net.user_page_methods #=> [:account_id, :username]
|
239
|
+
```
|
240
|
+
|
241
|
+
|
242
|
+
## Use with Rails
|
243
|
+
|
244
|
+
This gem is Rails-agnostic, but you can use it in Rails like so:
|
245
|
+
|
246
|
+
### Forms
|
247
|
+
|
248
|
+
```ruby
|
249
|
+
= form_for @user do |f|
|
250
|
+
= f.fields_for :social_net_accounts do |sna|
|
251
|
+
.form-group
|
252
|
+
= sna.label :social_net_uid, class: "control-label"
|
253
|
+
= sna.select :social_net_uid, SocialNetsDB.values_for_select, {}, class: "form-control"
|
254
|
+
```
|
255
|
+
|
256
|
+
because
|
257
|
+
|
258
|
+
```ruby
|
259
|
+
SocialNetsDB.values_for_select
|
260
|
+
#=> [
|
261
|
+
# ["Behance", "behance"],
|
262
|
+
# ["Dribble", "dribble"],
|
263
|
+
# ["Facebook", "facebook"],
|
264
|
+
# ["GitHub", "github"],
|
265
|
+
# ["Instagram", "instagram"],
|
266
|
+
# ["LiveJournal", "livejournal"],
|
267
|
+
# ["LinkedIn", "linkedin"],
|
268
|
+
# ["Medium", "medium"],
|
269
|
+
# ["Мой мир", "my.mail.ru"],
|
270
|
+
# ["Одноклассники", "odnoklassniki"],
|
271
|
+
# ["StackOverflow", "stackoverflow"],
|
272
|
+
# ["Telegram", "telegram"],
|
273
|
+
# ["Twitter", "twitter"],
|
274
|
+
# ["Вконтакте", "vkontakte"],
|
275
|
+
# ["YouTube", "youtube"]
|
276
|
+
# ]
|
277
|
+
```
|
278
|
+
|
279
|
+
### Models
|
280
|
+
|
281
|
+
```ruby
|
282
|
+
model User < ApplicationRecord
|
283
|
+
has_many :social_net_accounts
|
284
|
+
end
|
285
|
+
```
|
286
|
+
|
287
|
+
```ruby
|
288
|
+
model SocialNetAccount < ApplicationRecord
|
289
|
+
belongs_to :user
|
290
|
+
|
291
|
+
validates :account_id, presence: true, if: Proc.new { |record| record.username.blank? }
|
292
|
+
validates :social_net_uid, presence: true, inclusion: { in: SocialNetsDB.uids }
|
293
|
+
validates :username, presence: true, if: Proc.new { |record| record.account_id.blank? }
|
294
|
+
|
295
|
+
def social_net
|
296
|
+
@social_net ||= SocialNetsDB.find(self.social_net_uid)
|
297
|
+
end
|
298
|
+
|
299
|
+
def user_page
|
300
|
+
social_net.user_page(username: self.username, account_id: self.account_number)
|
301
|
+
end
|
302
|
+
|
303
|
+
# id :bigint not null, primary key
|
304
|
+
# user_id :bigint not null
|
305
|
+
# account_id :string example: `id1230948712034871`
|
306
|
+
# social_net_uid :string not null example: `facebook`, `vkontakte`
|
307
|
+
# username :string example, `tenderlove`
|
308
|
+
# userpic_url :string
|
309
|
+
end
|
310
|
+
```
|
311
|
+
|
312
|
+
It's probably better to move those 2 methods into a decorator — here they are in the model just for brevity.
|
313
|
+
|
314
|
+
```ruby
|
315
|
+
SocialNetAccount.create(user_id: User.first.id, social_net_uid: "facebook", username: "tenderlobe")
|
316
|
+
```
|
317
|
+
|
318
|
+
```ruby
|
319
|
+
@user.social_net_accounts.first.user_page #=> "https://facebook.com/tenderlove"
|
320
|
+
```
|
321
|
+
|
322
|
+
|
323
|
+
## License
|
324
|
+
|
325
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
begin
|
4
|
+
require "bundler/audit/task"
|
5
|
+
require "rspec/core/rake_task"
|
6
|
+
require "rubocop/rake_task"
|
7
|
+
|
8
|
+
Bundler::Audit::Task.new
|
9
|
+
RSpec::Core::RakeTask.new(:spec)
|
10
|
+
RuboCop::RakeTask.new
|
11
|
+
rescue LoadError => e
|
12
|
+
puts e.message
|
13
|
+
end
|
14
|
+
|
15
|
+
desc "Run code quality checks"
|
16
|
+
task code_quality: %i[bundle:audit rubocop]
|
17
|
+
|
18
|
+
task default: %i[code_quality spec]
|