diff -pruN 2.5.0-1/History.rdoc 2.5.2-1/History.rdoc
--- 2.5.0-1/History.rdoc	2022-10-17 22:40:02.000000000 +0000
+++ 2.5.2-1/History.rdoc	2025-04-01 23:26:04.000000000 +0000
@@ -1,3 +1,15 @@
+=== 2.5.2 / 2025-03-25
+
+* 1 bug fix:
+
+  * Added support for 3 slot op_asgn (eg `a &= 1`)
+
+=== 2.5.1 / 2024-07-08
+
+* 1 bug fix:
+
+  * Fix errors created when string literals are frozen. (byroot + zenspider)
+
 === 2.5.0 / 2022-10-04
 
 * 5 minor enhancements:
Binary files 2.5.0-1/checksums.yaml.gz.sig and 2.5.2-1/checksums.yaml.gz.sig differ
Binary files 2.5.0-1/data.tar.gz.sig and 2.5.2-1/data.tar.gz.sig differ
diff -pruN 2.5.0-1/debian/changelog 2.5.2-1/debian/changelog
--- 2.5.0-1/debian/changelog	2023-07-07 04:25:54.000000000 +0000
+++ 2.5.2-1/debian/changelog	2025-10-25 19:53:05.000000000 +0000
@@ -1,3 +1,11 @@
+ruby-ruby2ruby (2.5.2-1) unstable; urgency=medium
+
+  * Team upload.
+  * New upstream release.
+  * Update Standards-Version to 4.7.2, no changes needed.
+
+ -- Simon Quigley <tsimonq2@debian.org>  Sat, 25 Oct 2025 14:53:05 -0500
+
 ruby-ruby2ruby (2.5.0-1) unstable; urgency=medium
 
   * Team Upload
diff -pruN 2.5.0-1/debian/control 2.5.2-1/debian/control
--- 2.5.0-1/debian/control	2023-07-07 04:25:54.000000000 +0000
+++ 2.5.2-1/debian/control	2025-10-25 19:51:53.000000000 +0000
@@ -8,7 +8,7 @@ Build-Depends: debhelper-compat (= 13),
                ruby-minitest,
                ruby-ruby-parser (>= 3.15~),
                ruby-sexp-processor (>= 4.15~)
-Standards-Version: 4.6.2
+Standards-Version: 4.7.2
 Vcs-Git: https://salsa.debian.org/ruby-team/ruby-ruby2ruby.git
 Vcs-Browser: https://salsa.debian.org/ruby-team/ruby-ruby2ruby
 Homepage: https://github.com/seattlerb/ruby2ruby
diff -pruN 2.5.0-1/debian/gbp.conf 2.5.2-1/debian/gbp.conf
--- 2.5.0-1/debian/gbp.conf	1970-01-01 00:00:00.000000000 +0000
+++ 2.5.2-1/debian/gbp.conf	2025-10-25 19:51:11.000000000 +0000
@@ -0,0 +1,4 @@
+[DEFAULT]
+debian-branch = debian/latest
+upstream-branch = upstream/latest
+pristine-tar = True
diff -pruN 2.5.0-1/debian/salsa-ci.yml 2.5.2-1/debian/salsa-ci.yml
--- 2.5.0-1/debian/salsa-ci.yml	1970-01-01 00:00:00.000000000 +0000
+++ 2.5.2-1/debian/salsa-ci.yml	2025-10-25 19:51:11.000000000 +0000
@@ -0,0 +1,3 @@
+---
+include:
+  - https://salsa.debian.org/ruby-team/meta/raw/master/salsa-ci.yml
diff -pruN 2.5.0-1/lib/ruby2ruby.rb 2.5.2-1/lib/ruby2ruby.rb
--- 2.5.0-1/lib/ruby2ruby.rb	2022-10-17 22:40:02.000000000 +0000
+++ 2.5.2-1/lib/ruby2ruby.rb	2025-04-01 23:26:04.000000000 +0000
@@ -31,7 +31,7 @@ end
 # Generate ruby code from a sexp.
 
 class Ruby2Ruby < SexpProcessor
-  VERSION = "2.5.0" # :nodoc:
+  VERSION = "2.5.2" # :nodoc:
 
   # cutoff for one-liners
   LINE_LENGTH = 78
@@ -475,7 +475,7 @@ class Ruby2Ruby < SexpProcessor
 
     options = re_opt rest.pop if Integer === rest.last
 
-    "/" << util_dthing(:dregx, s(:dregx, str, *rest)) << "/#{options}"
+    "/" + util_dthing(:dregx, s(:dregx, str, *rest)) << "/#{options}"
   end
 
   def process_dregx_once(exp) # :nodoc:
@@ -502,7 +502,7 @@ class Ruby2Ruby < SexpProcessor
     ens  = process(ens) || "# do nothing"
     ens = "begin\n#{ens}\nend\n" if ens =~ /(^|\n)rescue/
 
-    body.sub!(/\n\s*end\z/, "")
+    body = body.sub(/\n\s*end\z/, "")
     body = indent(body) unless body =~ /(^|\n)rescue/
 
     "#{body}\nensure\n#{indent ens}"
@@ -699,11 +699,12 @@ class Ruby2Ruby < SexpProcessor
         return r if r and (@indent + r).size < LINE_LENGTH and r !~ /\n/
       end
 
-      r = "if #{c} then\n#{indent(t)}\n"
+      r = []
+      r << "if #{c} then\n#{indent(t)}\n"
       r << "else\n#{indent(f)}\n" if f
       r << "end"
 
-      r
+      r.join
     elsif f
       unless expand then
         r = "#{f} unless #{c}"
@@ -745,7 +746,7 @@ class Ruby2Ruby < SexpProcessor
              %w[ do end ]
            end
 
-    iter.sub!(/\(\)$/, "")
+    iter = iter.sub(/\(\)$/, "")
 
     # REFACTOR: ugh
     result = []
@@ -915,11 +916,14 @@ class Ruby2Ruby < SexpProcessor
   end
 
   def process_op_asgn exp # :nodoc:
-    # [[:lvar, :x], [:call, nil, :z, [:lit, 1]], :y, :"||"]
-
     case exp.length
     when 4
-      raise "NOT YET: op_asgn 4"
+      _, lhs, op, rhs = exp
+
+      lhs = process lhs
+      rhs = process rhs
+
+      "#{lhs} #{op}= #{rhs}"
     when 5
       _, lhs, rhs, index, op = exp
 
Binary files 2.5.0-1/metadata.gz.sig and 2.5.2-1/metadata.gz.sig differ
diff -pruN 2.5.0-1/ruby2ruby.gemspec 2.5.2-1/ruby2ruby.gemspec
--- 2.5.0-1/ruby2ruby.gemspec	2022-10-17 22:40:02.000000000 +0000
+++ 2.5.2-1/ruby2ruby.gemspec	2025-04-01 23:26:04.000000000 +0000
@@ -2,18 +2,18 @@
 # This file has been automatically generated by gem2tgz #
 #########################################################
 # -*- encoding: utf-8 -*-
-# stub: ruby2ruby 2.5.0 ruby lib
+# stub: ruby2ruby 2.5.2 ruby lib
 
 Gem::Specification.new do |s|
   s.name = "ruby2ruby".freeze
-  s.version = "2.5.0"
+  s.version = "2.5.2"
 
   s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
   s.metadata = { "homepage_uri" => "https://github.com/seattlerb/ruby2ruby" } if s.respond_to? :metadata=
   s.require_paths = ["lib".freeze]
   s.authors = ["Ryan Davis".freeze]
-  s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIDPjCCAiagAwIBAgIBBjANBgkqhkiG9w0BAQsFADBFMRMwEQYDVQQDDApyeWFu\nZC1ydWJ5MRkwFwYKCZImiZPyLGQBGRYJemVuc3BpZGVyMRMwEQYKCZImiZPyLGQB\nGRYDY29tMB4XDTIxMTIyMzIzMTkwNFoXDTIyMTIyMzIzMTkwNFowRTETMBEGA1UE\nAwwKcnlhbmQtcnVieTEZMBcGCgmSJomT8ixkARkWCXplbnNwaWRlcjETMBEGCgmS\nJomT8ixkARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALda\nb9DCgK+627gPJkB6XfjZ1itoOQvpqH1EXScSaba9/S2VF22VYQbXU1xQXL/WzCkx\ntaCPaLmfYIaFcHHCSY4hYDJijRQkLxPeB3xbOfzfLoBDbjvx5JxgJxUjmGa7xhcT\noOvjtt5P8+GSK9zLzxQP0gVLS/D0FmoE44XuDr3iQkVS2ujU5zZL84mMNqNB1znh\nGiadM9GHRaDiaxuX0cIUBj19T01mVE2iymf9I6bEsiayK/n6QujtyCbTWsAS9Rqt\nqhtV7HJxNKuPj/JFH0D2cswvzznE/a5FOYO68g+YCuFi5L8wZuuM8zzdwjrWHqSV\ngBEfoTEGr7Zii72cx+sCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw\nHQYDVR0OBBYEFEfFe9md/r/tj/Wmwpy+MI8d9k/hMA0GCSqGSIb3DQEBCwUAA4IB\nAQCKB5jfsuSnKb+t/Wrh3UpdkmX7TrEsjVmERC0pPqzQ5GQJgmEXDD7oMgaKXaAq\nx2m+KSZDrqk7c8uho5OX6YMqg4KdxehfSLqqTZGoeV78qwf/jpPQZKTf+W9gUSJh\nzsWpo4K50MP+QtdSbKXZwjAafpQ8hK0MnnZ/aeCsW9ov5vdXpYbf3dpg6ADXRGE7\nlQY2y1tJ5/chqu6h7dQmnm2ABUqx9O+JcN9hbCYoA5i/EeubUEtFIh2w3SpO6YfB\nJFmxn4h9YO/pVdB962BdBNNDia0kgIjI3ENnkLq0dKpYU3+F3KhEuTksLO0L6X/V\nYsuyUzsMz6GQA4khyaMgKNSD\n-----END CERTIFICATE-----\n".freeze]
-  s.date = "2022-10-05"
+  s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIDPjCCAiagAwIBAgIBCTANBgkqhkiG9w0BAQsFADBFMRMwEQYDVQQDDApyeWFu\nZC1ydWJ5MRkwFwYKCZImiZPyLGQBGRYJemVuc3BpZGVyMRMwEQYKCZImiZPyLGQB\nGRYDY29tMB4XDTI1MDEwNjIzMjcwMVoXDTI2MDEwNjIzMjcwMVowRTETMBEGA1UE\nAwwKcnlhbmQtcnVieTEZMBcGCgmSJomT8ixkARkWCXplbnNwaWRlcjETMBEGCgmS\nJomT8ixkARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALda\nb9DCgK+627gPJkB6XfjZ1itoOQvpqH1EXScSaba9/S2VF22VYQbXU1xQXL/WzCkx\ntaCPaLmfYIaFcHHCSY4hYDJijRQkLxPeB3xbOfzfLoBDbjvx5JxgJxUjmGa7xhcT\noOvjtt5P8+GSK9zLzxQP0gVLS/D0FmoE44XuDr3iQkVS2ujU5zZL84mMNqNB1znh\nGiadM9GHRaDiaxuX0cIUBj19T01mVE2iymf9I6bEsiayK/n6QujtyCbTWsAS9Rqt\nqhtV7HJxNKuPj/JFH0D2cswvzznE/a5FOYO68g+YCuFi5L8wZuuM8zzdwjrWHqSV\ngBEfoTEGr7Zii72cx+sCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw\nHQYDVR0OBBYEFEfFe9md/r/tj/Wmwpy+MI8d9k/hMA0GCSqGSIb3DQEBCwUAA4IB\nAQAC0WQJcPOWPFwkojhzweilRVjTJ19UiLhiBTw3C1wJO3LVdBkWDmnnhAmKuX4D\nr7vjQvESlABGIPdutI1Yl7mrHQzTkfLfXvNN6MT0nLChPyIYauT6SZZxubwJrUfA\n7R0c2CJTIboZ0XaGpLsXqHEF1c29H7TV1QvVuqKAN2mCjh4N82QVn+ZKtys28AwT\n6GfQX2fqLoi4KSc7xIzHKaNzqxeOICmJofk9w5VZ2rRN6yes8jvFYwz9HR41wdj8\nbwfinv7Yp5fA6AysuZLhCykyfDuZVRrUp0Vb68YCKsLjJly/Theak+euNTxvHsB+\nal9oSgPPHICMEX65qvLywitx\n-----END CERTIFICATE-----\n".freeze]
+  s.date = "2025-03-25"
   s.description = "ruby2ruby provides a means of generating pure ruby code easily from\nRubyParser compatible Sexps. This makes making dynamic language\nprocessors in ruby easier than ever!".freeze
   s.email = ["ryand-ruby@zenspider.com".freeze]
   s.executables = ["r2r_show".freeze]
@@ -22,7 +22,7 @@ Gem::Specification.new do |s|
   s.homepage = "https://github.com/seattlerb/ruby2ruby".freeze
   s.licenses = ["MIT".freeze]
   s.rdoc_options = ["--main".freeze, "README.rdoc".freeze]
-  s.rubygems_version = "3.2.5".freeze
+  s.rubygems_version = "3.3.15".freeze
   s.summary = "ruby2ruby provides a means of generating pure ruby code easily from RubyParser compatible Sexps".freeze
 
   if s.respond_to? :specification_version then
@@ -30,12 +30,12 @@ Gem::Specification.new do |s|
   end
 
   if s.respond_to? :add_runtime_dependency then
-    s.add_development_dependency(%q<hoe>.freeze, ["~> 3.25"])
+    s.add_development_dependency(%q<hoe>.freeze, ["~> 4.2"])
     s.add_development_dependency(%q<rdoc>.freeze, [">= 4.0", "< 7"])
     s.add_runtime_dependency(%q<ruby_parser>.freeze, ["~> 3.1"])
     s.add_runtime_dependency(%q<sexp_processor>.freeze, ["~> 4.6"])
   else
-    s.add_dependency(%q<hoe>.freeze, ["~> 3.25"])
+    s.add_dependency(%q<hoe>.freeze, ["~> 4.2"])
     s.add_dependency(%q<rdoc>.freeze, [">= 4.0", "< 7"])
     s.add_dependency(%q<ruby_parser>.freeze, ["~> 3.1"])
     s.add_dependency(%q<sexp_processor>.freeze, ["~> 4.6"])
diff -pruN 2.5.0-1/test/test_ruby2ruby.rb 2.5.2-1/test/test_ruby2ruby.rb
--- 2.5.0-1/test/test_ruby2ruby.rb	2022-10-17 22:40:02.000000000 +0000
+++ 2.5.2-1/test/test_ruby2ruby.rb	2025-04-01 23:26:04.000000000 +0000
@@ -42,6 +42,15 @@ class TestRuby2Ruby < R2RTestCase
     @processor = Ruby2Ruby.new
   end
 
+  # some things don't work in earlier rubies... oh well.
+  def skip30
+    skip unless RUBY_VERSION > "3.0"
+  end
+
+  def skip31
+    skip unless RUBY_VERSION > "3.1"
+  end
+
   def do_not_check_sexp!
     @check_sexp = false
   end
@@ -126,8 +135,6 @@ class TestRuby2Ruby < R2RTestCase
   end
 
   def test_hash_shorthand_invalid_key_type
-    do_not_check_sexp!
-
     inn = s(:hash, s(:str, 'k'), nil)
     out = '{ k: }'
     assert_raises do
@@ -320,8 +327,6 @@ class TestRuby2Ruby < R2RTestCase
   end
 
   def test_dregx_slash
-    do_not_check_sexp!
-
     inn = util_thingy(:dregx)
     out = '/a"b#{(1 + 1)}c"d\/e/'
     assert_parse inn, out, /a"b2c"d\/e/
@@ -340,8 +345,6 @@ class TestRuby2Ruby < R2RTestCase
   end
 
   def test_lit_regexp_slash
-    do_not_check_sexp! # dunno why on this one
-
     assert_parse s(:lit, /blah\/blah/), '/blah\/blah/', /blah\/blah/
   end
 
@@ -438,8 +441,10 @@ class TestRuby2Ruby < R2RTestCase
   end
 
   def test_forward_args__call
-    inn = s(:call, nil, :y, s(:forward_args))
-    out = "y(...)"
+    skip31
+
+    inn = s(:defn, :x, s(:args, s(:forward_args)), s(:call, nil, :y, s(:forward_args)))
+    out = "def x(...)\n  y(...)\nend"
 
     assert_parse inn, out
   end
@@ -763,16 +768,22 @@ class TestRuby2Ruby < R2RTestCase
   end
 
   def test_case_in__array_pat_19
+    skip31
+
     assert_case_in "[^@a, ^$b, ^@@c]", s(:array_pat, nil, s(:ivar, :@a), s(:gvar, :$b), s(:cvar, :@@c)) # HACK: really not sure about this one
   end
 
   def test_case_in__find_pat_1
+    skip30
+
     assert_case_in "[*a, :+, *b]", s(:find_pat, nil, :"*a",
                                      s(:lit, :+),
                                      :"*b")
   end
 
   def test_case_in__find_pat_2
+    skip30
+
     assert_case_in "[*, :b, ^c, *]", s(:find_pat, nil,
                                        :*,
                                        s(:lit, :b), s(:lvar, :c),
@@ -780,6 +791,8 @@ class TestRuby2Ruby < R2RTestCase
   end
 
   def test_case_in__find_pat_3
+    skip30
+
     assert_case_in("Array(*b, n, { a: }, m, *a)",
                    s(:find_pat,
                      s(:const, :Array),
@@ -792,6 +805,8 @@ class TestRuby2Ruby < R2RTestCase
   end
 
   def test_case_in__find_pat_4
+    skip30
+
     assert_case_in("*b, n, { a: }, m, *a", s(:find_pat,
                                              nil,
                                              :"*b",
@@ -803,6 +818,8 @@ class TestRuby2Ruby < R2RTestCase
   end
 
   def test_case_in__find_pat_5
+    skip30
+
     assert_case_in("Array(*lhs, ^b, *rhs)", s(:find_pat,
                                               s(:const, :Array),
                                               :"*lhs",
@@ -1044,6 +1061,13 @@ class TestRuby2Ruby < R2RTestCase
     assert_parse inn, out
   end
 
+  def test_op_asgn_4
+    inn = s(:op_asgn, s(:colon3, :X), :"&", s(:lit, 1))
+
+    out = "::X &= 1"
+    assert_parse inn, out
+  end
+
   def test_rescue_block
     inn = s(:rescue,
             s(:call, nil, :alpha),
@@ -1073,7 +1097,7 @@ class TestRuby2Ruby < R2RTestCase
   end
 
   def test_unless_vs_if_not
-    do_not_check_sexp! # TODO: remove? dunno if that's possible w/ this one
+    do_not_check_sexp! # dunno if it's possible to remove this one
 
     rb1 = "a unless b"
     rb2 = "a if (not b)"
@@ -1087,7 +1111,7 @@ class TestRuby2Ruby < R2RTestCase
   end
 
   def ruby_parser
-    parser = RubyParser.for_current_ruby
+    parser = RubyParser.latest
 
     %i[a b c d].each do |v|
       parser.env[v] = :lvar
@@ -1155,7 +1179,7 @@ ir2r = File.read("lib/ruby2ruby.rb")
 require "ruby_parser"
 
 def morph_and_eval src, from, to, processor
-  parser = RubyParser.for_current_ruby rescue RubyParser.new
+  parser = RubyParser.latest
   new_src = processor.new.process(parser.process(src.sub(from, to)))
 
   eval new_src
