about summary refs log tree commit diff
path: root/app/lib
diff options
context:
space:
mode:
authorClaire <claire.github-309c@sitedethib.com>2021-03-02 12:06:58 +0100
committerClaire <claire.github-309c@sitedethib.com>2021-03-02 12:06:58 +0100
commitd8fdbb054e30f6e8e505bce63e5f150bf117cd8e (patch)
tree0a671ee6c8a7644e6613dd87798f661f4703e8fe /app/lib
parent4aa860b65bd796b09dc0ceffa1fdd7de31060a34 (diff)
parent65db2625508c220fd3c0a1f37cdd2e13b6e02987 (diff)
Merge branch 'main' into glitch-soc/merge-upstream
Conflicts:
- `app/validators/status_length_validator.rb`:
  Upstream changes too close to glitch-soc MAX_CHARS changes, but not a real
  conflict.
  Applied upstream changes.
- `package.json`:
  glitch-soc-only dependency textually too close to a dependency updated
  upstream, not a real conflict.
  Applied upstream changes.
Diffstat (limited to 'app/lib')
-rw-r--r--app/lib/extractor.rb8
-rw-r--r--app/lib/formatter.rb2
-rw-r--r--app/lib/validation_error_formatter.rb32
3 files changed, 37 insertions, 5 deletions
diff --git a/app/lib/extractor.rb b/app/lib/extractor.rb
index 6076458ad..8020aa916 100644
--- a/app/lib/extractor.rb
+++ b/app/lib/extractor.rb
@@ -1,20 +1,20 @@
 # frozen_string_literal: true
 
 module Extractor
-  extend Twitter::Extractor
+  extend Twitter::TwitterText::Extractor
 
   module_function
 
   # :yields: username, list_slug, start, end
   def extract_mentions_or_lists_with_indices(text)
-    return [] unless Twitter::Regex[:at_signs].match?(text)
+    return [] unless Twitter::TwitterText::Regex[:at_signs].match?(text)
 
     possible_entries = []
 
     text.to_s.scan(Account::MENTION_RE) do |screen_name, _|
       match_data = $LAST_MATCH_INFO
       after = $'
-      unless Twitter::Regex[:end_mention_match].match?(after)
+      unless Twitter::TwitterText::Regex[:end_mention_match].match?(after)
         start_position = match_data.char_begin(1) - 1
         end_position = match_data.char_end(1)
         possible_entries << {
@@ -44,7 +44,7 @@ module Extractor
       if %r{\A://}.match?(after)
         hash_text.match(/(.+)(https?\Z)/) do |matched|
           hash_text = matched[1]
-          end_position -= matched[2].char_length
+          end_position -= matched[2].codepoint_length
         end
       end
 
diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb
index 1aeedac8a..9a3e63d46 100644
--- a/app/lib/formatter.rb
+++ b/app/lib/formatter.rb
@@ -348,7 +348,7 @@ class Formatter
 
     html_attrs[:rel] = "me #{html_attrs[:rel]}" if options[:me]
 
-    Twitter::Autolink.send(:link_to_text, entity, link_html(entity[:url]), url, html_attrs)
+    Twitter::TwitterText::Autolink.send(:link_to_text, entity, link_html(entity[:url]), url, html_attrs)
   rescue Addressable::URI::InvalidURIError, IDN::Idna::IdnaError
     encode(entity[:url])
   end
diff --git a/app/lib/validation_error_formatter.rb b/app/lib/validation_error_formatter.rb
new file mode 100644
index 000000000..3f964f739
--- /dev/null
+++ b/app/lib/validation_error_formatter.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+class ValidationErrorFormatter
+  def initialize(error, aliases = {})
+    @error   = error
+    @aliases = aliases
+  end
+
+  def as_json
+    { error: @error.to_s, details: details }
+  end
+
+  private
+
+  def details
+    h = {}
+
+    errors.details.each_pair do |attribute_name, attribute_errors|
+      messages = errors.messages[attribute_name]
+
+      h[@aliases[attribute_name] || attribute_name] = attribute_errors.map.with_index do |error, index|
+        { error: 'ERR_' + error[:error].to_s.upcase, description: messages[index] }
+      end
+    end
+
+    h
+  end
+
+  def errors
+    @errors ||= @error.record.errors
+  end
+end