yiffspace 0.0.5 → 0.0.7

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 898fcc0c57ef87f3ec8b152dff077bdf42b25152cbbae517a82fc7ad61a45885
4
- data.tar.gz: 78d22498abcbde0062218aa341a4ca7e86587d0692d4fbc7161824d83483a3fe
3
+ metadata.gz: 6df835265036ddab2c96c9eee4f74e2d486ff5edcf6e08ea4ee245fd4d4860c4
4
+ data.tar.gz: 3f830fa81d6c083aff4f8b16d8f53a05d60ec2bee6cc7da16d97a5f9fb24a177
5
5
  SHA512:
6
- metadata.gz: 7784ddb66524eee1542651e0f70f3ae64a7e6cf297083307f2a4b21d493a2baad3982a4af406c7336932a30de42019647810fcbcac17c037649d0d2fd66be72f
7
- data.tar.gz: 0b5c0786bb0fb67a416400a42c22fa89488449343b0362a2c1f848b20766baf9481bcf3cc106b613786e00f7f6f8566168408efcbb507a783dae3ff6898ea8e5
6
+ metadata.gz: a341d471f5e1aeb0d0226b7cd237927aa209f974d1b8a8c76642e7635629187714515e6051f8db78964c08dcffb90f6b52b913ae7f17e1baf4f52926e48361fc
7
+ data.tar.gz: d6d84c18eb1b40da513fe8dd8fb79c1e2719d9ffa23e17a3132cedd03e336a5cfc08429d3a3ecab8606baf963aaa1d0bdb33d3207617ac6e4a59c389582c412c
@@ -36,7 +36,7 @@ module YiffSpace
36
36
  Images::Banner.get_for(id, :discord).update(banner)
37
37
  end
38
38
 
39
- def serializable_hash
39
+ def serializable_hash(*)
40
40
  ATTRIBUTES.to_h { |key| [key.to_s, instance_variable_get("@#{key}")] }
41
41
  end
42
42
 
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module YiffSpace
4
+ module Concerns
5
+ module UserResolvableMethods
6
+ def resolvable(ip_addr = nil)
7
+ attr = YiffSpace.config.last_ip_addr_attribute
8
+ UserResolvable.new(self, ip_addr || (attr && respond_to?(attr) ? send(attr) : nil) || YiffSpace.config.default_ip_address)
9
+ end
10
+
11
+ def resolve
12
+ self
13
+ end
14
+
15
+ def is?(user_or_id)
16
+ id == u2id(user_or_id)
17
+ end
18
+
19
+ def ==(other)
20
+ return super if other.is_a?(YiffSpace.config.user_class)
21
+
22
+ other.is_a?(YiffSpace.config.user_resolvable_class) && super(other.user)
23
+ end
24
+
25
+ def ===(other)
26
+ other == YiffSpace.config.user_like_class || super
27
+ end
28
+
29
+ def is_a?(other)
30
+ other == YiffSpace.config.user_like_class || super
31
+ end
32
+
33
+ include(YiffSpace::Utils::UserToId)
34
+
35
+ private(:u2id)
36
+ end
37
+ end
38
+ end
@@ -28,6 +28,12 @@ module YiffSpace
28
28
  # The default IP address assigned to Utils::Current when none is present.
29
29
  attr_accessor(:default_ip_address)
30
30
 
31
+ # The `last_ip_addr` attribute of the User model, used by the UserResolvableMethods concern
32
+ attr_accessor(:last_ip_addr_attribute)
33
+
34
+ # The anonymous user's name, can be a proc
35
+ attr_reader(:anonymous_user_name)
36
+
31
37
  # Override the proc used to fetch the anonymous user. Must respond to #call.
32
38
  # Default: -> { (user_class || ::User).anonymous }
33
39
  attr_writer(:anonymous_user_getter)
@@ -36,18 +42,16 @@ module YiffSpace
36
42
  # Default: -> { (user_class || ::User).system }
37
43
  attr_writer(:system_user_getter)
38
44
 
39
- # The anonymous user name
40
- attr_reader(:anonymous_user_name)
41
-
42
45
  def initialize
43
- @max_multi_count = -> { 100 }
44
- @redis_url = -> {}
45
- @user_class = nil
46
- @user_like_class = nil
47
- @user_resolvable_class = nil
48
- @current_class = nil
49
- @default_ip_address = "127.0.0.1"
50
- @anonymous_user_name = -> { "Anonymous" }
46
+ @max_multi_count = -> { 100 }
47
+ @redis_url = -> {}
48
+ @user_class = nil
49
+ @user_like_class = nil
50
+ @user_resolvable_class = nil
51
+ @current_class = nil
52
+ @default_ip_address = "127.0.0.1"
53
+ @last_ip_addr_attribute = :last_ip_addr
54
+ @anonymous_user_name = -> { "Anonymous" }
51
55
  end
52
56
 
53
57
  def user_class
@@ -20,6 +20,21 @@ module YiffSpace
20
20
  def update(*)
21
21
  raise(NotImplementedError)
22
22
  end
23
+
24
+ def serializable_hash(*)
25
+ { "id" => @id, "type" => @type }
26
+ end
27
+
28
+ def self.from_json(data)
29
+ raise(ArgumentError, "invalid data") if data.blank?
30
+
31
+ data = JSON.parse(data) if data.is_a?(String)
32
+ data = ::YiffSpace::Utils::OpenHash.from(data)
33
+
34
+ return Avatar.find_type(data.type).from_json(data) if self == Base
35
+
36
+ new(data.id)
37
+ end
23
38
  end
24
39
  end
25
40
  end
@@ -24,6 +24,10 @@ module YiffSpace
24
24
  value.try(:type)&.to_sym == type.to_sym
25
25
  end&.second
26
26
  end
27
+
28
+ def find_type!(type)
29
+ find_type(type) || raise(StandardError, "No avatar class for type: #{type}")
30
+ end
27
31
  end
28
32
  end
29
33
  end
@@ -20,6 +20,21 @@ module YiffSpace
20
20
  def update(*)
21
21
  raise(NotImplementedError)
22
22
  end
23
+
24
+ def serializable_hash(*)
25
+ { "id" => @id, "type" => @type }
26
+ end
27
+
28
+ def self.from_json(data)
29
+ raise(ArgumentError, "invalid data") if data.blank?
30
+
31
+ data = JSON.parse(data) if data.is_a?(String)
32
+ data = ::YiffSpace::Utils::OpenHash.from(data)
33
+
34
+ return Banner.find_type(data.type).from_json(data) if self == Base
35
+
36
+ new(data.id)
37
+ end
23
38
  end
24
39
  end
25
40
  end
@@ -24,6 +24,10 @@ module YiffSpace
24
24
  value.try(:type)&.to_sym == type.to_sym
25
25
  end&.second
26
26
  end
27
+
28
+ def find_type!(type)
29
+ find_type(type) || raise(StandardError, "No banner class for type: #{type}")
30
+ end
27
31
  end
28
32
  end
29
33
  end
@@ -13,6 +13,7 @@ require_relative("query_helper")
13
13
  require_relative("routes")
14
14
  require_relative("table_builder")
15
15
  require_relative("trace_logger")
16
+ require_relative("u2id")
16
17
  require_relative("user_attribute")
17
18
  require_relative("user_like")
18
19
  require_relative("user_resolvable")
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative("../utils/user_to_id")
4
+
5
+ include(YiffSpace::Utils::UserToId) # rubocop:disable Style/MixinUsage
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module YiffSpace
4
+ class Railtie < Rails::Railtie
5
+ initializer("yiffspace.serializers") do
6
+ ActiveSupport.on_load(:active_job) do
7
+ ActiveJob::Serializers.add_serializers(
8
+ Serializers::AnonymousAuthInfoSerializer,
9
+ Serializers::AnonymousUserInfoSerializer,
10
+ Serializers::AuthInfoSerializer,
11
+ Serializers::AvatarSerializer,
12
+ Serializers::BannerSerializer,
13
+ Serializers::DiscordInfoSerializer,
14
+ Serializers::PermissionsSerializer,
15
+ Serializers::UserInfoSerializer,
16
+ Serializers::UserResolvableSerializer,
17
+ )
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require("active_job")
4
+
5
+ module YiffSpace
6
+ module Serializers
7
+ class AnonymousAuthInfoSerializer < ActiveJob::Serializers::ObjectSerializer
8
+ def serialize(_)
9
+ super({})
10
+ end
11
+
12
+ def deserialize(_)
13
+ Auth::AuthInfo::Anonymous.instance
14
+ end
15
+
16
+ private
17
+
18
+ def klass
19
+ Auth::AuthInfo::Anonymous
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require("active_job")
4
+
5
+ module YiffSpace
6
+ module Serializers
7
+ class AnonymousUserInfoSerializer < ActiveJob::Serializers::ObjectSerializer
8
+ def serialize(_)
9
+ super({})
10
+ end
11
+
12
+ def deserialize(_)
13
+ Auth::UserInfo::Anonymous.instance
14
+ end
15
+
16
+ private
17
+
18
+ def klass
19
+ Auth::UserInfo::Anonymous
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require("active_job")
4
+
5
+ module YiffSpace
6
+ module Serializers
7
+ class AuthInfoSerializer < ActiveJob::Serializers::ObjectSerializer
8
+ def serialize(arg)
9
+ super(**arg.serializable_hash)
10
+ end
11
+
12
+ def deserialize(arg)
13
+ Auth::AuthInfo.from_json(arg)
14
+ end
15
+
16
+ private
17
+
18
+ def klass
19
+ Auth::AuthInfo
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require("active_job")
4
+
5
+ module YiffSpace
6
+ module Serializers
7
+ class AvatarSerializer < ActiveJob::Serializers::ObjectSerializer
8
+ def serialize(arg)
9
+ super(**arg.serializable_hash)
10
+ end
11
+
12
+ def deserialize(arg)
13
+ Images::Avatar::Base.from_json(arg)
14
+ end
15
+
16
+ private
17
+
18
+ def klass
19
+ Images::Avatar::Base
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require("active_job")
4
+
5
+ module YiffSpace
6
+ module Serializers
7
+ class BannerSerializer < ActiveJob::Serializers::ObjectSerializer
8
+ def serialize(arg)
9
+ super(**arg.serializable_hash)
10
+ end
11
+
12
+ def deserialize(arg)
13
+ Images::Banner::Base.from_json(arg)
14
+ end
15
+
16
+ private
17
+
18
+ def klass
19
+ Images::Banner::Base
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require("active_job")
4
+
5
+ module YiffSpace
6
+ module Serializers
7
+ class DiscordInfoSerializer < ActiveJob::Serializers::ObjectSerializer
8
+ def serialize(arg)
9
+ super(**arg.serializable_hash)
10
+ end
11
+
12
+ def deserialize(arg)
13
+ Auth::DiscordInfo.from_json(arg)
14
+ end
15
+
16
+ private
17
+
18
+ def klass
19
+ Auth::DiscordInfo
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require("active_job")
4
+
5
+ module YiffSpace
6
+ module Serializers
7
+ class PermissionsSerializer < ActiveJob::Serializers::ObjectSerializer
8
+ def serialize(arg)
9
+ super("value" => arg.value)
10
+ end
11
+
12
+ def deserialize(arg)
13
+ Auth::Permissions.new(arg["value"])
14
+ end
15
+
16
+ private
17
+
18
+ def klass
19
+ Auth::Permissions
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require("active_job")
4
+
5
+ module YiffSpace
6
+ module Serializers
7
+ class UserInfoSerializer < ActiveJob::Serializers::ObjectSerializer
8
+ def serialize(arg)
9
+ super(**arg.serializable_hash)
10
+ end
11
+
12
+ def deserialize(arg)
13
+ Auth::UserInfo.from_json(arg)
14
+ end
15
+
16
+ private
17
+
18
+ def klass
19
+ Auth::UserInfo
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require("active_job")
4
+
5
+ module YiffSpace
6
+ module Serializers
7
+ class UserResolvableSerializer < ActiveJob::Serializers::ObjectSerializer
8
+ def serialize(arg)
9
+ super("user" => arg.user&.id, "ip_addr" => arg.ip_addr)
10
+ end
11
+
12
+ def deserialize(arg)
13
+ YiffSpace.config.user_resolvable_class.new(arg["user"].blank? ? nil : YiffSpace.config.user_class.find(arg["user"]), arg["ip_addr"])
14
+ end
15
+
16
+ private
17
+
18
+ def klass
19
+ YiffSpace.config.user_resolvable_class
20
+ end
21
+ end
22
+ end
23
+ end
@@ -10,7 +10,8 @@ module YiffSpace
10
10
  class CloneError < StandardError; end
11
11
  attr_reader(:klass, :attribute, :db, :ip, :optional, :clones, :overwrite, :aliases, :ignore_nil, :ar_options)
12
12
 
13
- def initialize(klass, attribute, db:, ip: !db, optional: !db, clones: [], overwrite: false, aliases: [], ignore_nil: false, **ar_options)
13
+ # noinspection RubyUnusedLocalVariable
14
+ def initialize(klass, attribute, db:, ip: !db, optional: !db, clones: [], clone: [], overwrite: false, aliases: [], alias: [], ignore_nil: false, **ar_options)
14
15
  UserAttribute.class_setup(klass)
15
16
  @klass = klass
16
17
  @attribute = attribute.to_sym
@@ -18,9 +19,9 @@ module YiffSpace
18
19
  # noinspection RubySimplifyBooleanInspection
19
20
  @ip = ip == true ? :"#{attribute}_ip_addr" : ip
20
21
  @optional = optional
21
- @clones = Array(clones).map(&:to_sym)
22
+ @clones = Array(clones.presence || clone).map(&:to_sym)
22
23
  @overwrite = overwrite
23
- @aliases = Array(aliases).map(&:to_sym)
24
+ @aliases = Array(aliases.presence || binding.local_variable_get(:alias)).map(&:to_sym)
24
25
  @ignore_nil = ignore_nil
25
26
  @ar_options = ar_options
26
27
  if ar_options.any? && !db # rubocop:disable Style/IfUnlessModifier
@@ -191,7 +192,7 @@ module YiffSpace
191
192
  klass.instance_exec do
192
193
  scope("for_#{ua.attribute}", ->(value) { where(ua.db && ua.ar_options.key?(:foreign_key) ? ua.ar_options[:foreign_key] : "#{ua.attribute}_id" => u2id(value)) }) unless respond_to?("for_#{ua.attribute}")
193
194
  scope("for_#{ua.attribute}_id", ->(value) { where(ua.db && ua.ar_options.key?(:foreign_key) ? ua.ar_options[:foreign_key] : "#{ua.attribute}_id" => value) }) unless respond_to?("for_#{ua.attribute}_id")
194
- scope("for_#{ua.attribute}_name", ->(value) { where(ua.db && ua.ar_options.key?(:foreign_key) ? ua.ar_options[:foreign_key] : "#{ua.attribute}_id" => ::User.name_to_id(value)) }) unless respond_to?("for_#{ua.attribute}_name")
195
+ scope("for_#{ua.attribute}_name", ->(value) { where(ua.db && ua.ar_options.key?(:foreign_key) ? ua.ar_options[:foreign_key] : "#{ua.attribute}_id" => YiffSpace.config.user_class.name_to_id(value)) }) unless respond_to?("for_#{ua.attribute}_name")
195
196
  end
196
197
 
197
198
  aliases.each do |alias_attr|
@@ -1,13 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require("active_support/core_ext/module/delegation")
4
+ require("active_support/core_ext/string/inflections")
5
+
3
6
  module YiffSpace
4
7
  module Utils
5
8
  class UserResolvable
6
9
  attr_reader(:user, :ip_addr)
7
10
 
8
11
  def initialize(user, ip_addr, validate: true)
9
- if user.is_a?(UserResolvable)
10
- TraceLogger.warn("UserResolvable", "Unexpectedly received UserResolvable for user argument")
12
+ if user.is_a?(YiffSpace.config.user_resolvable_class)
13
+ TraceLogger.warn(self.class.name.demodulize, "Unexpectedly received #{user.class.name} for user argument")
11
14
  user = recursive_resolve(user)
12
15
  end
13
16
  @user = user
@@ -36,14 +39,14 @@ module YiffSpace
36
39
 
37
40
  def self.recursive_resolve(resolvable)
38
41
  result = resolvable
39
- result = result.resolve while result.is_a?(UserResolvable)
42
+ result = result.resolve while result.is_a?(YiffSpace.config.user_resolvable_class)
40
43
  result
41
44
  end
42
45
 
43
46
  def ==(other)
44
47
  return other == user if other.is_a?(YiffSpace.config.user_class)
45
48
 
46
- other.is_a?(UserResolvable) && user == other.user
49
+ other.is_a?(YiffSpace.config.user_resolvable_class) && user == other.user
47
50
  end
48
51
 
49
52
  def ===(other)
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module YiffSpace
4
+ module Utils
5
+ module UserToId
6
+ def u2id(value, klass = YiffSpace.config.user_class)
7
+ value.is_a?(klass) || (klass == YiffSpace.config.user_class && value.is_a?(YiffSpace.config.user_resolvable_class)) ? value.id : value
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module YiffSpace
4
- VERSION = "0.0.5"
4
+ VERSION = "0.0.7"
5
5
  end
data/lib/yiffspace.rb CHANGED
@@ -13,9 +13,12 @@ module YiffSpace
13
13
  end
14
14
 
15
15
  require("zeitwerk")
16
+ require("active_support/all")
17
+ require("active_support/core_ext/object/blank")
16
18
 
17
19
  loader = Zeitwerk::Loader.for_gem
18
20
  loader.inflector.inflect({ "postgresql" => "PostgreSQL", "yiffspace" => "YiffSpace", "query_dsl" => "QueryDSL" })
19
21
  loader.ignore("#{__dir__}/yiffspace/core_ext")
20
22
  loader.ignore("#{__dir__}/yiffspace/include")
23
+ loader.ignore("#{__dir__}/yiffspace/railtie.rb")
21
24
  loader.setup
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yiffspace
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Donovan_DMC
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2026-06-01 00:00:00.000000000 Z
10
+ date: 2026-06-03 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: abbrev
@@ -139,6 +139,7 @@ files:
139
139
  - lib/yiffspace/concerns/has_bit_flags.rb
140
140
  - lib/yiffspace/concerns/user_methods.rb
141
141
  - lib/yiffspace/concerns/user_name_methods.rb
142
+ - lib/yiffspace/concerns/user_resolvable_methods.rb
142
143
  - lib/yiffspace/config_builder.rb
143
144
  - lib/yiffspace/configuration.rb
144
145
  - lib/yiffspace/configuration/images.rb
@@ -194,12 +195,23 @@ files:
194
195
  - lib/yiffspace/include/routes.rb
195
196
  - lib/yiffspace/include/table_builder.rb
196
197
  - lib/yiffspace/include/trace_logger.rb
198
+ - lib/yiffspace/include/u2id.rb
197
199
  - lib/yiffspace/include/user_attribute.rb
198
200
  - lib/yiffspace/include/user_like.rb
199
201
  - lib/yiffspace/include/user_resolvable.rb
202
+ - lib/yiffspace/railtie.rb
200
203
  - lib/yiffspace/search/query_builder.rb
201
204
  - lib/yiffspace/search/query_dsl.rb
202
205
  - lib/yiffspace/search/query_helper.rb
206
+ - lib/yiffspace/serializers/anonymous_auth_info_serializer.rb
207
+ - lib/yiffspace/serializers/anonymous_user_info_serializer.rb
208
+ - lib/yiffspace/serializers/auth_info_serializer.rb
209
+ - lib/yiffspace/serializers/avatar_serializer.rb
210
+ - lib/yiffspace/serializers/banner_serializer.rb
211
+ - lib/yiffspace/serializers/discord_info_serializer.rb
212
+ - lib/yiffspace/serializers/permissions_serializer.rb
213
+ - lib/yiffspace/serializers/user_info_serializer.rb
214
+ - lib/yiffspace/serializers/user_resolvable_serializer.rb
203
215
  - lib/yiffspace/utils.rb
204
216
  - lib/yiffspace/utils/cache.rb
205
217
  - lib/yiffspace/utils/current.rb
@@ -215,6 +227,7 @@ files:
215
227
  - lib/yiffspace/utils/user_attribute.rb
216
228
  - lib/yiffspace/utils/user_like.rb
217
229
  - lib/yiffspace/utils/user_resolvable.rb
230
+ - lib/yiffspace/utils/user_to_id.rb
218
231
  - lib/yiffspace/version.rb
219
232
  homepage: https://yiff.space
220
233
  licenses: