yiffspace 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.
Files changed (77) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +0 -0
  3. data/LICENSE +20 -0
  4. data/README.md +25 -0
  5. data/Rakefile +10 -0
  6. data/app/assets/config/yiff_space_manifest.js +1 -0
  7. data/app/assets/stylesheets/yiff_space/application.css +30 -0
  8. data/app/controllers/yiff_space/application_controller.rb +6 -0
  9. data/app/helpers/yiff_space/application_helper.rb +6 -0
  10. data/app/helpers/yiff_space/auth_helper.rb +6 -0
  11. data/app/models/yiff_space/application_record.rb +7 -0
  12. data/app/views/layouts/yiff_space/application.html.erb +17 -0
  13. data/app/views/yiff_space/error.html.erb +3 -0
  14. data/engines/auth/app/controllers/yiff_space/auth/application_controller.rb +11 -0
  15. data/engines/auth/app/controllers/yiff_space/auth/root_controller.rb +67 -0
  16. data/engines/auth/app/views/yiff_space/auth/root/permissions.html.erb +14 -0
  17. data/engines/auth/config/routes.rb +11 -0
  18. data/lib/tasks/yiff_space_tasks.rake +6 -0
  19. data/lib/yiffspace/auth/auth_info/anonymous.rb +64 -0
  20. data/lib/yiffspace/auth/auth_info.rb +74 -0
  21. data/lib/yiffspace/auth/client.rb +58 -0
  22. data/lib/yiffspace/auth/discord_info.rb +63 -0
  23. data/lib/yiffspace/auth/engine.rb +57 -0
  24. data/lib/yiffspace/auth/helper.rb +167 -0
  25. data/lib/yiffspace/auth/permissions.rb +85 -0
  26. data/lib/yiffspace/auth/set_client_name.rb +15 -0
  27. data/lib/yiffspace/auth/user_info/anonymous.rb +72 -0
  28. data/lib/yiffspace/auth/user_info.rb +91 -0
  29. data/lib/yiffspace/auth.rb +84 -0
  30. data/lib/yiffspace/config_builder.rb +189 -0
  31. data/lib/yiffspace/configuration/images.rb +22 -0
  32. data/lib/yiffspace/configuration.rb +30 -0
  33. data/lib/yiffspace/core_ext/action_dispatch/set_auth_client/scoped.rb +13 -0
  34. data/lib/yiffspace/core_ext/action_dispatch/set_auth_client.rb +13 -0
  35. data/lib/yiffspace/core_ext/active_record/all.rb +3 -0
  36. data/lib/yiffspace/core_ext/active_record/where_chain.rb +6 -0
  37. data/lib/yiffspace/core_ext/all.rb +8 -0
  38. data/lib/yiffspace/core_ext/arel/all.rb +4 -0
  39. data/lib/yiffspace/core_ext/arel/cross_join_lateral.rb +21 -0
  40. data/lib/yiffspace/core_ext/arel/left_join_lateral.rb +21 -0
  41. data/lib/yiffspace/core_ext/enumerable/all.rb +3 -0
  42. data/lib/yiffspace/core_ext/enumerable/parallel.rb +7 -0
  43. data/lib/yiffspace/core_ext/hash/all.rb +3 -0
  44. data/lib/yiffspace/core_ext/hash/to_open_hash.rb +7 -0
  45. data/lib/yiffspace/core_ext/open_hash.rb +3 -0
  46. data/lib/yiffspace/core_ext/string/all.rb +5 -0
  47. data/lib/yiffspace/core_ext/string/sql.rb +7 -0
  48. data/lib/yiffspace/core_ext/string/to_b.rb +7 -0
  49. data/lib/yiffspace/core_ext/string/truthy_falsy.rb +7 -0
  50. data/lib/yiffspace/extensions/action_dispatch/set_auth_client/scoped.rb +15 -0
  51. data/lib/yiffspace/extensions/action_dispatch/set_auth_client.rb +13 -0
  52. data/lib/yiffspace/extensions/active_record/where_chain.rb +107 -0
  53. data/lib/yiffspace/extensions/arel/nodes/cross_join_lateral.rb +17 -0
  54. data/lib/yiffspace/extensions/arel/nodes/left_join_lateral.rb +17 -0
  55. data/lib/yiffspace/extensions/arel/table/cross_join_lateral.rb +15 -0
  56. data/lib/yiffspace/extensions/arel/table/left_join_lateral.rb +15 -0
  57. data/lib/yiffspace/extensions/arel/visitors/postgresql/cross_join_lateral.rb +19 -0
  58. data/lib/yiffspace/extensions/arel/visitors/postgresql/left_join_lateral.rb +23 -0
  59. data/lib/yiffspace/extensions/enumerable/parallel.rb +39 -0
  60. data/lib/yiffspace/extensions/hash/to_open_hash.rb +15 -0
  61. data/lib/yiffspace/extensions/string/sql.rb +21 -0
  62. data/lib/yiffspace/extensions/string/to_b.rb +13 -0
  63. data/lib/yiffspace/extensions/string/truthy_falsy.rb +17 -0
  64. data/lib/yiffspace/images/avatar/base.rb +26 -0
  65. data/lib/yiffspace/images/avatar/discord.rb +37 -0
  66. data/lib/yiffspace/images/avatar/gravatar.rb +21 -0
  67. data/lib/yiffspace/images/avatar.rb +29 -0
  68. data/lib/yiffspace/images/banner/base.rb +26 -0
  69. data/lib/yiffspace/images/banner/discord.rb +37 -0
  70. data/lib/yiffspace/images/banner.rb +29 -0
  71. data/lib/yiffspace/images.rb +6 -0
  72. data/lib/yiffspace/utils/open_hash.rb +54 -0
  73. data/lib/yiffspace/utils/set_env_constraint.rb +18 -0
  74. data/lib/yiffspace/utils.rb +6 -0
  75. data/lib/yiffspace/version.rb +5 -0
  76. data/lib/yiffspace.rb +11 -0
  77. metadata +176 -0
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require("httparty")
4
+
5
+ module YiffSpace
6
+ module Images
7
+ module Avatar
8
+ class Gravatar < Base
9
+ def self.type = :gravatar
10
+
11
+ def initialize(id)
12
+ super(id, self.class.type)
13
+ end
14
+
15
+ def url
16
+ "#{YiffSpace.config.images.server_url}/avatar/gravatar/#{id}"
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module YiffSpace
4
+ module Images
5
+ module Avatar
6
+ module_function
7
+
8
+ def default_for(id)
9
+ type = YiffSpace.config.images.default_avatar_type
10
+ get_for(id, type)
11
+ end
12
+
13
+ def get_for(id, type)
14
+ klass = find_type(type)
15
+ raise(StandardError, "No avatar class for type: #{type}") if klass.nil?
16
+
17
+ klass.new(id)
18
+ end
19
+
20
+ def find_type(type)
21
+ constants.map { |c| [c, const_get(c)] }.find do |_const, value|
22
+ next unless value < Base
23
+
24
+ value.try(:type)&.to_sym == type.to_sym
25
+ end&.second
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module YiffSpace
4
+ module Images
5
+ module Banner
6
+ class Base
7
+ def self.type = nil
8
+
9
+ attr_reader(:id, :type)
10
+
11
+ def initialize(id, type)
12
+ @id = id
13
+ @type = type
14
+ end
15
+
16
+ def url
17
+ raise(NotImplementedError)
18
+ end
19
+
20
+ def update(*)
21
+ raise(NotImplementedError)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require("httparty")
4
+
5
+ module YiffSpace
6
+ module Images
7
+ module Banner
8
+ class Discord < Base
9
+ def self.type = :discord
10
+
11
+ def initialize(id)
12
+ super(id, self.class.type)
13
+ end
14
+
15
+ def url
16
+ "#{YiffSpace.config.images.server_url}/banner/discord/#{id}"
17
+ end
18
+
19
+ def update(hash)
20
+ raise(StandardError, "images.update_token config option must be set to use banner update") if YiffSpace.config.images.update_token.blank?
21
+
22
+ response = HTTParty.post("#{YiffSpace.config.images.server_url}/banner/discord/update/#{id}",
23
+ YiffSpace.config.images.httparty_options.deep_merge(
24
+ headers: {
25
+ "Authorization" => "Bearer #{YiffSpace.config.images.update_token}",
26
+ "Content-Type" => "application/json",
27
+ },
28
+ body: { hash: hash }.to_json,
29
+ ))
30
+ Rails.logger.error("banner update failed: #{response.to_json}") unless response.key?("updated")
31
+
32
+ response.fetch("updated", false)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module YiffSpace
4
+ module Images
5
+ module Banner
6
+ module_function
7
+
8
+ def default_for(id)
9
+ type = YiffSpace.config.images.default_banner_type
10
+ get_for(id, type)
11
+ end
12
+
13
+ def get_for(id, type)
14
+ klass = find_type(type)
15
+ raise(StandardError, "No banner class for type: #{type}") if klass.nil?
16
+
17
+ klass.new(id)
18
+ end
19
+
20
+ def find_type(type)
21
+ constants.map { |c| [c, const_get(c)] }.find do |_const, value|
22
+ next unless value < Base
23
+
24
+ value.try(:type)&.to_sym == type.to_sym
25
+ end&.second
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module YiffSpace
4
+ module Images
5
+ end
6
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require("active_support/hash_with_indifferent_access")
4
+
5
+ module YiffSpace
6
+ module Utils
7
+ class OpenHash < ActiveSupport::HashWithIndifferentAccess
8
+ def initialize(constructor = nil, respond_to_missing: true)
9
+ super(constructor)
10
+ @respond_to_missing = respond_to_missing
11
+ end
12
+
13
+ def respond_to_missing?(name, include_private = false)
14
+ return true if @respond_to_missing
15
+
16
+ name = name.to_s
17
+ key?(name) || name.end_with?("=") || super
18
+ end
19
+
20
+ def method_missing(name, *args)
21
+ if name.end_with?("=")
22
+ public_send(:[]=, name.to_s.chomp("=").to_sym, args.first)
23
+ elsif key?(name)
24
+ public_send(:[], name)
25
+ elsif @respond_to_missing
26
+ nil
27
+ else
28
+ super
29
+ end
30
+ end
31
+
32
+ def self.from(hash = nil, recursive: true, respond_to_missing: true, **kwargs)
33
+ hash = kwargs if hash.nil? && kwargs.any?
34
+ raise(ArgumentError, "no hash provided") if hash.nil?
35
+
36
+ oh = OpenHash.new(respond_to_missing: respond_to_missing)
37
+ hash.each do |key, value|
38
+ if recursive && value.is_a?(Hash)
39
+ oh[key] = OpenHash.from(value, recursive: recursive)
40
+ elsif recursive && value.is_a?(Array)
41
+ oh[key] = value.map { |v| v.is_a?(Hash) ? OpenHash.from(v, recursive: recursive, respond_to_missing: respond_to_missing) : v }
42
+ else
43
+ oh[key] = value
44
+ end
45
+ end
46
+ oh
47
+ end
48
+
49
+ def self.from_array(items, **)
50
+ items.map { |item| from(item, **) }
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module YiffSpace
4
+ module Utils
5
+ class SetEnvConstraint
6
+ attr_reader(:key, :value)
7
+
8
+ def initialize(key, value)
9
+ @key = key.to_s
10
+ @value = value
11
+ end
12
+
13
+ def matches?(request)
14
+ request.env[key.to_s] = value
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module YiffSpace
4
+ module Utils
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module YiffSpace
4
+ VERSION = "0.0.1"
5
+ end
data/lib/yiffspace.rb ADDED
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module YiffSpace
4
+ end
5
+
6
+ require("zeitwerk")
7
+
8
+ loader = Zeitwerk::Loader.for_gem
9
+ loader.inflector.inflect({ "postgresql" => "PostgreSQL", "yiffspace" => "YiffSpace" })
10
+ loader.ignore("#{__dir__}/yiffspace/core_ext")
11
+ loader.setup
metadata ADDED
@@ -0,0 +1,176 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: yiffspace
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Donovan_DMC
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 2026-05-07 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: httparty
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0.24'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0.24'
26
+ - !ruby/object:Gem::Dependency
27
+ name: openid_connect
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '2.3'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '2.3'
40
+ - !ruby/object:Gem::Dependency
41
+ name: rails
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '7.1'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '7.1'
54
+ - !ruby/object:Gem::Dependency
55
+ name: zeitwerk
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '2.6'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '2.6'
68
+ description: Collection of ruby code for https://yiff.space and related projects
69
+ email:
70
+ - hewwo@yiff.rocks
71
+ executables: []
72
+ extensions: []
73
+ extra_rdoc_files: []
74
+ files:
75
+ - CHANGELOG.md
76
+ - LICENSE
77
+ - README.md
78
+ - Rakefile
79
+ - app/assets/config/yiff_space_manifest.js
80
+ - app/assets/stylesheets/yiff_space/application.css
81
+ - app/controllers/yiff_space/application_controller.rb
82
+ - app/helpers/yiff_space/application_helper.rb
83
+ - app/helpers/yiff_space/auth_helper.rb
84
+ - app/models/yiff_space/application_record.rb
85
+ - app/views/layouts/yiff_space/application.html.erb
86
+ - app/views/yiff_space/error.html.erb
87
+ - engines/auth/app/controllers/yiff_space/auth/application_controller.rb
88
+ - engines/auth/app/controllers/yiff_space/auth/root_controller.rb
89
+ - engines/auth/app/views/yiff_space/auth/root/permissions.html.erb
90
+ - engines/auth/config/routes.rb
91
+ - lib/tasks/yiff_space_tasks.rake
92
+ - lib/yiffspace.rb
93
+ - lib/yiffspace/auth.rb
94
+ - lib/yiffspace/auth/auth_info.rb
95
+ - lib/yiffspace/auth/auth_info/anonymous.rb
96
+ - lib/yiffspace/auth/client.rb
97
+ - lib/yiffspace/auth/discord_info.rb
98
+ - lib/yiffspace/auth/engine.rb
99
+ - lib/yiffspace/auth/helper.rb
100
+ - lib/yiffspace/auth/permissions.rb
101
+ - lib/yiffspace/auth/set_client_name.rb
102
+ - lib/yiffspace/auth/user_info.rb
103
+ - lib/yiffspace/auth/user_info/anonymous.rb
104
+ - lib/yiffspace/config_builder.rb
105
+ - lib/yiffspace/configuration.rb
106
+ - lib/yiffspace/configuration/images.rb
107
+ - lib/yiffspace/core_ext/action_dispatch/set_auth_client.rb
108
+ - lib/yiffspace/core_ext/action_dispatch/set_auth_client/scoped.rb
109
+ - lib/yiffspace/core_ext/active_record/all.rb
110
+ - lib/yiffspace/core_ext/active_record/where_chain.rb
111
+ - lib/yiffspace/core_ext/all.rb
112
+ - lib/yiffspace/core_ext/arel/all.rb
113
+ - lib/yiffspace/core_ext/arel/cross_join_lateral.rb
114
+ - lib/yiffspace/core_ext/arel/left_join_lateral.rb
115
+ - lib/yiffspace/core_ext/enumerable/all.rb
116
+ - lib/yiffspace/core_ext/enumerable/parallel.rb
117
+ - lib/yiffspace/core_ext/hash/all.rb
118
+ - lib/yiffspace/core_ext/hash/to_open_hash.rb
119
+ - lib/yiffspace/core_ext/open_hash.rb
120
+ - lib/yiffspace/core_ext/string/all.rb
121
+ - lib/yiffspace/core_ext/string/sql.rb
122
+ - lib/yiffspace/core_ext/string/to_b.rb
123
+ - lib/yiffspace/core_ext/string/truthy_falsy.rb
124
+ - lib/yiffspace/extensions/action_dispatch/set_auth_client.rb
125
+ - lib/yiffspace/extensions/action_dispatch/set_auth_client/scoped.rb
126
+ - lib/yiffspace/extensions/active_record/where_chain.rb
127
+ - lib/yiffspace/extensions/arel/nodes/cross_join_lateral.rb
128
+ - lib/yiffspace/extensions/arel/nodes/left_join_lateral.rb
129
+ - lib/yiffspace/extensions/arel/table/cross_join_lateral.rb
130
+ - lib/yiffspace/extensions/arel/table/left_join_lateral.rb
131
+ - lib/yiffspace/extensions/arel/visitors/postgresql/cross_join_lateral.rb
132
+ - lib/yiffspace/extensions/arel/visitors/postgresql/left_join_lateral.rb
133
+ - lib/yiffspace/extensions/enumerable/parallel.rb
134
+ - lib/yiffspace/extensions/hash/to_open_hash.rb
135
+ - lib/yiffspace/extensions/string/sql.rb
136
+ - lib/yiffspace/extensions/string/to_b.rb
137
+ - lib/yiffspace/extensions/string/truthy_falsy.rb
138
+ - lib/yiffspace/images.rb
139
+ - lib/yiffspace/images/avatar.rb
140
+ - lib/yiffspace/images/avatar/base.rb
141
+ - lib/yiffspace/images/avatar/discord.rb
142
+ - lib/yiffspace/images/avatar/gravatar.rb
143
+ - lib/yiffspace/images/banner.rb
144
+ - lib/yiffspace/images/banner/base.rb
145
+ - lib/yiffspace/images/banner/discord.rb
146
+ - lib/yiffspace/utils.rb
147
+ - lib/yiffspace/utils/open_hash.rb
148
+ - lib/yiffspace/utils/set_env_constraint.rb
149
+ - lib/yiffspace/version.rb
150
+ homepage: https://yiff.space
151
+ licenses:
152
+ - MIT
153
+ metadata:
154
+ allowed_push_host: https://rubygems.org
155
+ homepage_uri: https://yiff.space
156
+ source_code_uri: https://github.com/YiffSpace/Gem
157
+ changelog_uri: https://github.com/YiffSpace/Gem/blob/master/CHANGELOG.md
158
+ rubygems_mfa_required: 'true'
159
+ rdoc_options: []
160
+ require_paths:
161
+ - lib
162
+ required_ruby_version: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: 3.4.1
167
+ required_rubygems_version: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ requirements: []
173
+ rubygems_version: 3.6.2
174
+ specification_version: 4
175
+ summary: Collection of ruby code for https://yiff.space and related projects
176
+ test_files: []