soc_med 0.1.1 → 0.1.2
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 +4 -4
- data/app/controllers/soc_med/application_controller.rb +2 -15
- data/app/models/soc_med/block.rb +1 -11
- data/app/models/soc_med/concerns/soc_med_helper.rb +21 -1
- data/app/models/soc_med/follow.rb +1 -13
- data/app/models/soc_med/like.rb +0 -15
- data/app/models/soc_med/report.rb +14 -7
- data/lib/generators/soc_med/install_generator.rb +23 -0
- data/lib/generators/templates/soc_med.rb +4 -0
- data/lib/soc_med.rb +9 -3
- data/lib/soc_med/concerns/blockable.rb +4 -4
- data/lib/soc_med/concerns/followable.rb +4 -4
- data/lib/soc_med/concerns/likeable.rb +4 -4
- data/lib/soc_med/concerns/reportable.rb +4 -4
- data/lib/soc_med/configuration.rb +10 -0
- data/lib/soc_med/services/base_service.rb +15 -1
- data/lib/soc_med/services/failure.rb +4 -0
- data/lib/soc_med/services/likes/create.rb +1 -1
- data/lib/soc_med/services/likes/like_base.rb +2 -2
- data/lib/soc_med/services/success.rb +4 -0
- data/lib/soc_med/version.rb +1 -1
- metadata +22 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 98f79c6e70f6bc5ae4ce4eeb641ffb73221ea3172776aad6615b4879faf8610a
|
4
|
+
data.tar.gz: 1d9955bd3377f1c3528c8340997eff4e471b47132c502261c5330e1d334f8a9b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 68511dd6c417e409f4f9df4907665bfd1229868ff480f023feb2323f775c0831c2c143be2ce38f5ccdb96a7bbda7bbe5a5de80f4df5321cd54ac64dd7dac172b
|
7
|
+
data.tar.gz: c318a996dbf469bcca73accd9cc9e5b5482b1317cf27068822a1dafaa4c6403e797034951de918e04f27d12c2f16922049b6b50dd9b72c8f4a3dce2bcdbadd9a
|
@@ -3,22 +3,9 @@ require 'dry_serialization/blueprinter'
|
|
3
3
|
module SocMed
|
4
4
|
class ApplicationController < ActionController::Base
|
5
5
|
include DrySerialization::Blueprinter
|
6
|
-
|
7
|
-
|
8
|
-
def error_response(error)
|
9
|
-
default_response = default_response(error)
|
10
|
-
render json: default_response
|
11
|
-
end
|
6
|
+
include DrySerialization::SerializationHelper
|
12
7
|
|
13
|
-
|
14
|
-
default_response = default_response(message, data)
|
15
|
-
render json: default_response
|
16
|
-
end
|
17
|
-
|
18
|
-
private
|
8
|
+
protect_from_forgery unless: -> { request.format.json? }
|
19
9
|
|
20
|
-
def default_response(message, data = {})
|
21
|
-
{ message: message }.merge(data)
|
22
|
-
end
|
23
10
|
end
|
24
11
|
end
|
data/app/models/soc_med/block.rb
CHANGED
@@ -1,16 +1,6 @@
|
|
1
1
|
module SocMed
|
2
2
|
class Block < ApplicationRecord
|
3
|
-
|
4
|
-
belongs_to :owner, polymorphic: true
|
3
|
+
include Concerns::SocMedHelper
|
5
4
|
|
6
|
-
before_validation :raise_already_liked_error_if_required, on: :create
|
7
|
-
|
8
|
-
validates :target_id, uniqueness: {scope: %i[target_type owner_id owner_type], message: "has already been blocked."}
|
9
|
-
|
10
|
-
private
|
11
|
-
|
12
|
-
def raise_already_followd_error_if_required
|
13
|
-
raise SocMed::Follows::AlreadyExistsError.new("#{owner_type} has already blocked that #{target_type}") if owner.blockable_objects.exists?(target: target)
|
14
|
-
end
|
15
5
|
end
|
16
6
|
end
|
@@ -1,9 +1,29 @@
|
|
1
1
|
module SocMed
|
2
2
|
module Concerns
|
3
3
|
module SocMedHelper
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
belongs_to :target, polymorphic: true
|
8
|
+
belongs_to :owner, polymorphic: true
|
9
|
+
|
10
|
+
before_validation :raise_already_implemented_error_if_required, on: :create
|
11
|
+
before_validation :raise_not_implemented_error, on: :create
|
12
|
+
|
13
|
+
validates :target_id, uniqueness: {scope: %i[target_type owner_id owner_type], message: "has already been #{self.class.to_s.split('/')[-1]}ed."}
|
14
|
+
end
|
4
15
|
|
5
16
|
def raise_not_implemented_error
|
6
|
-
|
17
|
+
unless target.respond_to?("number_of_#{self.class.to_s.underscore.split('/')[-1].pluralize}")
|
18
|
+
raise NotImplementedError
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def raise_already_implemented_error_if_required
|
23
|
+
klass = self.class.to_s.underscore.split('/').last
|
24
|
+
if owner.send("#{klass}able_objects").exists?(target: target)
|
25
|
+
raise "SocMed::#{klass.plurlarize.titleize}::AlreadyExistsError" "#{owner_type} has already liked that #{target_type}"
|
26
|
+
end
|
7
27
|
end
|
8
28
|
|
9
29
|
def update_count(attribute, operator)
|
@@ -1,19 +1,10 @@
|
|
1
1
|
module SocMed
|
2
2
|
class Follow < ApplicationRecord
|
3
|
-
include
|
3
|
+
include Concerns::SocMedHelper
|
4
4
|
|
5
|
-
belongs_to :target, polymorphic: true
|
6
|
-
belongs_to :owner, polymorphic: true
|
7
|
-
|
8
|
-
|
9
|
-
before_validation :raise_already_liked_error_if_required, on: :create
|
10
|
-
before_validation :raise_not_implemented_error, on: :create
|
11
5
|
before_commit :increment_number_of_follows, on: :create
|
12
6
|
before_destroy :decrement_number_of_follows
|
13
7
|
|
14
|
-
validates :target_id, uniqueness: {scope: %i[target_type owner_id owner_type], message: "has already been followed."}
|
15
|
-
|
16
|
-
|
17
8
|
private
|
18
9
|
|
19
10
|
def increment_number_of_follows
|
@@ -28,8 +19,5 @@ module SocMed
|
|
28
19
|
update_count(:number_of_follows, :-)
|
29
20
|
end
|
30
21
|
|
31
|
-
def raise_already_followd_error_if_required
|
32
|
-
raise SocMed::Follows::AlreadyExistsError.new("#{owner_type} has already followed that #{target_type}") if owner.followable_objects.exists?(target: target)
|
33
|
-
end
|
34
22
|
end
|
35
23
|
end
|
data/app/models/soc_med/like.rb
CHANGED
@@ -1,20 +1,10 @@
|
|
1
|
-
require_relative './concerns/soc_med_helper'
|
2
|
-
|
3
1
|
module SocMed
|
4
2
|
class Like < ::ApplicationRecord
|
5
3
|
include Concerns::SocMedHelper
|
6
4
|
|
7
|
-
belongs_to :target, polymorphic: true
|
8
|
-
belongs_to :owner, polymorphic: true
|
9
|
-
|
10
|
-
before_validation :raise_already_liked_error_if_required, on: :create
|
11
|
-
before_validation :raise_not_implemented_error, on: :create
|
12
5
|
before_commit :increment_number_of_likes, on: :create
|
13
6
|
before_destroy :decrement_number_of_likes
|
14
7
|
|
15
|
-
validates :target_id, uniqueness: {scope: %i[target_type owner_id owner_type], message: "has already been liked."}
|
16
|
-
|
17
|
-
|
18
8
|
private
|
19
9
|
|
20
10
|
def increment_number_of_likes
|
@@ -29,10 +19,5 @@ module SocMed
|
|
29
19
|
update_count(:number_of_likes, :-)
|
30
20
|
end
|
31
21
|
|
32
|
-
private
|
33
|
-
|
34
|
-
def raise_already_liked_error_if_required
|
35
|
-
raise SocMed::Likes::AlreadyExistsError.new("#{owner_type} has already liked that #{target_type}") if owner.likeable_objects.exists?(target: target)
|
36
|
-
end
|
37
22
|
end
|
38
23
|
end
|
@@ -1,16 +1,23 @@
|
|
1
1
|
module SocMed
|
2
2
|
class Report < ApplicationRecord
|
3
|
-
|
4
|
-
belongs_to :owner, polymorphic: true
|
3
|
+
include Concerns::SocMedHelper
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
validates :target_id, uniqueness: {scope: %i[target_type owner_id owner_type], message: "has already been reported."}
|
5
|
+
before_commit :increment_number_of_reports, on: :create
|
6
|
+
before_destroy :decrement_number_of_reports
|
9
7
|
|
10
8
|
private
|
11
9
|
|
12
|
-
def
|
13
|
-
|
10
|
+
def increment_number_of_reports
|
11
|
+
raise_not_implemented_error
|
12
|
+
|
13
|
+
update_count(:number_of_reports, :+)
|
14
|
+
end
|
15
|
+
|
16
|
+
def decrement_number_of_reports
|
17
|
+
raise_not_implemented_error
|
18
|
+
|
19
|
+
update_count(:number_of_reports, :-)
|
14
20
|
end
|
15
21
|
end
|
22
|
+
|
16
23
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'rails/generators/base'
|
2
|
+
|
3
|
+
module SocMed
|
4
|
+
class InstallGenerator < Rails::Generators::Base
|
5
|
+
source_root File.expand_path('../../templates', __FILE__)
|
6
|
+
|
7
|
+
def self.exit_on_failure
|
8
|
+
true
|
9
|
+
end
|
10
|
+
|
11
|
+
def install_soc_med_migrations
|
12
|
+
say 'Copying migrations...'
|
13
|
+
run 'rails soc_med:install:migrations'
|
14
|
+
end
|
15
|
+
|
16
|
+
def install_soc_med_initializer
|
17
|
+
say 'Creating intializer...'
|
18
|
+
template 'soc_med.rb', 'config/initializers/soc_med.rb'
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
data/lib/soc_med.rb
CHANGED
@@ -11,11 +11,17 @@ require 'soc_med/services/reports/create'
|
|
11
11
|
require 'soc_med/services/reports/destroy'
|
12
12
|
require 'soc_med/services/blocks/create'
|
13
13
|
require 'soc_med/services/blocks/destroy'
|
14
|
+
require 'soc_med/configuration'
|
14
15
|
|
15
16
|
module SocMed
|
16
|
-
mattr_accessor :owner_class
|
17
17
|
|
18
|
-
|
19
|
-
|
18
|
+
class << self
|
19
|
+
attr_accessor :configuration
|
20
20
|
end
|
21
|
+
|
22
|
+
def self.configure
|
23
|
+
self.configuration || Configuration.new
|
24
|
+
yield(configuration)
|
25
|
+
end
|
26
|
+
|
21
27
|
end
|
@@ -13,8 +13,8 @@ module SocMed
|
|
13
13
|
attributes = [attributes] unless attributes.is_a?(Array)
|
14
14
|
|
15
15
|
attributes.each do |attribute|
|
16
|
-
class_eval "has_many :by_blocking_#{attribute}, -> { order(created_at: :desc) }, class_name: 'SocMed::Block',
|
17
|
-
class_eval "has_many :blocked_#{attribute}, through: :by_blocking_#{attribute},
|
16
|
+
class_eval "has_many :by_blocking_#{attribute}, -> { order(created_at: :desc) }, class_name: 'SocMed::Block', foreign_key: :owner_id, dependent: :destroy"
|
17
|
+
class_eval "has_many :blocked_#{attribute}, through: :by_blocking_#{attribute}, class_name: '#{attribute.to_s.classify}'"
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
@@ -22,8 +22,8 @@ module SocMed
|
|
22
22
|
attributes = [attributes] unless attributes.is_a?(Array)
|
23
23
|
|
24
24
|
attributes.each do |attribute|
|
25
|
-
class_eval "has_many :by_blocked_#{attribute}, -> { order(created_at: :desc) }, class_name: 'SocMed::Block',
|
26
|
-
class_eval "has_many :blocked_by_#{attribute}, through: :by_blocked_#{attribute},
|
25
|
+
class_eval "has_many :by_blocked_#{attribute}, -> { order(created_at: :desc) }, class_name: 'SocMed::Block', foreign_key: :target_id, dependent: :destroy"
|
26
|
+
class_eval "has_many :blocked_by_#{attribute}, through: :by_blocked_#{attribute}, class_name: '#{attribute.to_s.classify}'"
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -13,8 +13,8 @@ module SocMed
|
|
13
13
|
attributes = [attributes] unless attributes.is_a?(Array)
|
14
14
|
|
15
15
|
attributes.each do |attribute|
|
16
|
-
class_eval "has_many :by_following_#{attribute}, -> { order(created_at: :desc) }, class_name: 'SocMed::Follow',
|
17
|
-
class_eval "has_many :followed_#{attribute}, through: :by_following_#{attribute},
|
16
|
+
class_eval "has_many :by_following_#{attribute}, -> { order(created_at: :desc) }, class_name: 'SocMed::Follow', foreign_key: :owner_id, dependent: :destroy"
|
17
|
+
class_eval "has_many :followed_#{attribute}, through: :by_following_#{attribute}, class_name: '#{attribute.to_s.classify}'"
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
@@ -22,8 +22,8 @@ module SocMed
|
|
22
22
|
attributes = [attributes] unless attributes.is_a?(Array)
|
23
23
|
|
24
24
|
attributes.each do |attribute|
|
25
|
-
class_eval "has_many :by_followed_#{attribute}, -> { order(created_at: :desc) }, class_name: 'SocMed::Follow',
|
26
|
-
class_eval "has_many :followed_by_#{attribute}, through: :by_followed_#{attribute},
|
25
|
+
class_eval "has_many :by_followed_#{attribute}, -> { order(created_at: :desc) }, class_name: 'SocMed::Follow', foreign_key: :target_id, dependent: :destroy"
|
26
|
+
class_eval "has_many :followed_by_#{attribute}, through: :by_followed_#{attribute}, class_name: '#{attribute.to_s.classify}'"
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -13,8 +13,8 @@ module SocMed
|
|
13
13
|
attributes = [attributes] unless attributes.is_a?(Array)
|
14
14
|
|
15
15
|
attributes.each do |attribute|
|
16
|
-
class_eval "has_many :by_liking_#{attribute}, -> { order(created_at: :desc) }, class_name: 'SocMed::Like',
|
17
|
-
class_eval "has_many :liked_#{attribute}, through: :by_liking_#{attribute},
|
16
|
+
class_eval "has_many :by_liking_#{attribute}, -> { order(created_at: :desc) }, class_name: 'SocMed::Like', foreign_key: :owner_id, dependent: :destroy"
|
17
|
+
class_eval "has_many :liked_#{attribute}, through: :by_liking_#{attribute}, class_name: '#{attribute.to_s.classify}'"
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
@@ -22,8 +22,8 @@ module SocMed
|
|
22
22
|
attributes = [attributes] unless attributes.is_a?(Array)
|
23
23
|
|
24
24
|
attributes.each do |attribute|
|
25
|
-
class_eval "has_many :by_liked_#{attribute}, -> { order(created_at: :desc) }, class_name: 'SocMed::Like',
|
26
|
-
class_eval "has_many :liked_by_#{attribute}, through: :by_liked_#{attribute},
|
25
|
+
class_eval "has_many :by_liked_#{attribute}, -> { order(created_at: :desc) }, class_name: 'SocMed::Like', foreign_key: :target_id, dependent: :destroy"
|
26
|
+
class_eval "has_many :liked_by_#{attribute}, through: :by_liked_#{attribute}, class_name: '#{attribute.to_s.classify}'"
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -13,8 +13,8 @@ module SocMed
|
|
13
13
|
attributes = [attributes] unless attributes.is_a?(Array)
|
14
14
|
|
15
15
|
attributes.each do |attribute|
|
16
|
-
class_eval "has_many :by_reporting_#{attribute}, -> { order(created_at: :desc) }, class_name: 'SocMed::Report',
|
17
|
-
class_eval "has_many :reported_#{attribute}, through: :by_reporting_#{attribute},
|
16
|
+
class_eval "has_many :by_reporting_#{attribute}, -> { order(created_at: :desc) }, class_name: 'SocMed::Report', foreign_key: :owner_id, dependent: :destroy"
|
17
|
+
class_eval "has_many :reported_#{attribute}, through: :by_reporting_#{attribute}, class_name: '#{attribute.to_s.classify}'"
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
@@ -22,8 +22,8 @@ module SocMed
|
|
22
22
|
attributes = [attributes] unless attributes.is_a?(Array)
|
23
23
|
|
24
24
|
attributes.each do |attribute|
|
25
|
-
class_eval "has_many :by_reported_#{attribute}, -> { order(created_at: :desc) }, class_name: 'SocMed::Report',
|
26
|
-
class_eval "has_many :reported_by_#{attribute}, through: :by_reported_#{attribute},
|
25
|
+
class_eval "has_many :by_reported_#{attribute}, -> { order(created_at: :desc) }, class_name: 'SocMed::Report', foreign_key: :target_id, dependent: :destroy"
|
26
|
+
class_eval "has_many :reported_by_#{attribute}, through: :by_reported_#{attribute}, class_name: '#{attribute.to_s.classify}'"
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
@@ -2,6 +2,7 @@ require 'active_record'
|
|
2
2
|
require 'soc_med/services/no_trigger'
|
3
3
|
require 'soc_med/services/success'
|
4
4
|
require 'soc_med/services/failure'
|
5
|
+
require 'soc_med/configuration'
|
5
6
|
|
6
7
|
module SocMed
|
7
8
|
module Services
|
@@ -9,7 +10,7 @@ module SocMed
|
|
9
10
|
attr_reader :params
|
10
11
|
|
11
12
|
def self.call(params, &block)
|
12
|
-
new(
|
13
|
+
new(params).call(&block)
|
13
14
|
end
|
14
15
|
|
15
16
|
def initialize(params)
|
@@ -24,6 +25,19 @@ module SocMed
|
|
24
25
|
|
25
26
|
private
|
26
27
|
|
28
|
+
def owner_class
|
29
|
+
@owner_class ||= Configuration.new.owner_class.to_s.classify.constantize
|
30
|
+
end
|
31
|
+
|
32
|
+
def handle_error(error)
|
33
|
+
unless Rails.env.test?
|
34
|
+
Rails.logger.error(error.message)
|
35
|
+
puts error.backtrace.join("\n\t")
|
36
|
+
end
|
37
|
+
|
38
|
+
yield(NoTrigger, Failure.new(error.message))
|
39
|
+
end
|
40
|
+
|
27
41
|
def target
|
28
42
|
raise NotImplementedError
|
29
43
|
end
|
@@ -28,8 +28,8 @@ module SocMed
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def owner
|
31
|
-
|
32
|
-
owner =
|
31
|
+
_owner_type, owner_id = owner_info
|
32
|
+
owner = owner_class.find_by(id: owner_id)
|
33
33
|
raise ActiveRecord::RecordNotFound unless owner
|
34
34
|
|
35
35
|
owner
|
data/lib/soc_med/version.rb
CHANGED
metadata
CHANGED
@@ -1,35 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: soc_med
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Heft
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 6.0.3
|
20
17
|
- - ">="
|
21
18
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
19
|
+
version: '0'
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
|
-
- - "~>"
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: 6.0.3
|
30
24
|
- - ">="
|
31
25
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
26
|
+
version: '0'
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
28
|
name: dry_serialization
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,6 +38,20 @@ dependencies:
|
|
44
38
|
- - ">="
|
45
39
|
- !ruby/object:Gem::Version
|
46
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: jsonapi-serializer
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
47
55
|
- !ruby/object:Gem::Dependency
|
48
56
|
name: blueprinter
|
49
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -128,11 +136,14 @@ files:
|
|
128
136
|
- db/migrate/20200605151423_create_soc_med_follows.rb
|
129
137
|
- db/migrate/20200605151437_create_soc_med_blocks.rb
|
130
138
|
- db/migrate/20200605151450_create_soc_med_reports.rb
|
139
|
+
- lib/generators/soc_med/install_generator.rb
|
140
|
+
- lib/generators/templates/soc_med.rb
|
131
141
|
- lib/soc_med.rb
|
132
142
|
- lib/soc_med/concerns/blockable.rb
|
133
143
|
- lib/soc_med/concerns/followable.rb
|
134
144
|
- lib/soc_med/concerns/likeable.rb
|
135
145
|
- lib/soc_med/concerns/reportable.rb
|
146
|
+
- lib/soc_med/configuration.rb
|
136
147
|
- lib/soc_med/engine.rb
|
137
148
|
- lib/soc_med/services/base_service.rb
|
138
149
|
- lib/soc_med/services/blocks/block_base.rb
|
@@ -173,7 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
173
184
|
- !ruby/object:Gem::Version
|
174
185
|
version: '0'
|
175
186
|
requirements: []
|
176
|
-
rubygems_version: 3.
|
187
|
+
rubygems_version: 3.2.3
|
177
188
|
signing_key:
|
178
189
|
specification_version: 4
|
179
190
|
summary: Provides social media functionality to Rails applications
|