yiffspace 0.0.5 → 0.0.6

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: 5cbda883d136414b49a7ffe70ab70113d0423ca94ae9e35a7dc7d8cb4a6f816c
4
+ data.tar.gz: d1d0ad88b39084283699c695830e6f7125725b7045257672778274a7775fbc4a
5
5
  SHA512:
6
- metadata.gz: 7784ddb66524eee1542651e0f70f3ae64a7e6cf297083307f2a4b21d493a2baad3982a4af406c7336932a30de42019647810fcbcac17c037649d0d2fd66be72f
7
- data.tar.gz: 0b5c0786bb0fb67a416400a42c22fa89488449343b0362a2c1f848b20766baf9481bcf3cc106b613786e00f7f6f8566168408efcbb507a783dae3ff6898ea8e5
6
+ metadata.gz: 7d9c72aaaa819e075b3cb8614daabf1c3ae954518a94a59f1004cdb2e2b1216c5af92bba85f1ab5ed564c927184b419e09303f4f1ddab5453ec1559e07ace884
7
+ data.tar.gz: 90cee9392c9ffb65f924a32e5bc8ef04bc7b6d5bc358961a47a88355f5b2601e43aacd3334abcdf8f0ca722f138a124e31b757a58b0fc8b0f15c68db5010dbf4
@@ -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,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module YiffSpace
4
+ module Concerns
5
+ module UserResolvableMethods
6
+ def resolvable(ip_addr = nil)
7
+ UserResolvable.new(self, ip_addr || send(YiffSpace.config.last_ip_addr_attribute) || YiffSpace.config.default_ip_address)
8
+ end
9
+
10
+ def resolve
11
+ self
12
+ end
13
+
14
+ def is?(user_or_id)
15
+ id == u2id(user_or_id)
16
+ end
17
+
18
+ def ==(other)
19
+ return super if other.is_a?(YiffSpace.config.user_class)
20
+
21
+ other.is_a?(YiffSpace.config.user_resolvable_class) && super(other.user)
22
+ end
23
+
24
+ def ===(other)
25
+ other == YiffSpace.config.user_like_class || super
26
+ end
27
+
28
+ def is_a?(other)
29
+ other == YiffSpace.config.user_like_class || super
30
+ end
31
+
32
+ include(YiffSpace::Utils::UserToId)
33
+
34
+ private(:u2id)
35
+ end
36
+ end
37
+ end
@@ -36,9 +36,12 @@ module YiffSpace
36
36
  # Default: -> { (user_class || ::User).system }
37
37
  attr_writer(:system_user_getter)
38
38
 
39
- # The anonymous user name
39
+ # The anonymous user's name, can be a proc
40
40
  attr_reader(:anonymous_user_name)
41
41
 
42
+ # The `last_ip_addr` attribute of the User model, used by the UserResolvableMethods concern
43
+ attr_accessor(:last_ip_addr_attribute)
44
+
42
45
  def initialize
43
46
  @max_multi_count = -> { 100 }
44
47
  @redis_url = -> {}
@@ -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
@@ -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.6"
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.6
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: