fuzzysearch enqueue job

This commit is contained in:
Dylan Knutson
2025-07-24 21:45:21 +00:00
parent bbca0db010
commit 211d5eb62c
40 changed files with 3592 additions and 852 deletions

View File

@@ -67,7 +67,7 @@ module Domain::PostsHelper
def gallery_file_for_post(post)
file = post.primary_file_for_view
return nil unless file.present?
return nil unless file.state_ok?
return nil unless file.state_ok? || file.last_status_code == 200
return nil unless file.log_entry_id.present?
content_type = file.log_entry&.content_type
return nil unless content_type.present?

View File

@@ -78,7 +78,7 @@ class Domain::E621::Job::ScanPostFavsJob < Domain::E621::Job::Base
breaker += 1
end
post.scanned_post_favs_at = Time.now
post.scanned_post_favs_at = Time.current
post.save!
end
end

View File

@@ -0,0 +1,87 @@
# typed: strict
# frozen_string_literal: true
class Domain::Fa::Job::ScanFuzzysearchJob < Domain::Fa::Job::Base
queue_as :fuzzysearch
sig { override.returns(Symbol) }
def self.http_factory_method
:get_fuzzysearch_http_client
end
sig { override.params(args: T::Hash[Symbol, T.untyped]).returns(T.untyped) }
def perform(args)
post = post_from_args!
fs_client = Scraper::FuzzysearchApiClient.new(http_client)
logger.tagged(make_arg_tag(post)) do
if post.fuzzysearch_checked_at.present?
logger.warn("fuzzysearch already checked, skipping")
return
end
fa_id = post.fa_id
if fa_id.nil?
logger.error("post has no fa_id, skipping")
return
end
unless post.state_removed?
logger.warn("post is not removed, skipping")
return
end
response = fs_client.search_fa_id_info(fa_id)
post.fuzzysearch_checked_at = Time.now
if response.is_a?(HttpLogEntry)
post.fuzzysearch_entry = response
return
end
post.fuzzysearch_entry = response.log_entry
post.fuzzysearch_json = response.json
if creator = post.creator
if creator.url_name != response.artist_url_name
fatal_error(
format_tags(
make_tag("existing", creator.url_name),
make_tag("fuzzysearch", response.artist_url_name),
"fuzzysearch artist url name mismatch",
),
)
end
else
url_name = response.artist_url_name
creator =
Domain::User::FaUser.find_or_initialize_by(url_name:) do |user|
# TODO - bug in has_aux_table, attributes not initialized before
# block is called
user.name ||= response.artist_name
user.full_name ||= response.artist_name
end
creator.save! if creator.new_record?
post.creator = creator
end
if post.keywords.blank? || post.keywords.empty?
post.keywords = response.tags
end
post_file = post.file
post_file ||=
post.build_file(url_str: response.file_url) do |post_file|
post_file.last_status_code = 404
post_file.state = "terminal_error"
end
if post_file.new_record?
post_file.enqueue_job_after_save(
Job::FaPostFurArchiverPostFileJob,
{ post_file: },
)
end
end
ensure
post.save! if post
end
end

View File

@@ -18,12 +18,16 @@ class Scraper::JobBase < ApplicationJob
@http_client = http_client
end
sig { params(url: String).returns(Scraper::HttpClient::Response) }
sig do
params(url: T.any(String, Addressable::URI)).returns(
Scraper::HttpClient::Response,
)
end
def get(url)
around_request(
proc do
@http_client.get(
url,
url.to_s,
caused_by_entry: @job.causing_log_entry,
use_http_cache: @job.use_http_cache?,
)
@@ -31,12 +35,16 @@ class Scraper::JobBase < ApplicationJob
)
end
sig { params(url: String).returns(Scraper::HttpClient::Response) }
sig do
params(url: T.any(String, Addressable::URI)).returns(
Scraper::HttpClient::Response,
)
end
def post(url)
around_request(
proc do
@http_client.post(
url,
url.to_s,
caused_by_entry: @job.causing_log_entry,
use_http_cache: @job.use_http_cache?,
)

View File

@@ -48,6 +48,14 @@ class Scraper::ClientFactory
end
end
def self.get_fuzzysearch_http_client
if Rails.env.test?
@http_client_mock || raise("no http client mock set")
else
_http_client_impl(:fuzzysearch, Scraper::FuzzysearchHttpClientConfig)
end
end
def self.get_sofurry_http_client
if Rails.env.test?
@http_client_mock || raise("no http client mock set")

View File

@@ -0,0 +1,61 @@
# typed: strict
# frozen_string_literal: true
class Scraper::FuzzysearchApiClient
extend T::Sig
API_BASE_URL = "https://api-next.fuzzysearch.net"
API_PATH_FA_ID_INFO = "/v1/file/furaffinity"
sig { params(http_client: Scraper::JobBase::WrappedHttpClient).void }
def initialize(http_client)
@http_client = http_client
end
class FaIdInfo < T::ImmutableStruct
include T::Struct::ActsAsComparable
const :log_entry, HttpLogEntry
const :json, T::Hash[String, T.untyped]
const :fa_id, Integer
const :artist_url_name, String
const :artist_name, String
const :deleted, T::Boolean
const :file_url, String
const :file_sha256, String
const :tags, T::Array[String]
end
sig { params(fa_id: Integer).returns(T.any(HttpLogEntry, FaIdInfo)) }
def search_fa_id_info(fa_id)
url = Addressable::URI.parse("#{API_BASE_URL}#{API_PATH_FA_ID_INFO}")
url.query_values = { search: fa_id.to_s }
response = @http_client.get(url)
return response.log_entry if response.status_code != 200
json = JSON.parse(response.body)
return response.log_entry unless json.is_a?(Array)
return response.log_entry if json.empty?
json = json.first
return response.log_entry unless json.is_a?(Hash)
file_url = json["url"]
return response.log_entry unless file_url.present?
url_parsed = FaUriHelper.parse_fa_media_url(file_url)
return response.log_entry unless url_parsed.present?
FaIdInfo.new(
log_entry: response.log_entry,
json:,
fa_id: json["id"],
artist_url_name: url_parsed.url_name,
artist_name: json["artist"],
deleted: json["deleted"],
file_url:,
file_sha256: json["sha256"],
tags: json["tags"],
)
end
private
end

View File

@@ -0,0 +1,49 @@
# typed: strict
# frozen_string_literal: true
class Scraper::FuzzysearchHttpClientConfig < Scraper::HttpClientConfig
API_KEY_STATE_KEY = "fuzzysearch-api-key"
sig { void }
def initialize
api_key!
end
sig { override.returns(T.nilable(T::Array[T.untyped])) }
def cookies
[]
end
sig { override.returns(T::Array[[String, Numeric]]) }
def ratelimit
[["api-next.fuzzysearch.net", 1.0]]
end
sig { override.returns(Integer) }
def redirect_limit
2
end
sig { override.returns(T::Array[String]) }
def allowed_domains
%w[api-next.fuzzysearch.net]
end
sig do
override
.params(request: Scraper::CurlHttpPerformer::Request)
.returns(Scraper::CurlHttpPerformer::Request)
end
def map_request(request)
request.request_headers["X-Api-Key"] = api_key!
request.request_headers["Accept"] = "application/json"
request
end
private
sig { returns(String) }
def api_key!
GlobalState.get(API_KEY_STATE_KEY) ||
raise("fuzzysearch api key is not set")
end
end

View File

@@ -0,0 +1,81 @@
# typed: strict
class Tasks::Fa::QueryMissingPostsFromFuzzysearch < EnqueueJobBase
extend T::Sig
include Domain::Fa::HasCountFailedInQueue
sig { params(start_at: T.nilable(String), kwargs: T.untyped).void }
def initialize(start_at: nil, **kwargs)
super(**kwargs)
@start_at = T.let(get_progress(start_at)&.to_i, T.nilable(Integer))
end
sig { override.returns(String) }
def progress_key
"fa-query-missing-posts-from-fuzzysearch"
end
sig { override.void }
def start_enqueuing
greatest_ok_post_fa_id =
Domain::Post::FaPost.where(state: :ok).maximum(:fa_id)
query =
Domain::Post::FaPost.where(state: :removed, fuzzysearch_checked_at: nil)
# clamp to greatest ok post fa_id
query =
query.where(fa_id: ..greatest_ok_post_fa_id) if greatest_ok_post_fa_id
query = query.where(fa_id: ..@start_at) if @start_at
query = query.where.missing(:file).order(fa_id: :desc)
log("finding greatest qualifying fa_id...")
greatest_post_fa_id = query.first&.fa_id
log("counting posts...")
count = query.count
puts "number of posts to process: #{count}"
pb = create_progress_bar(count)
while greatest_post_fa_id
posts = query.where(fa_id: ..greatest_post_fa_id).limit(32).to_a
break if posts.empty?
posts.each do |post|
break if interrupted?
enqueue do
Domain::Fa::Job::ScanFuzzysearchJob.perform_later(
{ fa_id: post.fa_id },
)
end
post_desc =
"#{(post.creator&.to_param || "(none)").rjust(20)} / #{post.to_param}".ljust(
40,
)
log("migrate post :: #{post_desc}") if pb.progress % 10 == 0
rescue StandardError
log("error processing post :: #{post_desc}")
ensure
pb.progress = [pb.progress + 1, pb.total].min
end
last_processed_fa_id = posts.map(&:fa_id).compact.min
if last_processed_fa_id
save_progress(last_processed_fa_id.to_s)
greatest_post_fa_id = last_processed_fa_id - 1
else
break
end
# Check for interruption after processing batch
break if interrupted?
end
log("finished")
end
sig { override.returns(Integer) }
def queue_size
count_failed_in_queue("fuzzysearch")
end
end

View File

@@ -34,7 +34,7 @@ module BelongsToWithCounterCache
association(association_name).target,
T.nilable(ActiveRecord::Base),
)
if target.send(counter_name_column).nil?
if target.send(counter_name_column).nil? && !target.new_record?
target.class.reset_counters(target.id, inverse_association_name)
end
end

View File

@@ -21,6 +21,10 @@ class Domain::Post::FaPost < Domain::Post
attr_json :first_gallery_page_id, :integer
attr_json :first_seen_entry_id, :integer
attr_json :fuzzysearch_checked_at, ActiveModelUtcTimeValue.new
attr_json :fuzzysearch_json, ActiveModel::Type::Value.new
attr_json :fuzzysearch_entry_id, :integer
# TODO - convert `file` to Domain::PostFile::FaPostFile and
# move this to Domain::PostFile::FaPostFile
attr_json :tried_from_fur_archiver, :boolean, default: false
@@ -29,6 +33,7 @@ class Domain::Post::FaPost < Domain::Post
belongs_to :first_browse_page, class_name: "::HttpLogEntry", optional: true
belongs_to :first_gallery_page, class_name: "::HttpLogEntry", optional: true
belongs_to :first_seen_entry, class_name: "::HttpLogEntry", optional: true
belongs_to :fuzzysearch_entry, class_name: "::HttpLogEntry", optional: true
has_single_file!
has_single_creator! Domain::User::FaUser
@@ -177,7 +182,7 @@ class Domain::Post::FaPost < Domain::Post
pa = super
return pa unless pa.nil?
if file_url_str = file&.url_str
for file_url_str in files.map(&:url_str).compact
parsed = FaUriHelper.parse_fa_media_url(file_url_str)
return parsed.original_file_posted_at.in_time_zone("UTC") if parsed
end

View File

@@ -0,0 +1,8 @@
<span>
<i class="fa-solid <%= icon_class %> mr-1"></i>
<%= label %>: <% if value.present? %>
<%= value %>
<% else %>
<span class="text-slate-400"> - </span>
<% end %>
</span>

View File

@@ -1,18 +1,18 @@
<span>
<i class="fa-solid fa-eye mr-1"></i>
Views: <%= post.num_views %>
</span>
<span>
<i class="fa-solid fa-comment mr-1"></i>
Comments: <%= post.num_comments %>
</span>
<span>
<i class="fa-solid fa-calendar-days mr-1"></i>
Status: <%= post.status_for_view %>
</span>
<% if policy(post).view_tried_from_fur_archiver? && post.tried_from_fur_archiver? %>
<span>
<i class="fa-solid fa-download mr-1"></i>
FurArchiver
</span>
<%= render partial: "domain/posts/title_stat", locals: { label: "Views", value: post.num_views, icon_class: "fa-eye" } %>
<%= render partial: "domain/posts/title_stat", locals: { label: "Comments", value: post.num_comments, icon_class: "fa-comment" } %>
<%= render partial: "domain/posts/title_stat", locals: { label: "Status", value: post.status_for_view, icon_class: "fa-calendar-days" } %>
<% if policy(post).view_tried_from_fur_archiver? %>
<% if post.fuzzysearch_checked_at? %>
<% hle = post.fuzzysearch_entry %>
<span>
<i class="fa-solid fa-search mr-1"></i>
<%= link_to "FuzzySearch", log_entry_path(hle), title: post.fuzzysearch_checked_at&.strftime("%Y-%m-%d %H:%M:%S"), class: "text-blue-600" %>
</span>
<% end %>
<% if post.tried_from_fur_archiver? %>
<span>
<i class="fa-solid fa-download mr-1"></i>
FurArchiver
</span>
<% end %>
<% end %>

View File

@@ -0,0 +1,10 @@
class AddFuzzysearchCheckToFaPosts < ActiveRecord::Migration[7.2]
def change
add_column :domain_fa_posts_fa_aux, :fuzzysearch_checked_at, :datetime
add_reference :domain_fa_posts_fa_aux,
:fuzzysearch_log_entry,
foreign_key: {
to_table: :log_entries,
}
end
end

View File

@@ -96,6 +96,16 @@ namespace :fa do
loop { sleep poll_duration if enqueuer.run_once == :sleep }
end
desc "Pull missing post information from FuzzySearch"
task pull_missing_post_info_from_fuzzysearch: %i[
set_logger_stdout
environment
] do
Tasks::Fa::QueryMissingPostsFromFuzzysearch.new(
start_at: ENV["start_at"],
).run
end
desc "run a single browse page job"
task browse_page_job: %i[set_logger_stdout environment] do
Domain::Fa::Job::BrowsePageJob.set(

View File

@@ -43,6 +43,7 @@ class ApplicationController
include ::Domain::Users::FaUsersHelper
include ::Domain::VisualSearchHelper
include ::DomainSourceHelper
include ::FaUriHelper
include ::GoodJobHelper
include ::IpAddressHelper
include ::TimestampHelper

View File

@@ -40,6 +40,7 @@ class DeviseController
include ::Domain::Users::FaUsersHelper
include ::Domain::VisualSearchHelper
include ::DomainSourceHelper
include ::FaUriHelper
include ::GoodJobHelper
include ::IpAddressHelper
include ::TimestampHelper

View File

@@ -0,0 +1,27 @@
# typed: true
# DO NOT EDIT MANUALLY
# This is an autogenerated file for dynamic methods in `Domain::Fa::Job::ScanFuzzysearchJob`.
# Please instead update this file by running `bin/tapioca dsl Domain::Fa::Job::ScanFuzzysearchJob`.
class Domain::Fa::Job::ScanFuzzysearchJob
sig { returns(ColorLogger) }
def logger; end
class << self
sig { returns(ColorLogger) }
def logger; end
sig do
params(
args: T::Hash[::Symbol, T.untyped],
block: T.nilable(T.proc.params(job: Domain::Fa::Job::ScanFuzzysearchJob).void)
).returns(T.any(Domain::Fa::Job::ScanFuzzysearchJob, FalseClass))
end
def perform_later(args, &block); end
sig { params(args: T::Hash[::Symbol, T.untyped]).returns(T.untyped) }
def perform_now(args); end
end
end

View File

@@ -632,61 +632,6 @@ class Domain::Factors::UserPostFavPostFactors
end
module GeneratedAttributeMethods
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def created_at; end
sig { params(value: T.nilable(::ActiveSupport::TimeWithZone)).returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def created_at=(value); end
sig { returns(T::Boolean) }
def created_at?; end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def created_at_before_last_save; end
sig { returns(T.untyped) }
def created_at_before_type_cast; end
sig { returns(T::Boolean) }
def created_at_came_from_user?; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def created_at_change; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def created_at_change_to_be_saved; end
sig do
params(
from: T.nilable(::ActiveSupport::TimeWithZone),
to: T.nilable(::ActiveSupport::TimeWithZone)
).returns(T::Boolean)
end
def created_at_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def created_at_in_database; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def created_at_previous_change; end
sig do
params(
from: T.nilable(::ActiveSupport::TimeWithZone),
to: T.nilable(::ActiveSupport::TimeWithZone)
).returns(T::Boolean)
end
def created_at_previously_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def created_at_previously_was; end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def created_at_was; end
sig { void }
def created_at_will_change!; end
sig { returns(T.untyped) }
def embedding; end
@@ -822,9 +767,6 @@ class Domain::Factors::UserPostFavPostFactors
sig { void }
def post_id_will_change!; end
sig { void }
def restore_created_at!; end
sig { void }
def restore_embedding!; end
@@ -834,15 +776,6 @@ class Domain::Factors::UserPostFavPostFactors
sig { void }
def restore_post_id!; end
sig { void }
def restore_updated_at!; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def saved_change_to_created_at; end
sig { returns(T::Boolean) }
def saved_change_to_created_at?; end
sig { returns(T.nilable([T.untyped, T.untyped])) }
def saved_change_to_embedding; end
@@ -861,70 +794,6 @@ class Domain::Factors::UserPostFavPostFactors
sig { returns(T::Boolean) }
def saved_change_to_post_id?; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def saved_change_to_updated_at; end
sig { returns(T::Boolean) }
def saved_change_to_updated_at?; end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def updated_at; end
sig { params(value: T.nilable(::ActiveSupport::TimeWithZone)).returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def updated_at=(value); end
sig { returns(T::Boolean) }
def updated_at?; end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def updated_at_before_last_save; end
sig { returns(T.untyped) }
def updated_at_before_type_cast; end
sig { returns(T::Boolean) }
def updated_at_came_from_user?; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def updated_at_change; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def updated_at_change_to_be_saved; end
sig do
params(
from: T.nilable(::ActiveSupport::TimeWithZone),
to: T.nilable(::ActiveSupport::TimeWithZone)
).returns(T::Boolean)
end
def updated_at_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def updated_at_in_database; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def updated_at_previous_change; end
sig do
params(
from: T.nilable(::ActiveSupport::TimeWithZone),
to: T.nilable(::ActiveSupport::TimeWithZone)
).returns(T::Boolean)
end
def updated_at_previously_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def updated_at_previously_was; end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def updated_at_was; end
sig { void }
def updated_at_will_change!; end
sig { returns(T::Boolean) }
def will_save_change_to_created_at?; end
sig { returns(T::Boolean) }
def will_save_change_to_embedding?; end
@@ -933,9 +802,6 @@ class Domain::Factors::UserPostFavPostFactors
sig { returns(T::Boolean) }
def will_save_change_to_post_id?; end
sig { returns(T::Boolean) }
def will_save_change_to_updated_at?; end
end
module GeneratedRelationMethods

View File

@@ -632,61 +632,6 @@ class Domain::Factors::UserPostFavUserFactors
end
module GeneratedAttributeMethods
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def created_at; end
sig { params(value: T.nilable(::ActiveSupport::TimeWithZone)).returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def created_at=(value); end
sig { returns(T::Boolean) }
def created_at?; end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def created_at_before_last_save; end
sig { returns(T.untyped) }
def created_at_before_type_cast; end
sig { returns(T::Boolean) }
def created_at_came_from_user?; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def created_at_change; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def created_at_change_to_be_saved; end
sig do
params(
from: T.nilable(::ActiveSupport::TimeWithZone),
to: T.nilable(::ActiveSupport::TimeWithZone)
).returns(T::Boolean)
end
def created_at_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def created_at_in_database; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def created_at_previous_change; end
sig do
params(
from: T.nilable(::ActiveSupport::TimeWithZone),
to: T.nilable(::ActiveSupport::TimeWithZone)
).returns(T::Boolean)
end
def created_at_previously_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def created_at_previously_was; end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def created_at_was; end
sig { void }
def created_at_will_change!; end
sig { returns(T.untyped) }
def embedding; end
@@ -777,27 +722,15 @@ class Domain::Factors::UserPostFavUserFactors
sig { void }
def id_will_change!; end
sig { void }
def restore_created_at!; end
sig { void }
def restore_embedding!; end
sig { void }
def restore_id!; end
sig { void }
def restore_updated_at!; end
sig { void }
def restore_user_id!; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def saved_change_to_created_at; end
sig { returns(T::Boolean) }
def saved_change_to_created_at?; end
sig { returns(T.nilable([T.untyped, T.untyped])) }
def saved_change_to_embedding; end
@@ -810,73 +743,12 @@ class Domain::Factors::UserPostFavUserFactors
sig { returns(T::Boolean) }
def saved_change_to_id?; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def saved_change_to_updated_at; end
sig { returns(T::Boolean) }
def saved_change_to_updated_at?; end
sig { returns(T.nilable([T.nilable(::Integer), T.nilable(::Integer)])) }
def saved_change_to_user_id; end
sig { returns(T::Boolean) }
def saved_change_to_user_id?; end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def updated_at; end
sig { params(value: T.nilable(::ActiveSupport::TimeWithZone)).returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def updated_at=(value); end
sig { returns(T::Boolean) }
def updated_at?; end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def updated_at_before_last_save; end
sig { returns(T.untyped) }
def updated_at_before_type_cast; end
sig { returns(T::Boolean) }
def updated_at_came_from_user?; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def updated_at_change; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def updated_at_change_to_be_saved; end
sig do
params(
from: T.nilable(::ActiveSupport::TimeWithZone),
to: T.nilable(::ActiveSupport::TimeWithZone)
).returns(T::Boolean)
end
def updated_at_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def updated_at_in_database; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def updated_at_previous_change; end
sig do
params(
from: T.nilable(::ActiveSupport::TimeWithZone),
to: T.nilable(::ActiveSupport::TimeWithZone)
).returns(T::Boolean)
end
def updated_at_previously_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def updated_at_previously_was; end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def updated_at_was; end
sig { void }
def updated_at_will_change!; end
sig { returns(T.nilable(::Integer)) }
def user_id; end
@@ -922,18 +794,12 @@ class Domain::Factors::UserPostFavUserFactors
sig { void }
def user_id_will_change!; end
sig { returns(T::Boolean) }
def will_save_change_to_created_at?; end
sig { returns(T::Boolean) }
def will_save_change_to_embedding?; end
sig { returns(T::Boolean) }
def will_save_change_to_id?; end
sig { returns(T::Boolean) }
def will_save_change_to_updated_at?; end
sig { returns(T::Boolean) }
def will_save_change_to_user_id?; end
end

View File

@@ -632,61 +632,6 @@ class Domain::Factors::UserUserFollowFromFactors
end
module GeneratedAttributeMethods
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def created_at; end
sig { params(value: T.nilable(::ActiveSupport::TimeWithZone)).returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def created_at=(value); end
sig { returns(T::Boolean) }
def created_at?; end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def created_at_before_last_save; end
sig { returns(T.untyped) }
def created_at_before_type_cast; end
sig { returns(T::Boolean) }
def created_at_came_from_user?; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def created_at_change; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def created_at_change_to_be_saved; end
sig do
params(
from: T.nilable(::ActiveSupport::TimeWithZone),
to: T.nilable(::ActiveSupport::TimeWithZone)
).returns(T::Boolean)
end
def created_at_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def created_at_in_database; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def created_at_previous_change; end
sig do
params(
from: T.nilable(::ActiveSupport::TimeWithZone),
to: T.nilable(::ActiveSupport::TimeWithZone)
).returns(T::Boolean)
end
def created_at_previously_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def created_at_previously_was; end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def created_at_was; end
sig { void }
def created_at_will_change!; end
sig { returns(T.untyped) }
def embedding; end
@@ -777,27 +722,15 @@ class Domain::Factors::UserUserFollowFromFactors
sig { void }
def id_will_change!; end
sig { void }
def restore_created_at!; end
sig { void }
def restore_embedding!; end
sig { void }
def restore_id!; end
sig { void }
def restore_updated_at!; end
sig { void }
def restore_user_id!; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def saved_change_to_created_at; end
sig { returns(T::Boolean) }
def saved_change_to_created_at?; end
sig { returns(T.nilable([T.untyped, T.untyped])) }
def saved_change_to_embedding; end
@@ -810,73 +743,12 @@ class Domain::Factors::UserUserFollowFromFactors
sig { returns(T::Boolean) }
def saved_change_to_id?; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def saved_change_to_updated_at; end
sig { returns(T::Boolean) }
def saved_change_to_updated_at?; end
sig { returns(T.nilable([T.nilable(::Integer), T.nilable(::Integer)])) }
def saved_change_to_user_id; end
sig { returns(T::Boolean) }
def saved_change_to_user_id?; end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def updated_at; end
sig { params(value: T.nilable(::ActiveSupport::TimeWithZone)).returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def updated_at=(value); end
sig { returns(T::Boolean) }
def updated_at?; end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def updated_at_before_last_save; end
sig { returns(T.untyped) }
def updated_at_before_type_cast; end
sig { returns(T::Boolean) }
def updated_at_came_from_user?; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def updated_at_change; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def updated_at_change_to_be_saved; end
sig do
params(
from: T.nilable(::ActiveSupport::TimeWithZone),
to: T.nilable(::ActiveSupport::TimeWithZone)
).returns(T::Boolean)
end
def updated_at_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def updated_at_in_database; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def updated_at_previous_change; end
sig do
params(
from: T.nilable(::ActiveSupport::TimeWithZone),
to: T.nilable(::ActiveSupport::TimeWithZone)
).returns(T::Boolean)
end
def updated_at_previously_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def updated_at_previously_was; end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def updated_at_was; end
sig { void }
def updated_at_will_change!; end
sig { returns(T.nilable(::Integer)) }
def user_id; end
@@ -922,18 +794,12 @@ class Domain::Factors::UserUserFollowFromFactors
sig { void }
def user_id_will_change!; end
sig { returns(T::Boolean) }
def will_save_change_to_created_at?; end
sig { returns(T::Boolean) }
def will_save_change_to_embedding?; end
sig { returns(T::Boolean) }
def will_save_change_to_id?; end
sig { returns(T::Boolean) }
def will_save_change_to_updated_at?; end
sig { returns(T::Boolean) }
def will_save_change_to_user_id?; end
end

View File

@@ -632,61 +632,6 @@ class Domain::Factors::UserUserFollowToFactors
end
module GeneratedAttributeMethods
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def created_at; end
sig { params(value: T.nilable(::ActiveSupport::TimeWithZone)).returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def created_at=(value); end
sig { returns(T::Boolean) }
def created_at?; end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def created_at_before_last_save; end
sig { returns(T.untyped) }
def created_at_before_type_cast; end
sig { returns(T::Boolean) }
def created_at_came_from_user?; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def created_at_change; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def created_at_change_to_be_saved; end
sig do
params(
from: T.nilable(::ActiveSupport::TimeWithZone),
to: T.nilable(::ActiveSupport::TimeWithZone)
).returns(T::Boolean)
end
def created_at_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def created_at_in_database; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def created_at_previous_change; end
sig do
params(
from: T.nilable(::ActiveSupport::TimeWithZone),
to: T.nilable(::ActiveSupport::TimeWithZone)
).returns(T::Boolean)
end
def created_at_previously_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def created_at_previously_was; end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def created_at_was; end
sig { void }
def created_at_will_change!; end
sig { returns(T.untyped) }
def embedding; end
@@ -777,27 +722,15 @@ class Domain::Factors::UserUserFollowToFactors
sig { void }
def id_will_change!; end
sig { void }
def restore_created_at!; end
sig { void }
def restore_embedding!; end
sig { void }
def restore_id!; end
sig { void }
def restore_updated_at!; end
sig { void }
def restore_user_id!; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def saved_change_to_created_at; end
sig { returns(T::Boolean) }
def saved_change_to_created_at?; end
sig { returns(T.nilable([T.untyped, T.untyped])) }
def saved_change_to_embedding; end
@@ -810,73 +743,12 @@ class Domain::Factors::UserUserFollowToFactors
sig { returns(T::Boolean) }
def saved_change_to_id?; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def saved_change_to_updated_at; end
sig { returns(T::Boolean) }
def saved_change_to_updated_at?; end
sig { returns(T.nilable([T.nilable(::Integer), T.nilable(::Integer)])) }
def saved_change_to_user_id; end
sig { returns(T::Boolean) }
def saved_change_to_user_id?; end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def updated_at; end
sig { params(value: T.nilable(::ActiveSupport::TimeWithZone)).returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def updated_at=(value); end
sig { returns(T::Boolean) }
def updated_at?; end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def updated_at_before_last_save; end
sig { returns(T.untyped) }
def updated_at_before_type_cast; end
sig { returns(T::Boolean) }
def updated_at_came_from_user?; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def updated_at_change; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def updated_at_change_to_be_saved; end
sig do
params(
from: T.nilable(::ActiveSupport::TimeWithZone),
to: T.nilable(::ActiveSupport::TimeWithZone)
).returns(T::Boolean)
end
def updated_at_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def updated_at_in_database; end
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def updated_at_previous_change; end
sig do
params(
from: T.nilable(::ActiveSupport::TimeWithZone),
to: T.nilable(::ActiveSupport::TimeWithZone)
).returns(T::Boolean)
end
def updated_at_previously_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def updated_at_previously_was; end
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def updated_at_was; end
sig { void }
def updated_at_will_change!; end
sig { returns(T.nilable(::Integer)) }
def user_id; end
@@ -922,18 +794,12 @@ class Domain::Factors::UserUserFollowToFactors
sig { void }
def user_id_will_change!; end
sig { returns(T::Boolean) }
def will_save_change_to_created_at?; end
sig { returns(T::Boolean) }
def will_save_change_to_embedding?; end
sig { returns(T::Boolean) }
def will_save_change_to_id?; end
sig { returns(T::Boolean) }
def will_save_change_to_updated_at?; end
sig { returns(T::Boolean) }
def will_save_change_to_user_id?; end
end

View File

@@ -446,6 +446,9 @@ class Domain::Post::E621Post
sig { params(args: T.untyped, blk: T.untyped).returns(::HttpLogEntry) }
def build_caused_by_entry(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::DomainPostsE621Aux) }
def build_e621_aux(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::PostFile) }
def build_file(*args, &blk); end
@@ -485,6 +488,12 @@ class Domain::Post::E621Post
sig { params(args: T.untyped, blk: T.untyped).returns(::HttpLogEntry) }
def create_caused_by_entry!(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::DomainPostsE621Aux) }
def create_e621_aux(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::DomainPostsE621Aux) }
def create_e621_aux!(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::PostFile) }
def create_file(*args, &blk); end
@@ -527,6 +536,12 @@ class Domain::Post::E621Post
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::UserPostFav) }
def create_user_post_fav!(*args, &blk); end
sig { returns(T.nilable(::DomainPostsE621Aux)) }
def e621_aux; end
sig { params(value: T.nilable(::DomainPostsE621Aux)).void }
def e621_aux=(value); end
sig { returns(T::Array[T.untyped]) }
def faving_user_ids; end
@@ -622,6 +637,9 @@ class Domain::Post::E621Post
sig { returns(T.nilable(::HttpLogEntry)) }
def reload_caused_by_entry; end
sig { returns(T.nilable(::DomainPostsE621Aux)) }
def reload_e621_aux; end
sig { returns(T.nilable(::Domain::PostFile)) }
def reload_file; end
@@ -646,6 +664,9 @@ class Domain::Post::E621Post
sig { void }
def reset_caused_by_entry; end
sig { void }
def reset_e621_aux; end
sig { void }
def reset_file; end
@@ -1178,16 +1199,16 @@ class Domain::Post::E621Post
sig { void }
def e621_id_will_change!; end
sig { returns(T.nilable(::Time)) }
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def e621_updated_at; end
sig { params(value: T.nilable(::Time)).returns(T.nilable(::Time)) }
sig { params(value: T.nilable(::ActiveSupport::TimeWithZone)).returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def e621_updated_at=(value); end
sig { returns(T::Boolean) }
def e621_updated_at?; end
sig { returns(T.nilable(::Time)) }
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def e621_updated_at_before_last_save; end
sig { returns(T.untyped) }
@@ -1196,28 +1217,38 @@ class Domain::Post::E621Post
sig { returns(T::Boolean) }
def e621_updated_at_came_from_user?; end
sig { returns(T.nilable([T.nilable(::Time), T.nilable(::Time)])) }
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def e621_updated_at_change; end
sig { returns(T.nilable([T.nilable(::Time), T.nilable(::Time)])) }
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def e621_updated_at_change_to_be_saved; end
sig { params(from: T.nilable(::Time), to: T.nilable(::Time)).returns(T::Boolean) }
sig do
params(
from: T.nilable(::ActiveSupport::TimeWithZone),
to: T.nilable(::ActiveSupport::TimeWithZone)
).returns(T::Boolean)
end
def e621_updated_at_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::Time)) }
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def e621_updated_at_in_database; end
sig { returns(T.nilable([T.nilable(::Time), T.nilable(::Time)])) }
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def e621_updated_at_previous_change; end
sig { params(from: T.nilable(::Time), to: T.nilable(::Time)).returns(T::Boolean) }
sig do
params(
from: T.nilable(::ActiveSupport::TimeWithZone),
to: T.nilable(::ActiveSupport::TimeWithZone)
).returns(T::Boolean)
end
def e621_updated_at_previously_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::Time)) }
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def e621_updated_at_previously_was; end
sig { returns(T.nilable(::Time)) }
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def e621_updated_at_was; end
sig { void }
@@ -2046,7 +2077,7 @@ class Domain::Post::E621Post
sig { returns(T::Boolean) }
def saved_change_to_e621_id?; end
sig { returns(T.nilable([T.nilable(::Time), T.nilable(::Time)])) }
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def saved_change_to_e621_updated_at; end
sig { returns(T::Boolean) }
@@ -2154,7 +2185,7 @@ class Domain::Post::E621Post
sig { returns(T::Boolean) }
def saved_change_to_scan_log_entry_id?; end
sig { returns(T.nilable([T.nilable(::Time), T.nilable(::Time)])) }
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def saved_change_to_scanned_post_favs_at; end
sig { returns(T::Boolean) }
@@ -2304,16 +2335,16 @@ class Domain::Post::E621Post
sig { void }
def scan_log_entry_id_will_change!; end
sig { returns(T.nilable(::Time)) }
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def scanned_post_favs_at; end
sig { params(value: T.nilable(::Time)).returns(T.nilable(::Time)) }
sig { params(value: T.nilable(::ActiveSupport::TimeWithZone)).returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def scanned_post_favs_at=(value); end
sig { returns(T::Boolean) }
def scanned_post_favs_at?; end
sig { returns(T.nilable(::Time)) }
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def scanned_post_favs_at_before_last_save; end
sig { returns(T.untyped) }
@@ -2322,28 +2353,38 @@ class Domain::Post::E621Post
sig { returns(T::Boolean) }
def scanned_post_favs_at_came_from_user?; end
sig { returns(T.nilable([T.nilable(::Time), T.nilable(::Time)])) }
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def scanned_post_favs_at_change; end
sig { returns(T.nilable([T.nilable(::Time), T.nilable(::Time)])) }
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def scanned_post_favs_at_change_to_be_saved; end
sig { params(from: T.nilable(::Time), to: T.nilable(::Time)).returns(T::Boolean) }
sig do
params(
from: T.nilable(::ActiveSupport::TimeWithZone),
to: T.nilable(::ActiveSupport::TimeWithZone)
).returns(T::Boolean)
end
def scanned_post_favs_at_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::Time)) }
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def scanned_post_favs_at_in_database; end
sig { returns(T.nilable([T.nilable(::Time), T.nilable(::Time)])) }
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def scanned_post_favs_at_previous_change; end
sig { params(from: T.nilable(::Time), to: T.nilable(::Time)).returns(T::Boolean) }
sig do
params(
from: T.nilable(::ActiveSupport::TimeWithZone),
to: T.nilable(::ActiveSupport::TimeWithZone)
).returns(T::Boolean)
end
def scanned_post_favs_at_previously_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::Time)) }
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def scanned_post_favs_at_previously_was; end
sig { returns(T.nilable(::Time)) }
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def scanned_post_favs_at_was; end
sig { void }

View File

@@ -488,6 +488,9 @@ class Domain::Post::FaPost
sig { params(args: T.untyped, blk: T.untyped).returns(::HttpLogEntry) }
def build_first_seen_entry(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::HttpLogEntry) }
def build_fuzzysearch_entry(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::HttpLogEntry) }
def build_last_submission_log_entry(*args, &blk); end
@@ -530,6 +533,12 @@ class Domain::Post::FaPost
sig { params(args: T.untyped, blk: T.untyped).returns(::HttpLogEntry) }
def create_first_seen_entry!(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::HttpLogEntry) }
def create_fuzzysearch_entry(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::HttpLogEntry) }
def create_fuzzysearch_entry!(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::HttpLogEntry) }
def create_last_submission_log_entry(*args, &blk); end
@@ -630,6 +639,18 @@ class Domain::Post::FaPost
sig { returns(T::Boolean) }
def first_seen_entry_previously_changed?; end
sig { returns(T.nilable(::HttpLogEntry)) }
def fuzzysearch_entry; end
sig { params(value: T.nilable(::HttpLogEntry)).void }
def fuzzysearch_entry=(value); end
sig { returns(T::Boolean) }
def fuzzysearch_entry_changed?; end
sig { returns(T::Boolean) }
def fuzzysearch_entry_previously_changed?; end
sig { returns(T.nilable(::HttpLogEntry)) }
def last_submission_log_entry; end
@@ -669,6 +690,9 @@ class Domain::Post::FaPost
sig { returns(T.nilable(::HttpLogEntry)) }
def reload_first_seen_entry; end
sig { returns(T.nilable(::HttpLogEntry)) }
def reload_fuzzysearch_entry; end
sig { returns(T.nilable(::HttpLogEntry)) }
def reload_last_submission_log_entry; end
@@ -696,6 +720,9 @@ class Domain::Post::FaPost
sig { void }
def reset_first_seen_entry; end
sig { void }
def reset_fuzzysearch_entry; end
sig { void }
def reset_last_submission_log_entry; end
@@ -1264,6 +1291,141 @@ class Domain::Post::FaPost
sig { void }
def first_seen_entry_id_will_change!; end
sig { returns(T.nilable(::Time)) }
def fuzzysearch_checked_at; end
sig { params(value: T.nilable(::Time)).returns(T.nilable(::Time)) }
def fuzzysearch_checked_at=(value); end
sig { returns(T::Boolean) }
def fuzzysearch_checked_at?; end
sig { returns(T.nilable(::Time)) }
def fuzzysearch_checked_at_before_last_save; end
sig { returns(T.untyped) }
def fuzzysearch_checked_at_before_type_cast; end
sig { returns(T::Boolean) }
def fuzzysearch_checked_at_came_from_user?; end
sig { returns(T.nilable([T.nilable(::Time), T.nilable(::Time)])) }
def fuzzysearch_checked_at_change; end
sig { returns(T.nilable([T.nilable(::Time), T.nilable(::Time)])) }
def fuzzysearch_checked_at_change_to_be_saved; end
sig { params(from: T.nilable(::Time), to: T.nilable(::Time)).returns(T::Boolean) }
def fuzzysearch_checked_at_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::Time)) }
def fuzzysearch_checked_at_in_database; end
sig { returns(T.nilable([T.nilable(::Time), T.nilable(::Time)])) }
def fuzzysearch_checked_at_previous_change; end
sig { params(from: T.nilable(::Time), to: T.nilable(::Time)).returns(T::Boolean) }
def fuzzysearch_checked_at_previously_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::Time)) }
def fuzzysearch_checked_at_previously_was; end
sig { returns(T.nilable(::Time)) }
def fuzzysearch_checked_at_was; end
sig { void }
def fuzzysearch_checked_at_will_change!; end
sig { returns(T.nilable(::Integer)) }
def fuzzysearch_entry_id; end
sig { params(value: T.nilable(::Integer)).returns(T.nilable(::Integer)) }
def fuzzysearch_entry_id=(value); end
sig { returns(T::Boolean) }
def fuzzysearch_entry_id?; end
sig { returns(T.nilable(::Integer)) }
def fuzzysearch_entry_id_before_last_save; end
sig { returns(T.untyped) }
def fuzzysearch_entry_id_before_type_cast; end
sig { returns(T::Boolean) }
def fuzzysearch_entry_id_came_from_user?; end
sig { returns(T.nilable([T.nilable(::Integer), T.nilable(::Integer)])) }
def fuzzysearch_entry_id_change; end
sig { returns(T.nilable([T.nilable(::Integer), T.nilable(::Integer)])) }
def fuzzysearch_entry_id_change_to_be_saved; end
sig { params(from: T.nilable(::Integer), to: T.nilable(::Integer)).returns(T::Boolean) }
def fuzzysearch_entry_id_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::Integer)) }
def fuzzysearch_entry_id_in_database; end
sig { returns(T.nilable([T.nilable(::Integer), T.nilable(::Integer)])) }
def fuzzysearch_entry_id_previous_change; end
sig { params(from: T.nilable(::Integer), to: T.nilable(::Integer)).returns(T::Boolean) }
def fuzzysearch_entry_id_previously_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::Integer)) }
def fuzzysearch_entry_id_previously_was; end
sig { returns(T.nilable(::Integer)) }
def fuzzysearch_entry_id_was; end
sig { void }
def fuzzysearch_entry_id_will_change!; end
sig { returns(T.untyped) }
def fuzzysearch_json; end
sig { params(value: T.untyped).returns(T.untyped) }
def fuzzysearch_json=(value); end
sig { returns(T::Boolean) }
def fuzzysearch_json?; end
sig { returns(T.untyped) }
def fuzzysearch_json_before_last_save; end
sig { returns(T.untyped) }
def fuzzysearch_json_before_type_cast; end
sig { returns(T::Boolean) }
def fuzzysearch_json_came_from_user?; end
sig { returns(T.nilable([T.untyped, T.untyped])) }
def fuzzysearch_json_change; end
sig { returns(T.nilable([T.untyped, T.untyped])) }
def fuzzysearch_json_change_to_be_saved; end
sig { params(from: T.untyped, to: T.untyped).returns(T::Boolean) }
def fuzzysearch_json_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.untyped) }
def fuzzysearch_json_in_database; end
sig { returns(T.nilable([T.untyped, T.untyped])) }
def fuzzysearch_json_previous_change; end
sig { params(from: T.untyped, to: T.untyped).returns(T::Boolean) }
def fuzzysearch_json_previously_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.untyped) }
def fuzzysearch_json_previously_was; end
sig { returns(T.untyped) }
def fuzzysearch_json_was; end
sig { void }
def fuzzysearch_json_will_change!; end
sig { returns(T.nilable(::String)) }
def gender; end
@@ -1790,6 +1952,15 @@ class Domain::Post::FaPost
sig { void }
def restore_first_seen_entry_id!; end
sig { void }
def restore_fuzzysearch_checked_at!; end
sig { void }
def restore_fuzzysearch_entry_id!; end
sig { void }
def restore_fuzzysearch_json!; end
sig { void }
def restore_gender!; end
@@ -1892,6 +2063,24 @@ class Domain::Post::FaPost
sig { returns(T::Boolean) }
def saved_change_to_first_seen_entry_id?; end
sig { returns(T.nilable([T.nilable(::Time), T.nilable(::Time)])) }
def saved_change_to_fuzzysearch_checked_at; end
sig { returns(T::Boolean) }
def saved_change_to_fuzzysearch_checked_at?; end
sig { returns(T.nilable([T.nilable(::Integer), T.nilable(::Integer)])) }
def saved_change_to_fuzzysearch_entry_id; end
sig { returns(T::Boolean) }
def saved_change_to_fuzzysearch_entry_id?; end
sig { returns(T.nilable([T.untyped, T.untyped])) }
def saved_change_to_fuzzysearch_json; end
sig { returns(T::Boolean) }
def saved_change_to_fuzzysearch_json?; end
sig { returns(T.nilable([T.nilable(::String), T.nilable(::String)])) }
def saved_change_to_gender; end
@@ -2458,6 +2647,15 @@ class Domain::Post::FaPost
sig { returns(T::Boolean) }
def will_save_change_to_first_seen_entry_id?; end
sig { returns(T::Boolean) }
def will_save_change_to_fuzzysearch_checked_at?; end
sig { returns(T::Boolean) }
def will_save_change_to_fuzzysearch_entry_id?; end
sig { returns(T::Boolean) }
def will_save_change_to_fuzzysearch_json?; end
sig { returns(T::Boolean) }
def will_save_change_to_gender?; end

View File

@@ -457,7 +457,7 @@ class Domain::PostFile::InkbunnyPostFile
def build_blob(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::DomainPostFilesInkbunnyAux) }
def build_domain_post_files_inkbunny_aux(*args, &blk); end
def build_inkbunny_aux(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::HttpLogEntry) }
def build_log_entry(*args, &blk); end
@@ -472,10 +472,10 @@ class Domain::PostFile::InkbunnyPostFile
def create_blob!(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::DomainPostFilesInkbunnyAux) }
def create_domain_post_files_inkbunny_aux(*args, &blk); end
def create_inkbunny_aux(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::DomainPostFilesInkbunnyAux) }
def create_domain_post_files_inkbunny_aux!(*args, &blk); end
def create_inkbunny_aux!(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::HttpLogEntry) }
def create_log_entry(*args, &blk); end
@@ -490,10 +490,10 @@ class Domain::PostFile::InkbunnyPostFile
def create_post!(*args, &blk); end
sig { returns(T.nilable(::DomainPostFilesInkbunnyAux)) }
def domain_post_files_inkbunny_aux; end
def inkbunny_aux; end
sig { params(value: T.nilable(::DomainPostFilesInkbunnyAux)).void }
def domain_post_files_inkbunny_aux=(value); end
def inkbunny_aux=(value); end
sig { returns(T.nilable(::HttpLogEntry)) }
def log_entry; end
@@ -511,7 +511,7 @@ class Domain::PostFile::InkbunnyPostFile
def reload_blob; end
sig { returns(T.nilable(::DomainPostFilesInkbunnyAux)) }
def reload_domain_post_files_inkbunny_aux; end
def reload_inkbunny_aux; end
sig { returns(T.nilable(::HttpLogEntry)) }
def reload_log_entry; end
@@ -523,7 +523,7 @@ class Domain::PostFile::InkbunnyPostFile
def reset_blob; end
sig { void }
def reset_domain_post_files_inkbunny_aux; end
def reset_inkbunny_aux; end
sig { void }
def reset_log_entry; end

View File

@@ -508,7 +508,7 @@ class Domain::User::E621User
def build_avatar(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::DomainUsersE621Aux) }
def build_domain_users_e621_aux(*args, &blk); end
def build_e621_aux(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::UserAvatar) }
def create_avatar(*args, &blk); end
@@ -517,16 +517,16 @@ class Domain::User::E621User
def create_avatar!(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::DomainUsersE621Aux) }
def create_domain_users_e621_aux(*args, &blk); end
def create_e621_aux(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::DomainUsersE621Aux) }
def create_domain_users_e621_aux!(*args, &blk); end
def create_e621_aux!(*args, &blk); end
sig { returns(T.nilable(::DomainUsersE621Aux)) }
def domain_users_e621_aux; end
def e621_aux; end
sig { params(value: T.nilable(::DomainUsersE621Aux)).void }
def domain_users_e621_aux=(value); end
def e621_aux=(value); end
sig { returns(T::Array[T.untyped]) }
def faved_post_ids; end
@@ -602,13 +602,13 @@ class Domain::User::E621User
def reload_avatar; end
sig { returns(T.nilable(::DomainUsersE621Aux)) }
def reload_domain_users_e621_aux; end
def reload_e621_aux; end
sig { void }
def reset_avatar; end
sig { void }
def reset_domain_users_e621_aux; end
def reset_e621_aux; end
sig { returns(T::Array[T.untyped]) }
def uploaded_post_ids; end

View File

@@ -529,7 +529,7 @@ class Domain::User::FaUser
def build_avatar(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::DomainUsersFaAux) }
def build_domain_users_fa_aux(*args, &blk); end
def build_fa_aux(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::HttpLogEntry) }
def build_last_gallery_page_log_entry(*args, &blk); end
@@ -544,10 +544,10 @@ class Domain::User::FaUser
def create_avatar!(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::DomainUsersFaAux) }
def create_domain_users_fa_aux(*args, &blk); end
def create_fa_aux(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::DomainUsersFaAux) }
def create_domain_users_fa_aux!(*args, &blk); end
def create_fa_aux!(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::HttpLogEntry) }
def create_last_gallery_page_log_entry(*args, &blk); end
@@ -562,10 +562,10 @@ class Domain::User::FaUser
def create_last_user_page_log_entry!(*args, &blk); end
sig { returns(T.nilable(::DomainUsersFaAux)) }
def domain_users_fa_aux; end
def fa_aux; end
sig { params(value: T.nilable(::DomainUsersFaAux)).void }
def domain_users_fa_aux=(value); end
def fa_aux=(value); end
sig { returns(T::Array[T.untyped]) }
def faved_post_ids; end
@@ -665,7 +665,7 @@ class Domain::User::FaUser
def reload_avatar; end
sig { returns(T.nilable(::DomainUsersFaAux)) }
def reload_domain_users_fa_aux; end
def reload_fa_aux; end
sig { returns(T.nilable(::HttpLogEntry)) }
def reload_last_gallery_page_log_entry; end
@@ -677,7 +677,7 @@ class Domain::User::FaUser
def reset_avatar; end
sig { void }
def reset_domain_users_fa_aux; end
def reset_fa_aux; end
sig { void }
def reset_last_gallery_page_log_entry; end

View File

@@ -498,7 +498,7 @@ class Domain::User::InkbunnyUser
def build_deep_update_log_entry(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::DomainUsersInkbunnyAux) }
def build_domain_users_inkbunny_aux(*args, &blk); end
def build_inkbunny_aux(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::HttpLogEntry) }
def build_shallow_update_log_entry(*args, &blk); end
@@ -516,10 +516,10 @@ class Domain::User::InkbunnyUser
def create_deep_update_log_entry!(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::DomainUsersInkbunnyAux) }
def create_domain_users_inkbunny_aux(*args, &blk); end
def create_inkbunny_aux(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::DomainUsersInkbunnyAux) }
def create_domain_users_inkbunny_aux!(*args, &blk); end
def create_inkbunny_aux!(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::HttpLogEntry) }
def create_shallow_update_log_entry(*args, &blk); end
@@ -539,12 +539,6 @@ class Domain::User::InkbunnyUser
sig { returns(T::Boolean) }
def deep_update_log_entry_previously_changed?; end
sig { returns(T.nilable(::DomainUsersInkbunnyAux)) }
def domain_users_inkbunny_aux; end
sig { params(value: T.nilable(::DomainUsersInkbunnyAux)).void }
def domain_users_inkbunny_aux=(value); end
sig { returns(T::Array[T.untyped]) }
def faved_post_ids; end
@@ -601,6 +595,12 @@ class Domain::User::InkbunnyUser
sig { params(value: T::Enumerable[::Domain::User]).void }
def followed_users=(value); end
sig { returns(T.nilable(::DomainUsersInkbunnyAux)) }
def inkbunny_aux; end
sig { params(value: T.nilable(::DomainUsersInkbunnyAux)).void }
def inkbunny_aux=(value); end
sig { returns(T::Array[T.untyped]) }
def post_ids; end
@@ -622,7 +622,7 @@ class Domain::User::InkbunnyUser
def reload_deep_update_log_entry; end
sig { returns(T.nilable(::DomainUsersInkbunnyAux)) }
def reload_domain_users_inkbunny_aux; end
def reload_inkbunny_aux; end
sig { returns(T.nilable(::HttpLogEntry)) }
def reload_shallow_update_log_entry; end
@@ -634,7 +634,7 @@ class Domain::User::InkbunnyUser
def reset_deep_update_log_entry; end
sig { void }
def reset_domain_users_inkbunny_aux; end
def reset_inkbunny_aux; end
sig { void }
def reset_shallow_update_log_entry; end

View File

@@ -421,32 +421,32 @@ class DomainPostFilesInkbunnyAux
end
module GeneratedAssociationMethods
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::PostFile::InkbunnyPostFile) }
def build_main(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::PostFile::InkbunnyPostFile) }
def create_main(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::PostFile::InkbunnyPostFile) }
def create_main!(*args, &blk); end
sig { returns(T.nilable(::Domain::PostFile::InkbunnyPostFile)) }
def base_table; end
def main; end
sig { params(value: T.nilable(::Domain::PostFile::InkbunnyPostFile)).void }
def base_table=(value); end
def main=(value); end
sig { returns(T::Boolean) }
def base_table_changed?; end
def main_changed?; end
sig { returns(T::Boolean) }
def base_table_previously_changed?; end
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::PostFile::InkbunnyPostFile) }
def build_base_table(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::PostFile::InkbunnyPostFile) }
def create_base_table(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::PostFile::InkbunnyPostFile) }
def create_base_table!(*args, &blk); end
def main_previously_changed?; end
sig { returns(T.nilable(::Domain::PostFile::InkbunnyPostFile)) }
def reload_base_table; end
def reload_main; end
sig { void }
def reset_base_table; end
def reset_main; end
end
module GeneratedAssociationRelationMethods

2587
sorbet/rbi/dsl/domain_posts_e621_aux.rbi generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -418,32 +418,32 @@ class DomainUsersE621Aux
end
module GeneratedAssociationMethods
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::User::E621User) }
def build_main(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::User::E621User) }
def create_main(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::User::E621User) }
def create_main!(*args, &blk); end
sig { returns(T.nilable(::Domain::User::E621User)) }
def base_table; end
def main; end
sig { params(value: T.nilable(::Domain::User::E621User)).void }
def base_table=(value); end
def main=(value); end
sig { returns(T::Boolean) }
def base_table_changed?; end
def main_changed?; end
sig { returns(T::Boolean) }
def base_table_previously_changed?; end
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::User::E621User) }
def build_base_table(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::User::E621User) }
def create_base_table(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::User::E621User) }
def create_base_table!(*args, &blk); end
def main_previously_changed?; end
sig { returns(T.nilable(::Domain::User::E621User)) }
def reload_base_table; end
def reload_main; end
sig { void }
def reset_base_table; end
def reset_main; end
end
module GeneratedAssociationRelationMethods

View File

@@ -408,32 +408,32 @@ class DomainUsersFaAux
end
module GeneratedAssociationMethods
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::User::FaUser) }
def build_main(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::User::FaUser) }
def create_main(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::User::FaUser) }
def create_main!(*args, &blk); end
sig { returns(T.nilable(::Domain::User::FaUser)) }
def base_table; end
def main; end
sig { params(value: T.nilable(::Domain::User::FaUser)).void }
def base_table=(value); end
def main=(value); end
sig { returns(T::Boolean) }
def base_table_changed?; end
def main_changed?; end
sig { returns(T::Boolean) }
def base_table_previously_changed?; end
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::User::FaUser) }
def build_base_table(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::User::FaUser) }
def create_base_table(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::User::FaUser) }
def create_base_table!(*args, &blk); end
def main_previously_changed?; end
sig { returns(T.nilable(::Domain::User::FaUser)) }
def reload_base_table; end
def reload_main; end
sig { void }
def reset_base_table; end
def reset_main; end
end
module GeneratedAssociationRelationMethods

View File

@@ -416,32 +416,32 @@ class DomainUsersInkbunnyAux
end
module GeneratedAssociationMethods
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::User::InkbunnyUser) }
def build_main(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::User::InkbunnyUser) }
def create_main(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::User::InkbunnyUser) }
def create_main!(*args, &blk); end
sig { returns(T.nilable(::Domain::User::InkbunnyUser)) }
def base_table; end
def main; end
sig { params(value: T.nilable(::Domain::User::InkbunnyUser)).void }
def base_table=(value); end
def main=(value); end
sig { returns(T::Boolean) }
def base_table_changed?; end
def main_changed?; end
sig { returns(T::Boolean) }
def base_table_previously_changed?; end
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::User::InkbunnyUser) }
def build_base_table(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::User::InkbunnyUser) }
def create_base_table(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::User::InkbunnyUser) }
def create_base_table!(*args, &blk); end
def main_previously_changed?; end
sig { returns(T.nilable(::Domain::User::InkbunnyUser)) }
def reload_base_table; end
def reload_main; end
sig { void }
def reset_base_table; end
def reset_main; end
end
module GeneratedAssociationRelationMethods

View File

@@ -6,7 +6,6 @@
class FlatSstEntry
include GeneratedAttributeMethods
extend CommonRelationMethods
extend GeneratedRelationMethods
@@ -552,179 +551,6 @@ class FlatSstEntry
def without_count; end
end
module GeneratedAttributeMethods
sig { returns(T.nilable(::String)) }
def contents; end
sig { params(value: T.nilable(::String)).returns(T.nilable(::String)) }
def contents=(value); end
sig { returns(T::Boolean) }
def contents?; end
sig { returns(T.nilable(::String)) }
def contents_before_last_save; end
sig { returns(T.untyped) }
def contents_before_type_cast; end
sig { returns(T::Boolean) }
def contents_came_from_user?; end
sig { returns(T.nilable([T.nilable(::String), T.nilable(::String)])) }
def contents_change; end
sig { returns(T.nilable([T.nilable(::String), T.nilable(::String)])) }
def contents_change_to_be_saved; end
sig { params(from: T.nilable(::String), to: T.nilable(::String)).returns(T::Boolean) }
def contents_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::String)) }
def contents_in_database; end
sig { returns(T.nilable([T.nilable(::String), T.nilable(::String)])) }
def contents_previous_change; end
sig { params(from: T.nilable(::String), to: T.nilable(::String)).returns(T::Boolean) }
def contents_previously_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::String)) }
def contents_previously_was; end
sig { returns(T.nilable(::String)) }
def contents_was; end
sig { void }
def contents_will_change!; end
sig { returns(T.nilable(::String)) }
def id; end
sig { params(value: T.nilable(::String)).returns(T.nilable(::String)) }
def id=(value); end
sig { returns(T::Boolean) }
def id?; end
sig { returns(T.nilable(::String)) }
def id_before_last_save; end
sig { returns(T.untyped) }
def id_before_type_cast; end
sig { returns(T::Boolean) }
def id_came_from_user?; end
sig { returns(T.nilable([T.nilable(::String), T.nilable(::String)])) }
def id_change; end
sig { returns(T.nilable([T.nilable(::String), T.nilable(::String)])) }
def id_change_to_be_saved; end
sig { params(from: T.nilable(::String), to: T.nilable(::String)).returns(T::Boolean) }
def id_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::String)) }
def id_in_database; end
sig { returns(T.nilable([T.nilable(::String), T.nilable(::String)])) }
def id_previous_change; end
sig { params(from: T.nilable(::String), to: T.nilable(::String)).returns(T::Boolean) }
def id_previously_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::String)) }
def id_previously_was; end
sig { returns(T.nilable(::String)) }
def id_was; end
sig { void }
def id_will_change!; end
sig { returns(T.nilable(::String)) }
def key; end
sig { params(value: T.nilable(::String)).returns(T.nilable(::String)) }
def key=(value); end
sig { returns(T::Boolean) }
def key?; end
sig { returns(T.nilable(::String)) }
def key_before_last_save; end
sig { returns(T.untyped) }
def key_before_type_cast; end
sig { returns(T::Boolean) }
def key_came_from_user?; end
sig { returns(T.nilable([T.nilable(::String), T.nilable(::String)])) }
def key_change; end
sig { returns(T.nilable([T.nilable(::String), T.nilable(::String)])) }
def key_change_to_be_saved; end
sig { params(from: T.nilable(::String), to: T.nilable(::String)).returns(T::Boolean) }
def key_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::String)) }
def key_in_database; end
sig { returns(T.nilable([T.nilable(::String), T.nilable(::String)])) }
def key_previous_change; end
sig { params(from: T.nilable(::String), to: T.nilable(::String)).returns(T::Boolean) }
def key_previously_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::String)) }
def key_previously_was; end
sig { returns(T.nilable(::String)) }
def key_was; end
sig { void }
def key_will_change!; end
sig { void }
def restore_contents!; end
sig { void }
def restore_id!; end
sig { void }
def restore_key!; end
sig { returns(T.nilable([T.nilable(::String), T.nilable(::String)])) }
def saved_change_to_contents; end
sig { returns(T::Boolean) }
def saved_change_to_contents?; end
sig { returns(T.nilable([T.nilable(::String), T.nilable(::String)])) }
def saved_change_to_id; end
sig { returns(T::Boolean) }
def saved_change_to_id?; end
sig { returns(T.nilable([T.nilable(::String), T.nilable(::String)])) }
def saved_change_to_key; end
sig { returns(T::Boolean) }
def saved_change_to_key?; end
sig { returns(T::Boolean) }
def will_save_change_to_contents?; end
sig { returns(T::Boolean) }
def will_save_change_to_id?; end
sig { returns(T::Boolean) }
def will_save_change_to_key?; end
end
module GeneratedRelationMethods
sig { returns(PrivateRelation) }
def all; end

View File

@@ -397,6 +397,18 @@ class HttpLogEntry
end
module EnumMethodsModule
sig { void }
def performed_by_airvpn_1_netherlands!; end
sig { returns(T::Boolean) }
def performed_by_airvpn_1_netherlands?; end
sig { void }
def performed_by_airvpn_2_san_jose!; end
sig { returns(T::Boolean) }
def performed_by_airvpn_2_san_jose?; end
sig { void }
def performed_by_dedipath_1!; end
@@ -643,6 +655,12 @@ class HttpLogEntry
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
def none(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
def not_performed_by_airvpn_1_netherlands(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
def not_performed_by_airvpn_2_san_jose(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
def not_performed_by_dedipath_1(*args, &blk); end
@@ -699,6 +717,12 @@ class HttpLogEntry
end
def per(num); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
def performed_by_airvpn_1_netherlands(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
def performed_by_airvpn_2_san_jose(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
def performed_by_dedipath_1(*args, &blk); end
@@ -1998,6 +2022,12 @@ class HttpLogEntry
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
def none(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
def not_performed_by_airvpn_1_netherlands(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
def not_performed_by_airvpn_2_san_jose(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
def not_performed_by_dedipath_1(*args, &blk); end
@@ -2054,6 +2084,12 @@ class HttpLogEntry
end
def per(num); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
def performed_by_airvpn_1_netherlands(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
def performed_by_airvpn_2_san_jose(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
def performed_by_dedipath_1(*args, &blk); end

View File

@@ -43,6 +43,7 @@ class Rails::ApplicationController
include ::Domain::Users::FaUsersHelper
include ::Domain::VisualSearchHelper
include ::DomainSourceHelper
include ::FaUriHelper
include ::GoodJobHelper
include ::IpAddressHelper
include ::TimestampHelper

View File

@@ -43,6 +43,7 @@ class Rails::Conductor::BaseController
include ::Domain::Users::FaUsersHelper
include ::Domain::VisualSearchHelper
include ::DomainSourceHelper
include ::FaUriHelper
include ::GoodJobHelper
include ::IpAddressHelper
include ::TimestampHelper

View File

@@ -43,6 +43,7 @@ class Rails::HealthController
include ::Domain::Users::FaUsersHelper
include ::Domain::VisualSearchHelper
include ::DomainSourceHelper
include ::FaUriHelper
include ::GoodJobHelper
include ::IpAddressHelper
include ::TimestampHelper

View File

@@ -0,0 +1,16 @@
# typed: true
# DO NOT EDIT MANUALLY
# This is an autogenerated file for dynamic methods in `Scraper::FuzzysearchHttpClientConfig`.
# Please instead update this file by running `bin/tapioca dsl Scraper::FuzzysearchHttpClientConfig`.
class Scraper::FuzzysearchHttpClientConfig
sig { returns(ColorLogger) }
def logger; end
class << self
sig { returns(ColorLogger) }
def logger; end
end
end

View File

@@ -16,7 +16,7 @@ FactoryBot.define do
post_file.log_entry =
create(
:http_log_entry,
url_str: post_file.url_str,
uri_str: post_file.url_str,
status_code: post_file.last_status_code,
)
end

View File

@@ -0,0 +1,213 @@
# typed: false
require "rails_helper"
describe Domain::Fa::Job::ScanFuzzysearchJob do
let(:http_client_mock) { instance_double("::Scraper::HttpClient") }
before { Scraper::ClientFactory.http_client_mock = http_client_mock }
let(:client_mock_config) { [] }
let!(:log_entries) do
HttpClientMockHelpers.init_http_client_mock(
http_client_mock,
client_mock_config,
)
end
let(:fuzzysearch_response_51015903) do
[
{
id: 51_015_903,
file_id: 1_676_417_528,
artist: "crimetxt",
hash: 2_367_248_181_756_250_600,
hash_str: "2367248181756250660",
url:
"https://d.furaffinity.net/art/crimetxt/1676417528/1676417528.crimetxt_2023-02-15_00_18_48.png",
filename: "1676417528.crimetxt_2023-02-15_00_18_48.png",
rating: "adult",
posted_at: "2023-02-14T23:32:00Z",
file_size: 2_188_273,
sha256:
"d488dabd8eb22398a228fb662eb520bb4daaac3a9ab0dc9be8b8c5e1b9522efb",
updated_at: nil,
deleted: false,
tags: %w[some_tag another_tag],
},
]
end
let(:fuzzysearch_response_21275696) do
[
{
id: 21_275_696,
file_id: nil,
artist: nil,
hash: nil,
hash_str: nil,
url: nil,
filename: nil,
rating: nil,
posted_at: nil,
file_size: nil,
sha256: nil,
updated_at: "2023-08-16T08:02:27.746944Z",
deleted: true,
tags: [],
},
]
end
let(:fuzzysearch_response_53068507) do
[
{
id: 53_068_507,
file_id: 1_690_504_099,
artist: "Meesh",
hash: -5_278_701_664_616_650_000,
hash_str: "-5278701664616649812",
url:
"https://d.furaffinity.net/art/meesh/1690504135/1690504099.meesh_pamperingjack3_crop.png",
filename: "1690504099.meesh_pamperingjack3_crop.png",
rating: "adult",
posted_at: "2023-07-28T00:28:00Z",
file_size: 555_926,
sha256:
"f47e974ef7e72c53fce5a52b28b7c34576eb26af04299155d1cc3912379b0dea",
updated_at: nil,
deleted: false,
tags: %w[advertisement patreon female preview_limited beastars juno],
},
]
end
describe "post was marked removed" do
let(:post) do
create(
:domain_post_fa_post,
state: "removed",
keywords: nil,
fa_id: fa_id,
)
end
context "and fuzzysearch has post info" do
let(:fa_id) { 51_015_903 }
let(:client_mock_config) do
[
{
uri:
"https://api-next.fuzzysearch.net/v1/file/furaffinity?search=#{fa_id}",
status_code: 200,
content_type: "application/json",
contents: fuzzysearch_response_51015903.to_json,
},
]
end
it "updates the post" do
perform_now({ post: })
post.reload
expect(post.fuzzysearch_checked_at).to be_present
expect(post.fuzzysearch_entry).to be_present
expect(post.fuzzysearch_json).to be_present
end
it "sets tags" do
perform_now({ post: })
post.reload
expect(post.keywords).to eq(%w[some_tag another_tag])
end
it "sets file" do
perform_now({ post: })
post.reload
expect(post.file).to be_present
expect(post.file.url_str).to eq(
"https://d.furaffinity.net/art/crimetxt/1676417528/1676417528.crimetxt_2023-02-15_00_18_48.png",
)
end
it "sets the creator" do
perform_now({ post: })
post.reload
expect(post.creator).to be_present
expect(post.creator.url_name).to eq("crimetxt")
end
it "enqueues a fur archiver post file job" do
perform_now({ post: })
post.reload
job_args = SpecUtil.enqueued_job_args(Job::FaPostFurArchiverPostFileJob)
expect(job_args).to match(
[{ post_file: post.file, caused_by_entry: post.fuzzysearch_entry }],
)
end
context "the post file is already downloaded" do
before do
post.file = create(:domain_post_file, :has_file)
post.save!
end
it "does not enqueue a fur archiver post file job" do
perform_now({ post: })
post.reload
job_args =
SpecUtil.enqueued_job_args(Job::FaPostFurArchiverPostFileJob)
expect(job_args).to be_empty
end
end
end
context "and fuzzysearch has no post info" do
let(:fa_id) { 21_275_696 }
let(:client_mock_config) do
[
{
uri:
"https://api-next.fuzzysearch.net/v1/file/furaffinity?search=#{fa_id}",
status_code: 200,
content_type: "application/json",
contents: fuzzysearch_response_21275696.to_json,
},
]
end
it "does not set the creator" do
perform_now({ post: })
post.reload
expect(post.creator).to be_nil
end
it "does not create a file" do
perform_now({ post: })
post.reload
expect(post.file).to be_nil
end
end
context "and the artist name has capitalizations" do
let(:fa_id) { 53_068_507 }
let(:client_mock_config) do
[
{
uri:
"https://api-next.fuzzysearch.net/v1/file/furaffinity?search=#{fa_id}",
status_code: 200,
content_type: "application/json",
contents: fuzzysearch_response_53068507.to_json,
},
]
end
it "sets the creator" do
perform_now({ post: })
post.reload
expect(post.creator).to be_present
expect(post.creator.url_name).to eq("meesh")
expect(post.creator.name).to eq("Meesh")
expect(post.creator.full_name).to eq("Meesh")
end
end
end
end