yiffspace 0.1.7 → 0.2.0

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 (127) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -10
  3. data/README.md +18 -1
  4. data/Rakefile +6 -7
  5. data/lib/yiffspace/version.rb +1 -1
  6. data/lib/yiffspace.rb +26 -27
  7. metadata +104 -139
  8. data/app/assets/config/yiffspace_manifest.js +0 -1
  9. data/app/assets/stylesheets/yiffspace/application.css +0 -30
  10. data/app/controllers/yiff_space/application_controller.rb +0 -6
  11. data/app/helpers/yiff_space/application_helper.rb +0 -6
  12. data/app/models/yiff_space/application_record.rb +0 -7
  13. data/app/views/layouts/yiff_space/application.html.erb +0 -17
  14. data/app/views/yiff_space/error.html.erb +0 -3
  15. data/lib/yiffspace/concerns/active_record_extensions.rb +0 -45
  16. data/lib/yiffspace/concerns/api_methods.rb +0 -101
  17. data/lib/yiffspace/concerns/attribute_matchers.rb +0 -100
  18. data/lib/yiffspace/concerns/attribute_methods.rb +0 -39
  19. data/lib/yiffspace/concerns/concurrency_methods.rb +0 -20
  20. data/lib/yiffspace/concerns/conditional_includes.rb +0 -43
  21. data/lib/yiffspace/concerns/current_methods.rb +0 -60
  22. data/lib/yiffspace/concerns/has_bit_flags.rb +0 -59
  23. data/lib/yiffspace/concerns/user_class_methods.rb +0 -32
  24. data/lib/yiffspace/concerns/user_methods.rb +0 -77
  25. data/lib/yiffspace/concerns/user_name_methods.rb +0 -53
  26. data/lib/yiffspace/concerns/user_resolvable_methods.rb +0 -38
  27. data/lib/yiffspace/config_builder.rb +0 -192
  28. data/lib/yiffspace/configuration/images.rb +0 -22
  29. data/lib/yiffspace/configuration.rb +0 -116
  30. data/lib/yiffspace/core_ext/active_record/all.rb +0 -8
  31. data/lib/yiffspace/core_ext/active_record/cross_join_lateral.rb +0 -7
  32. data/lib/yiffspace/core_ext/active_record/cross_unnest.rb +0 -7
  33. data/lib/yiffspace/core_ext/active_record/left_join_lateral.rb +0 -7
  34. data/lib/yiffspace/core_ext/active_record/left_unnest.rb +0 -7
  35. data/lib/yiffspace/core_ext/active_record/unnest.rb +0 -8
  36. data/lib/yiffspace/core_ext/active_record/where_chain.rb +0 -6
  37. data/lib/yiffspace/core_ext/all.rb +0 -8
  38. data/lib/yiffspace/core_ext/arel/all.rb +0 -4
  39. data/lib/yiffspace/core_ext/arel/cross_join_lateral.rb +0 -21
  40. data/lib/yiffspace/core_ext/arel/left_join_lateral.rb +0 -21
  41. data/lib/yiffspace/core_ext/enumerable/all.rb +0 -3
  42. data/lib/yiffspace/core_ext/enumerable/parallel.rb +0 -7
  43. data/lib/yiffspace/core_ext/hash/all.rb +0 -3
  44. data/lib/yiffspace/core_ext/hash/to_open_hash.rb +0 -7
  45. data/lib/yiffspace/core_ext/object/all.rb +0 -4
  46. data/lib/yiffspace/core_ext/object/to_b.rb +0 -7
  47. data/lib/yiffspace/core_ext/object/truthy_falsy.rb +0 -7
  48. data/lib/yiffspace/core_ext/string/all.rb +0 -3
  49. data/lib/yiffspace/core_ext/string/sql.rb +0 -7
  50. data/lib/yiffspace/engine.rb +0 -23
  51. data/lib/yiffspace/extensions/active_record/cross_join_lateral.rb +0 -23
  52. data/lib/yiffspace/extensions/active_record/cross_unnest.rb +0 -15
  53. data/lib/yiffspace/extensions/active_record/left_join_lateral.rb +0 -24
  54. data/lib/yiffspace/extensions/active_record/left_unnest.rb +0 -15
  55. data/lib/yiffspace/extensions/active_record/unnest.rb +0 -20
  56. data/lib/yiffspace/extensions/active_record/where_chain.rb +0 -107
  57. data/lib/yiffspace/extensions/arel/nodes/cross_join_lateral.rb +0 -17
  58. data/lib/yiffspace/extensions/arel/nodes/left_join_lateral.rb +0 -17
  59. data/lib/yiffspace/extensions/arel/table/cross_join_lateral.rb +0 -15
  60. data/lib/yiffspace/extensions/arel/table/left_join_lateral.rb +0 -15
  61. data/lib/yiffspace/extensions/arel/visitors/postgresql/cross_join_lateral.rb +0 -19
  62. data/lib/yiffspace/extensions/arel/visitors/postgresql/left_join_lateral.rb +0 -23
  63. data/lib/yiffspace/extensions/enumerable/parallel.rb +0 -39
  64. data/lib/yiffspace/extensions/hash/to_open_hash.rb +0 -15
  65. data/lib/yiffspace/extensions/object/to_b.rb +0 -22
  66. data/lib/yiffspace/extensions/object/truthy_falsy.rb +0 -35
  67. data/lib/yiffspace/extensions/string/sql.rb +0 -21
  68. data/lib/yiffspace/images/avatar/base.rb +0 -41
  69. data/lib/yiffspace/images/avatar/discord.rb +0 -37
  70. data/lib/yiffspace/images/avatar/gravatar.rb +0 -21
  71. data/lib/yiffspace/images/avatar.rb +0 -33
  72. data/lib/yiffspace/images/banner/base.rb +0 -41
  73. data/lib/yiffspace/images/banner/discord.rb +0 -37
  74. data/lib/yiffspace/images/banner.rb +0 -33
  75. data/lib/yiffspace/images.rb +0 -6
  76. data/lib/yiffspace/include/active_record_extensions.rb +0 -5
  77. data/lib/yiffspace/include/all.rb +0 -31
  78. data/lib/yiffspace/include/api_methods.rb +0 -5
  79. data/lib/yiffspace/include/attribute_matchers.rb +0 -5
  80. data/lib/yiffspace/include/attribute_methods.rb +0 -5
  81. data/lib/yiffspace/include/cache.rb +0 -5
  82. data/lib/yiffspace/include/concurrency_methods.rb +0 -5
  83. data/lib/yiffspace/include/conditional_includes.rb +0 -5
  84. data/lib/yiffspace/include/current.rb +0 -5
  85. data/lib/yiffspace/include/current_methods.rb +0 -5
  86. data/lib/yiffspace/include/duration_parser.rb +0 -5
  87. data/lib/yiffspace/include/has_bit_flags.rb +0 -5
  88. data/lib/yiffspace/include/helpers.rb +0 -5
  89. data/lib/yiffspace/include/open_hash.rb +0 -5
  90. data/lib/yiffspace/include/parameter_builder.rb +0 -5
  91. data/lib/yiffspace/include/parse_value.rb +0 -5
  92. data/lib/yiffspace/include/query_builder.rb +0 -5
  93. data/lib/yiffspace/include/query_dsl.rb +0 -5
  94. data/lib/yiffspace/include/query_helper.rb +0 -5
  95. data/lib/yiffspace/include/routes.rb +0 -5
  96. data/lib/yiffspace/include/table_builder.rb +0 -5
  97. data/lib/yiffspace/include/trace_logger.rb +0 -5
  98. data/lib/yiffspace/include/u2id.rb +0 -5
  99. data/lib/yiffspace/include/user_attribute.rb +0 -5
  100. data/lib/yiffspace/include/user_class_methods.rb +0 -5
  101. data/lib/yiffspace/include/user_like.rb +0 -5
  102. data/lib/yiffspace/include/user_methods.rb +0 -5
  103. data/lib/yiffspace/include/user_name_methods.rb +0 -5
  104. data/lib/yiffspace/include/user_resolvable.rb +0 -5
  105. data/lib/yiffspace/include/user_resolvable_methods.rb +0 -5
  106. data/lib/yiffspace/search/query_builder.rb +0 -83
  107. data/lib/yiffspace/search/query_dsl.rb +0 -119
  108. data/lib/yiffspace/search/query_helper.rb +0 -49
  109. data/lib/yiffspace/serializers/avatar_serializer.rb +0 -21
  110. data/lib/yiffspace/serializers/banner_serializer.rb +0 -21
  111. data/lib/yiffspace/serializers/user_resolvable_serializer.rb +0 -21
  112. data/lib/yiffspace/utils/cache.rb +0 -40
  113. data/lib/yiffspace/utils/current.rb +0 -43
  114. data/lib/yiffspace/utils/duration_parser.rb +0 -24
  115. data/lib/yiffspace/utils/helpers.rb +0 -25
  116. data/lib/yiffspace/utils/open_hash.rb +0 -63
  117. data/lib/yiffspace/utils/parameter_builder.rb +0 -121
  118. data/lib/yiffspace/utils/parse_value.rb +0 -174
  119. data/lib/yiffspace/utils/routes.rb +0 -28
  120. data/lib/yiffspace/utils/set_env_constraint.rb +0 -18
  121. data/lib/yiffspace/utils/table_builder.rb +0 -169
  122. data/lib/yiffspace/utils/trace_logger.rb +0 -91
  123. data/lib/yiffspace/utils/user_attribute.rb +0 -272
  124. data/lib/yiffspace/utils/user_like.rb +0 -8
  125. data/lib/yiffspace/utils/user_resolvable.rb +0 -61
  126. data/lib/yiffspace/utils/user_to_id.rb +0 -11
  127. data/lib/yiffspace/utils.rb +0 -6
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative("../utils/cache")
4
-
5
- Cache = YiffSpace::Utils::Cache
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative("../concerns/active_record_extensions")
4
-
5
- ConcurrencyMethods = YiffSpace::Concerns::ConcurrencyMethods
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative("../concerns/conditional_includes")
4
-
5
- ConditionalIncludes = YiffSpace::Concerns::ConditionalIncludes
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative("../utils/current")
4
-
5
- Current = YiffSpace::Utils::Current
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative("../concerns/current_methods")
4
-
5
- CurrentMethods = YiffSpace::Concerns::CurrentMethods
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative("../utils/duration_parser")
4
-
5
- DurationParser = YiffSpace::Utils::DurationParser
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative("../concerns/has_bit_flags")
4
-
5
- HasBitFlags = YiffSpace::Concerns::HasBitFlags
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative("../utils/helpers")
4
-
5
- Helpers = YiffSpace::Utils::Helpers
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative("../utils/open_hash")
4
-
5
- OpenHash = YiffSpace::Utils::OpenHash
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative("../utils/parameter_builder")
4
-
5
- ParameterBuilder = YiffSpace::Utils::ParameterBuilder
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative("../utils/parse_value")
4
-
5
- ParseValue = YiffSpace::Utils::ParseValue
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative("../search/query_builder")
4
-
5
- QueryBuilder = YiffSpace::Search::QueryBuilder
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative("../search/query_dsl")
4
-
5
- QueryDSL = YiffSpace::Search::QueryDSL
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative("../search/query_helper")
4
-
5
- QueryHelper = YiffSpace::Search::QueryHelper
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative("../utils/routes")
4
-
5
- Routes = YiffSpace::Utils::Routes
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative("../utils/table_builder")
4
-
5
- TableBuilder = YiffSpace::Utils::TableBuilder
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative("../utils/trace_logger")
4
-
5
- TraceLogger = YiffSpace::Utils::TraceLogger
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative("../utils/user_to_id")
4
-
5
- include(YiffSpace::Utils::UserToId) # rubocop:disable Style/MixinUsage
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative("../utils/user_attribute")
4
-
5
- UserAttribute = YiffSpace::Utils::UserAttribute
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative("../concerns/user_class_methods")
4
-
5
- UserClassMethods = YiffSpace::Concerns::UserClassMethods
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative("../utils/user_like")
4
-
5
- UserLike = YiffSpace::Utils::UserLike
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative("../concerns/user_methods")
4
-
5
- UserMethods = YiffSpace::Concerns::UserMethods
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative("../concerns/user_name_methods")
4
-
5
- UserNameMethods = YiffSpace::Concerns::UserNameMethods
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative("../utils/user_resolvable")
4
-
5
- UserResolvable = YiffSpace::Utils::UserResolvable
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative("../concerns/user_resolvable_methods")
4
-
5
- UserResolvableMethods = YiffSpace::Concerns::UserResolvableMethods
@@ -1,83 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module YiffSpace
4
- module Search
5
- class QueryBuilder
6
- attr_reader(:dsl, :klass, :relation, :user, :q)
7
-
8
- # [param, db_field, type]
9
- def initialize(dsl, klass, relation, user)
10
- dsl ||= []
11
- @dsl = dsl
12
- @klass = klass
13
- @relation = relation
14
- @user = user
15
- @q = relation
16
- end
17
-
18
- def process_dsl(dsl, params)
19
- dsl[:fields].each do |param, field, type = nil, block = nil, options = {}|
20
- value = params[param]
21
- multi = options.fetch(:multi, nil) || false
22
- like = options.fetch(:like, nil) || false
23
- ilike = options.fetch(:ilike, nil) || false
24
- normalize = options.fetch(:normalize, nil) || ->(value) { value }
25
- next if value.nil?
26
-
27
- value = normalize.call(value)
28
- @q = block.call(q) if block
29
- if type.is_a?(Proc)
30
- args = [q, value, user, params]
31
- @q = type.call(*args.first(type.arity))
32
- next
33
- end
34
- field ||= param
35
- if like
36
- @q = q.where.like(field => value)
37
- next
38
- elsif ilike
39
- @q = q.where.ilike(field => value)
40
- next
41
- end
42
- type ||= QueryHelper.get_column(field, klass.table_name).sql_type_metadata.type
43
- case type
44
- when :boolean
45
- @q = q.boolean_attribute_matches(field, value)
46
- when :integer
47
- # multiple comma separated values are implicitly supported
48
- # trimming them seems unneeded
49
- # value = value[0.. value.index(",") - 1] unless multi
50
- @q = q.numeric_attribute_matches(field, value)
51
- when :datetime
52
- @q = q.datetime_attribute_matches(field, value)
53
- when :text, :string
54
- value = value.split(",").first(YiffSpace.config.max_multi_count.call) if multi # explicitly supports arrays
55
- @q = q.text_attribute_matches(field, value)
56
- when :inet
57
- @q = q.ip_attribute_matches(field, value)
58
- when :present
59
- @q = q.attribute_present(field, value)
60
- else
61
- raise(ArgumentError, "Unknown type: #{type} for field: #{field}")
62
- end
63
- end
64
-
65
- dsl[:associations].each do |attribute, klass, nested_dsl, join|
66
- next if params[attribute].nil?
67
-
68
- @q = q.joins(join)
69
- nested_relation = klass.all
70
- nested_builder = QueryBuilder.new(nested_dsl, klass, nested_relation, user)
71
- nested_relation = nested_builder.search(params[attribute])
72
- @q = q.merge(nested_relation)
73
- end
74
- end
75
-
76
- def search(params = {})
77
- params.transform_keys!(&:to_sym)
78
- process_dsl(dsl, params)
79
- q
80
- end
81
- end
82
- end
83
- end
@@ -1,119 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module YiffSpace
4
- module Search
5
- class QueryDSL
6
- attr_accessor(:relation, :fields, :associations, :no_id, :no_dates)
7
-
8
- # [param, field, type/proc, Proc(relation)]
9
- def initialize(relation)
10
- @relation = relation
11
- @fields = []
12
- @associations = []
13
- @no_id = false
14
- @no_dates = false
15
- end
16
-
17
- def custom(param, proc, not: false, multi: false, &block)
18
- @fields << [param, nil, proc, block, { not: binding.local_variable_get(:not), multi: multi }]
19
- self
20
- end
21
-
22
- def field(param, db_field = param, type = nil, not: false, multi: false, wildcard: false, like: false, ilike: false, normalize: nil, &block)
23
- type ||= QueryHelper.get_column(db_field, relation.table_name).sql_type_metadata.type
24
- @fields << [param, db_field, type, block, { not: binding.local_variable_get(:not), multi: multi, wildcard: wildcard, like: like, ilike: ilike, normalize: normalize }]
25
- self
26
- end
27
-
28
- def user(param, association = nil, not: false, &)
29
- if param.is_a?(Array)
30
- raise(ArgumentError, "You must specify an association when passing an array of parameters") if association.nil?
31
- else
32
- association ||= param
33
- param = [:"#{param}_id", :"#{param}_name"]
34
- end
35
-
36
- case association
37
- when Symbol, String
38
- association = association.to_sym
39
- associations = relation.reflect_on_all_associations(:belongs_to).map(&:name)
40
- if associations.include?(association)
41
- column = association_column(association)
42
- else
43
- column = association
44
- end
45
- when Array
46
- column = association.first
47
- association = association.second
48
- end
49
- field(param.first, column, not: binding.local_variable_get(:not), &) if param.first
50
- custom(param.second, ->(q, v) { q.user_name_matches(association, v) }, not: binding.local_variable_get(:not), &) if param.second
51
- self
52
- end
53
-
54
- def present(param, db_field = param, &)
55
- field(param, db_field, :present, &)
56
- end
57
-
58
- # [attribute, class, dsl, join]
59
- def association(*args, **kwargs)
60
- if args.any?
61
- attribute = args.first
62
- as = args.second || attribute
63
- ref = relation.reflect_on_association(attribute)
64
- raise("Association #{attribute} does not exist on #{relation.name}") if ref.nil?
65
-
66
- klass = ref.klass
67
- dsl = klass.query_dsl.build
68
- @associations << [as, klass, dsl, attribute]
69
- user_class = YiffSpace.config.user_class
70
- user(as, attribute) if klass == user_class && @fields.none? { |f| f.second == association_column(attribute) }
71
- elsif kwargs.any?
72
- attribute = kwargs.delete(:as)
73
- to_array = lambda { |h|
74
- k, v = h.first
75
- [k, v.is_a?(Hash) ? to_array.call(v) : v].flatten
76
- }
77
- through = to_array.call(kwargs)
78
- attribute ||= through.last
79
- klass = relation
80
- through.each { |k| klass = klass.reflect_on_association(k).klass }
81
- dsl = klass.query_dsl.build
82
- join = through.reverse.reduce { |acc, key| { key => acc } }
83
- @associations << [attribute, klass, dsl, join]
84
- else
85
- raise(ArgumentError, "Missing association")
86
- end
87
- self
88
- end
89
-
90
- def no_id!
91
- @no_id = true
92
- @fields.reject! { |field| field.first == :id }
93
- self
94
- end
95
-
96
- def no_dates!
97
- @no_dates = true
98
- @fields.reject! { |field| %i[created_at updated_at].include?(field.first) }
99
- self
100
- end
101
-
102
- def build
103
- @fields << %i[id id integer] if @fields.none? { |field| field.first == :id }
104
- @fields << %i[created_at created_at datetime] if @fields.none? { |field| field.first == :created_at } && relation.attribute_names.include?("created_at")
105
- @fields << %i[updated_at updated_at datetime] if @fields.none? { |field| field.first == :updated_at } && relation.attribute_names.include?("updated_at")
106
- {
107
- fields: fields,
108
- associations: associations,
109
- }
110
- end
111
-
112
- private
113
-
114
- def association_column(association)
115
- :"#{relation.table_name}.#{relation.reflect_on_association(association).foreign_key}"
116
- end
117
- end
118
- end
119
- end
@@ -1,49 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module YiffSpace
4
- module Search
5
- module QueryHelper
6
- module_function
7
-
8
- def parse_conditions(conditions, model, table_name = nil)
9
- pairs = []
10
-
11
- conditions.each do |key, value|
12
- case key
13
- when String, Symbol
14
- key = key.to_s
15
- if value.is_a?(Hash)
16
- pairs.concat(parse_conditions(value, model, key))
17
- elsif key.include?(".")
18
- table, col = key.split(".", 2)
19
- pairs << [[table, col], value]
20
- else
21
- pairs << [[table_name || model.table_name, key], value]
22
- end
23
- else
24
- raise(ArgumentError, "Unsupported key type: #{key.class}")
25
- end
26
- end
27
-
28
- pairs
29
- end
30
-
31
- def get_column(attribute, table = nil)
32
- attribute = attribute.to_s
33
- if attribute.include?(".")
34
- table, column = attribute.split(".", 2)
35
- else
36
- column = attribute
37
- end
38
- raise(ArgumentError, "Missing table") if table.nil?
39
-
40
- c = ActiveRecord::Base.connection.columns(table).find { |c| c.name == column }
41
- raise(StandardError, "Column #{column} does not exist in table #{table}") unless c
42
-
43
- c
44
- rescue ActiveRecord::StatementInvalid
45
- raise(StandardError, "Table #{table} does not exist")
46
- end
47
- end
48
- end
49
- end
@@ -1,21 +0,0 @@
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
- def klass
17
- Images::Avatar::Base
18
- end
19
- end
20
- end
21
- end
@@ -1,21 +0,0 @@
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
- def klass
17
- Images::Banner::Base
18
- end
19
- end
20
- end
21
- end
@@ -1,21 +0,0 @@
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
- def klass
17
- YiffSpace.config.user_resolvable_class
18
- end
19
- end
20
- end
21
- end
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module YiffSpace
4
- module Utils
5
- module Cache
6
- module_function
7
-
8
- def read_multi(keys, prefix)
9
- sanitized_key_to_key_hash = keys.index_by { |key| "#{prefix}:#{key}" }
10
-
11
- sanitized_keys = sanitized_key_to_key_hash.keys
12
- sanitized_key_to_value_hash = Rails.cache.read_multi(*sanitized_keys)
13
-
14
- sanitized_key_to_value_hash.transform_keys(&sanitized_key_to_key_hash)
15
- end
16
-
17
- def fetch(key, expires_in: nil, &)
18
- Rails.cache.fetch(key, expires_in: expires_in, &)
19
- end
20
-
21
- def write(key, value, expires_in: nil)
22
- Rails.cache.write(key, value, expires_in: expires_in)
23
- end
24
-
25
- def delete(key)
26
- Rails.cache.delete(key)
27
- end
28
-
29
- def clear
30
- Rails.cache.clear
31
- end
32
-
33
- def redis
34
- # Using a shared variable like this here is OK
35
- # since pitchfork spawns a new process for each worker
36
- @redis ||= Redis.new(url: YiffSpace.config.redis_url.call)
37
- end
38
- end
39
- end
40
- end
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module YiffSpace
4
- module Utils
5
- class Current < ActiveSupport::CurrentAttributes
6
- attribute(:user, :ip_addr, :request)
7
-
8
- def initialize
9
- super
10
- reset
11
- end
12
-
13
- after_reset do
14
- attributes[:user] = YiffSpace.config.anonymous_user_getter.call
15
- attributes[:ip_addr] = YiffSpace.config.default_ip_address
16
- end
17
-
18
- def user
19
- value = super
20
- return value if value.is_a?(YiffSpace.config.user_resolvable_class) || !value.is_a?(YiffSpace.config.user_class)
21
- return YiffSpace.config.user_resolvable_class.new(value, ip_addr) if ip_addr.present?
22
-
23
- value
24
- end
25
-
26
- def user=(value)
27
- if value.is_a?(YiffSpace.config.user_resolvable_class)
28
- self.ip_addr = value.ip_addr
29
- value = value.user
30
- end
31
- super
32
- end
33
-
34
- def self.scoped(user, ip_addr = YiffSpace.config.default_ip_address, &)
35
- set(user: user, ip_addr: ip_addr, &)
36
- end
37
-
38
- def self.as_system(&)
39
- scoped(YiffSpace.config.system_user_getter.call, &)
40
- end
41
- end
42
- end
43
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require("abbrev")
4
-
5
- module YiffSpace
6
- module Utils
7
- module DurationParser
8
- def self.parse(string)
9
- abbrevs = Abbrev.abbrev(%w[seconds minutes hours days weeks months years])
10
-
11
- raise unless string =~ /(.*?)([a-z]+)\z/i
12
-
13
- size = Float($1)
14
- unit = abbrevs.fetch($2.downcase)
15
-
16
- raise(NotImplementedError) unless %w[seconds minutes hours days weeks months years].include?(unit)
17
-
18
- size.public_send(unit)
19
- rescue # rubocop:disable Style/RescueStandardError
20
- raise(ArgumentError, "'#{string}' is not a valid duration")
21
- end
22
- end
23
- end
24
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module YiffSpace
4
- module Utils
5
- module Helpers
6
- module_function
7
-
8
- # Uses send/respond_to?(name, true) (not public_send/respond_to?(name)) because host apps
9
- # commonly call helpers through this proxy with an explicit receiver (e.g. a decorator's
10
- # `h.some_helper`), including ones marked private in their helper module - private only
11
- # restricts calling with an explicit receiver, and normal view rendering (which invokes
12
- # helpers without one) isn't affected either way.
13
- def method_missing(name, *, &)
14
- helpers = YiffSpace.config.application_controller_class.helpers
15
- return helpers.send(name, *, &) if helpers.respond_to?(name, true)
16
-
17
- super
18
- end
19
-
20
- def respond_to_missing?(name, include_private = false)
21
- YiffSpace.config.application_controller_class.helpers.respond_to?(name, true) || super
22
- end
23
- end
24
- end
25
- end