Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 24 additions & 15 deletions test/dev/bin_dev_test.rb
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,7 +18,8 @@
# exports must be on it (the drift over time).
transform!(RSpock::AST::Transformation)
class Dev::BinDevTest < Minitest::Test
BIN_DEV = File.expand_path("../../bin/dev", __dir__)
DEV_ROOT = File.expand_path("../..", __dir__)
BIN_DEV = File.join(DEV_ROOT, "bin", "dev")

# The scrub list, parsed from the shim's `unset` line (joining its
# backslash continuations). The sh script is the single source of truth
Expand DownExpand Up@@ -66,24 +67,32 @@ class Dev::BinDevTest < Minitest::Test

# The scrub list is a denylist of what `bundle exec` exports, and that
# set grows across bundler versions — a new exported key would silently
# re-open the leak. This suite itself runs under bundle exec, so the
# live truth is at hand: every key where ENV differs from
# Bundler.original_env was exported by the locked bundler. Subset
# direction only: keys the shim lists but this launch didn't export
# (config-dependent ones like BUNDLE_PATH) are free no-ops, so exact
# equality would only add flake.
test "the scrub list covers every key the running bundler exports" do
Given "the env diff bundler's activation left on this test process"
exported = (ENV.keys | Bundler.original_env.keys).select { |key| ENV[key] != Bundler.original_env[key] }
# re-open the leak. The live truth comes from the locked bundler itself:
# a child launched under `bundle exec` reports every key its activation
# exported (its ENV vs its Bundler.original_env). The launch is
# constructed here — the parent's own activation keys are removed first
# — because the suite's inherited env is whatever shell started it (an
# agent harness, an IDE) and proves nothing about the locked bundler.
# Subset direction only: keys the shim lists but this activation didn't
# export (config-dependent ones like BUNDLE_PATH) are free no-ops, so
# exact equality would only add flake.
test "the scrub list covers every key the locked bundler exports" do
Given "a child activated by the repo's bundle exec, from a base env with no prior activation"
# nil values unset the keys; BUNDLE_GEMFILE especially must be absent,
# or bundle exec's BUNDLER_ORIG_* record hides it from the diff.
fresh_env = ENV.keys.grep(/\A(?:BUNDLE_|BUNDLER_|RUBYOPT\z|RUBYLIB\z)/).to_h { |key| [key, nil] }
report_exported = 'puts((ENV.keys | Bundler.original_env.keys)' \
".select { |key| ENV[key] != Bundler.original_env[key] })"
out, _err, status = Open3.capture3(fresh_env, "bundle", "exec", "ruby", "-e", report_exported, chdir: DEV_ROOT)
# In scope: bundler/ruby activation keys. Out of scope: BUNDLER_ORIG_*
# (bundler's inert restore records) and GEM_* (legitimate user config,
# per dev#94).
activation_key = /\A(?:BUNDLE_|BUNDLER_(?!ORIG_)|RUBYOPT\z|RUBYLIB\z)/
hostile = exported.grep(activation_key)
exported = out.split("\n").grep(/\A(?:BUNDLE_|BUNDLER_(?!ORIG_)|RUBYOPT\z|RUBYLIB\z)/)

Expect "a bundler-activated suite (else this guard proves nothing), fully covered by the scrub list"
hostile.include?("BUNDLE_GEMFILE")
(hostile - SHIM_UNSET_KEYS).empty?
Expect "a fresh activation that exported the Gemfile pin, fully covered by the scrub list"
status.success?
exported.include?("BUNDLE_GEMFILE")
(exported - SHIM_UNSET_KEYS).empty?
end

# A PATH-front stub standing in for ruby: the shim's version probe
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 24 additions & 15 deletions test/dev/bin_dev_test.rb
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,7 +18,8 @@
# exports must be on it (the drift over time).
transform!(RSpock::AST::Transformation)
class Dev::BinDevTest < Minitest::Test
BIN_DEV = File.expand_path("../../bin/dev", __dir__)
DEV_ROOT = File.expand_path("../..", __dir__)
BIN_DEV = File.join(DEV_ROOT, "bin", "dev")

# The scrub list, parsed from the shim's `unset` line (joining its
# backslash continuations). The sh script is the single source of truth
Expand DownExpand Up@@ -66,24 +67,32 @@ class Dev::BinDevTest < Minitest::Test

# The scrub list is a denylist of what `bundle exec` exports, and that
# set grows across bundler versions — a new exported key would silently
# re-open the leak. This suite itself runs under bundle exec, so the
# live truth is at hand: every key where ENV differs from
# Bundler.original_env was exported by the locked bundler. Subset
# direction only: keys the shim lists but this launch didn't export
# (config-dependent ones like BUNDLE_PATH) are free no-ops, so exact
# equality would only add flake.
test "the scrub list covers every key the running bundler exports" do
Given "the env diff bundler's activation left on this test process"
exported = (ENV.keys | Bundler.original_env.keys).select { |key| ENV[key] != Bundler.original_env[key] }
# re-open the leak. The live truth comes from the locked bundler itself:
# a child launched under `bundle exec` reports every key its activation
# exported (its ENV vs its Bundler.original_env). The launch is
# constructed here — the parent's own activation keys are removed first
# — because the suite's inherited env is whatever shell started it (an
# agent harness, an IDE) and proves nothing about the locked bundler.
# Subset direction only: keys the shim lists but this activation didn't
# export (config-dependent ones like BUNDLE_PATH) are free no-ops, so
# exact equality would only add flake.
test "the scrub list covers every key the locked bundler exports" do
Given "a child activated by the repo's bundle exec, from a base env with no prior activation"
# nil values unset the keys; BUNDLE_GEMFILE especially must be absent,
# or bundle exec's BUNDLER_ORIG_* record hides it from the diff.
fresh_env = ENV.keys.grep(/\A(?:BUNDLE_|BUNDLER_|RUBYOPT\z|RUBYLIB\z)/).to_h { |key| [key, nil] }
report_exported = 'puts((ENV.keys | Bundler.original_env.keys)' \
".select { |key| ENV[key] != Bundler.original_env[key] })"
out, _err, status = Open3.capture3(fresh_env, "bundle", "exec", "ruby", "-e", report_exported, chdir: DEV_ROOT)
# In scope: bundler/ruby activation keys. Out of scope: BUNDLER_ORIG_*
# (bundler's inert restore records) and GEM_* (legitimate user config,
# per dev#94).
activation_key = /\A(?:BUNDLE_|BUNDLER_(?!ORIG_)|RUBYOPT\z|RUBYLIB\z)/
hostile = exported.grep(activation_key)
exported = out.split("\n").grep(/\A(?:BUNDLE_|BUNDLER_(?!ORIG_)|RUBYOPT\z|RUBYLIB\z)/)

Expect "a bundler-activated suite (else this guard proves nothing), fully covered by the scrub list"
hostile.include?("BUNDLE_GEMFILE")
(hostile - SHIM_UNSET_KEYS).empty?
Expect "a fresh activation that exported the Gemfile pin, fully covered by the scrub list"
status.success?
exported.include?("BUNDLE_GEMFILE")
(exported - SHIM_UNSET_KEYS).empty?
end

# A PATH-front stub standing in for ruby: the shim's version probe
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 24 additions & 15 deletions test/dev/bin_dev_test.rb
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,7 +18,8 @@
# exports must be on it (the drift over time).
transform!(RSpock::AST::Transformation)
class Dev::BinDevTest < Minitest::Test
BIN_DEV = File.expand_path("../../bin/dev", __dir__)
DEV_ROOT = File.expand_path("../..", __dir__)
BIN_DEV = File.join(DEV_ROOT, "bin", "dev")

# The scrub list, parsed from the shim's `unset` line (joining its
# backslash continuations). The sh script is the single source of truth
Expand DownExpand Up@@ -66,24 +67,32 @@ class Dev::BinDevTest < Minitest::Test

# The scrub list is a denylist of what `bundle exec` exports, and that
# set grows across bundler versions — a new exported key would silently
# re-open the leak. This suite itself runs under bundle exec, so the
# live truth is at hand: every key where ENV differs from
# Bundler.original_env was exported by the locked bundler. Subset
# direction only: keys the shim lists but this launch didn't export
# (config-dependent ones like BUNDLE_PATH) are free no-ops, so exact
# equality would only add flake.
test "the scrub list covers every key the running bundler exports" do
Given "the env diff bundler's activation left on this test process"
exported = (ENV.keys | Bundler.original_env.keys).select { |key| ENV[key] != Bundler.original_env[key] }
# re-open the leak. The live truth comes from the locked bundler itself:
# a child launched under `bundle exec` reports every key its activation
# exported (its ENV vs its Bundler.original_env). The launch is
# constructed here — the parent's own activation keys are removed first
# — because the suite's inherited env is whatever shell started it (an
# agent harness, an IDE) and proves nothing about the locked bundler.
# Subset direction only: keys the shim lists but this activation didn't
# export (config-dependent ones like BUNDLE_PATH) are free no-ops, so
# exact equality would only add flake.
test "the scrub list covers every key the locked bundler exports" do
Given "a child activated by the repo's bundle exec, from a base env with no prior activation"
# nil values unset the keys; BUNDLE_GEMFILE especially must be absent,
# or bundle exec's BUNDLER_ORIG_* record hides it from the diff.
fresh_env = ENV.keys.grep(/\A(?:BUNDLE_|BUNDLER_|RUBYOPT\z|RUBYLIB\z)/).to_h { |key| [key, nil] }
report_exported = 'puts((ENV.keys | Bundler.original_env.keys)' \
".select { |key| ENV[key] != Bundler.original_env[key] })"
out, _err, status = Open3.capture3(fresh_env, "bundle", "exec", "ruby", "-e", report_exported, chdir: DEV_ROOT)
# In scope: bundler/ruby activation keys. Out of scope: BUNDLER_ORIG_*
# (bundler's inert restore records) and GEM_* (legitimate user config,
# per dev#94).
activation_key = /\A(?:BUNDLE_|BUNDLER_(?!ORIG_)|RUBYOPT\z|RUBYLIB\z)/
hostile = exported.grep(activation_key)
exported = out.split("\n").grep(/\A(?:BUNDLE_|BUNDLER_(?!ORIG_)|RUBYOPT\z|RUBYLIB\z)/)

Expect "a bundler-activated suite (else this guard proves nothing), fully covered by the scrub list"
hostile.include?("BUNDLE_GEMFILE")
(hostile - SHIM_UNSET_KEYS).empty?
Expect "a fresh activation that exported the Gemfile pin, fully covered by the scrub list"
status.success?
exported.include?("BUNDLE_GEMFILE")
(exported - SHIM_UNSET_KEYS).empty?
end

# A PATH-front stub standing in for ruby: the shim's version probe
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 24 additions & 15 deletions test/dev/bin_dev_test.rb
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,7 +18,8 @@
# exports must be on it (the drift over time).
transform!(RSpock::AST::Transformation)
class Dev::BinDevTest < Minitest::Test
BIN_DEV = File.expand_path("../../bin/dev", __dir__)
DEV_ROOT = File.expand_path("../..", __dir__)
BIN_DEV = File.join(DEV_ROOT, "bin", "dev")

# The scrub list, parsed from the shim's `unset` line (joining its
# backslash continuations). The sh script is the single source of truth
Expand DownExpand Up@@ -66,24 +67,32 @@ class Dev::BinDevTest < Minitest::Test

# The scrub list is a denylist of what `bundle exec` exports, and that
# set grows across bundler versions — a new exported key would silently
# re-open the leak. This suite itself runs under bundle exec, so the
# live truth is at hand: every key where ENV differs from
# Bundler.original_env was exported by the locked bundler. Subset
# direction only: keys the shim lists but this launch didn't export
# (config-dependent ones like BUNDLE_PATH) are free no-ops, so exact
# equality would only add flake.
test "the scrub list covers every key the running bundler exports" do
Given "the env diff bundler's activation left on this test process"
exported = (ENV.keys | Bundler.original_env.keys).select { |key| ENV[key] != Bundler.original_env[key] }
# re-open the leak. The live truth comes from the locked bundler itself:
# a child launched under `bundle exec` reports every key its activation
# exported (its ENV vs its Bundler.original_env). The launch is
# constructed here — the parent's own activation keys are removed first
# — because the suite's inherited env is whatever shell started it (an
# agent harness, an IDE) and proves nothing about the locked bundler.
# Subset direction only: keys the shim lists but this activation didn't
# export (config-dependent ones like BUNDLE_PATH) are free no-ops, so
# exact equality would only add flake.
test "the scrub list covers every key the locked bundler exports" do
Given "a child activated by the repo's bundle exec, from a base env with no prior activation"
# nil values unset the keys; BUNDLE_GEMFILE especially must be absent,
# or bundle exec's BUNDLER_ORIG_* record hides it from the diff.
fresh_env = ENV.keys.grep(/\A(?:BUNDLE_|BUNDLER_|RUBYOPT\z|RUBYLIB\z)/).to_h { |key| [key, nil] }
report_exported = 'puts((ENV.keys | Bundler.original_env.keys)' \
".select { |key| ENV[key] != Bundler.original_env[key] })"
out, _err, status = Open3.capture3(fresh_env, "bundle", "exec", "ruby", "-e", report_exported, chdir: DEV_ROOT)
# In scope: bundler/ruby activation keys. Out of scope: BUNDLER_ORIG_*
# (bundler's inert restore records) and GEM_* (legitimate user config,
# per dev#94).
activation_key = /\A(?:BUNDLE_|BUNDLER_(?!ORIG_)|RUBYOPT\z|RUBYLIB\z)/
hostile = exported.grep(activation_key)
exported = out.split("\n").grep(/\A(?:BUNDLE_|BUNDLER_(?!ORIG_)|RUBYOPT\z|RUBYLIB\z)/)

Expect "a bundler-activated suite (else this guard proves nothing), fully covered by the scrub list"
hostile.include?("BUNDLE_GEMFILE")
(hostile - SHIM_UNSET_KEYS).empty?
Expect "a fresh activation that exported the Gemfile pin, fully covered by the scrub list"
status.success?
exported.include?("BUNDLE_GEMFILE")
(exported - SHIM_UNSET_KEYS).empty?
end

# A PATH-front stub standing in for ruby: the shim's version probe
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 24 additions & 15 deletions test/dev/bin_dev_test.rb
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,7 +18,8 @@
# exports must be on it (the drift over time).
transform!(RSpock::AST::Transformation)
class Dev::BinDevTest < Minitest::Test
BIN_DEV = File.expand_path("../../bin/dev", __dir__)
DEV_ROOT = File.expand_path("../..", __dir__)
BIN_DEV = File.join(DEV_ROOT, "bin", "dev")

# The scrub list, parsed from the shim's `unset` line (joining its
# backslash continuations). The sh script is the single source of truth
Expand DownExpand Up@@ -66,24 +67,32 @@ class Dev::BinDevTest < Minitest::Test

# The scrub list is a denylist of what `bundle exec` exports, and that
# set grows across bundler versions — a new exported key would silently
# re-open the leak. This suite itself runs under bundle exec, so the
# live truth is at hand: every key where ENV differs from
# Bundler.original_env was exported by the locked bundler. Subset
# direction only: keys the shim lists but this launch didn't export
# (config-dependent ones like BUNDLE_PATH) are free no-ops, so exact
# equality would only add flake.
test "the scrub list covers every key the running bundler exports" do
Given "the env diff bundler's activation left on this test process"
exported = (ENV.keys | Bundler.original_env.keys).select { |key| ENV[key] != Bundler.original_env[key] }
# re-open the leak. The live truth comes from the locked bundler itself:
# a child launched under `bundle exec` reports every key its activation
# exported (its ENV vs its Bundler.original_env). The launch is
# constructed here — the parent's own activation keys are removed first
# — because the suite's inherited env is whatever shell started it (an
# agent harness, an IDE) and proves nothing about the locked bundler.
# Subset direction only: keys the shim lists but this activation didn't
# export (config-dependent ones like BUNDLE_PATH) are free no-ops, so
# exact equality would only add flake.
test "the scrub list covers every key the locked bundler exports" do
Given "a child activated by the repo's bundle exec, from a base env with no prior activation"
# nil values unset the keys; BUNDLE_GEMFILE especially must be absent,
# or bundle exec's BUNDLER_ORIG_* record hides it from the diff.
fresh_env = ENV.keys.grep(/\A(?:BUNDLE_|BUNDLER_|RUBYOPT\z|RUBYLIB\z)/).to_h { |key| [key, nil] }
report_exported = 'puts((ENV.keys | Bundler.original_env.keys)' \
".select { |key| ENV[key] != Bundler.original_env[key] })"
out, _err, status = Open3.capture3(fresh_env, "bundle", "exec", "ruby", "-e", report_exported, chdir: DEV_ROOT)
# In scope: bundler/ruby activation keys. Out of scope: BUNDLER_ORIG_*
# (bundler's inert restore records) and GEM_* (legitimate user config,
# per dev#94).
activation_key = /\A(?:BUNDLE_|BUNDLER_(?!ORIG_)|RUBYOPT\z|RUBYLIB\z)/
hostile = exported.grep(activation_key)
exported = out.split("\n").grep(/\A(?:BUNDLE_|BUNDLER_(?!ORIG_)|RUBYOPT\z|RUBYLIB\z)/)

Expect "a bundler-activated suite (else this guard proves nothing), fully covered by the scrub list"
hostile.include?("BUNDLE_GEMFILE")
(hostile - SHIM_UNSET_KEYS).empty?
Expect "a fresh activation that exported the Gemfile pin, fully covered by the scrub list"
status.success?
exported.include?("BUNDLE_GEMFILE")
(exported - SHIM_UNSET_KEYS).empty?
end

# A PATH-front stub standing in for ruby: the shim's version probe
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 24 additions & 15 deletions test/dev/bin_dev_test.rb
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,7 +18,8 @@
# exports must be on it (the drift over time).
transform!(RSpock::AST::Transformation)
class Dev::BinDevTest < Minitest::Test
BIN_DEV = File.expand_path("../../bin/dev", __dir__)
DEV_ROOT = File.expand_path("../..", __dir__)
BIN_DEV = File.join(DEV_ROOT, "bin", "dev")

# The scrub list, parsed from the shim's `unset` line (joining its
# backslash continuations). The sh script is the single source of truth
Expand DownExpand Up@@ -66,24 +67,32 @@ class Dev::BinDevTest < Minitest::Test

# The scrub list is a denylist of what `bundle exec` exports, and that
# set grows across bundler versions — a new exported key would silently
# re-open the leak. This suite itself runs under bundle exec, so the
# live truth is at hand: every key where ENV differs from
# Bundler.original_env was exported by the locked bundler. Subset
# direction only: keys the shim lists but this launch didn't export
# (config-dependent ones like BUNDLE_PATH) are free no-ops, so exact
# equality would only add flake.
test "the scrub list covers every key the running bundler exports" do
Given "the env diff bundler's activation left on this test process"
exported = (ENV.keys | Bundler.original_env.keys).select { |key| ENV[key] != Bundler.original_env[key] }
# re-open the leak. The live truth comes from the locked bundler itself:
# a child launched under `bundle exec` reports every key its activation
# exported (its ENV vs its Bundler.original_env). The launch is
# constructed here — the parent's own activation keys are removed first
# — because the suite's inherited env is whatever shell started it (an
# agent harness, an IDE) and proves nothing about the locked bundler.
# Subset direction only: keys the shim lists but this activation didn't
# export (config-dependent ones like BUNDLE_PATH) are free no-ops, so
# exact equality would only add flake.
test "the scrub list covers every key the locked bundler exports" do
Given "a child activated by the repo's bundle exec, from a base env with no prior activation"
# nil values unset the keys; BUNDLE_GEMFILE especially must be absent,
# or bundle exec's BUNDLER_ORIG_* record hides it from the diff.
fresh_env = ENV.keys.grep(/\A(?:BUNDLE_|BUNDLER_|RUBYOPT\z|RUBYLIB\z)/).to_h { |key| [key, nil] }
report_exported = 'puts((ENV.keys | Bundler.original_env.keys)' \
".select { |key| ENV[key] != Bundler.original_env[key] })"
out, _err, status = Open3.capture3(fresh_env, "bundle", "exec", "ruby", "-e", report_exported, chdir: DEV_ROOT)
# In scope: bundler/ruby activation keys. Out of scope: BUNDLER_ORIG_*
# (bundler's inert restore records) and GEM_* (legitimate user config,
# per dev#94).
activation_key = /\A(?:BUNDLE_|BUNDLER_(?!ORIG_)|RUBYOPT\z|RUBYLIB\z)/
hostile = exported.grep(activation_key)
exported = out.split("\n").grep(/\A(?:BUNDLE_|BUNDLER_(?!ORIG_)|RUBYOPT\z|RUBYLIB\z)/)

Expect "a bundler-activated suite (else this guard proves nothing), fully covered by the scrub list"
hostile.include?("BUNDLE_GEMFILE")
(hostile - SHIM_UNSET_KEYS).empty?
Expect "a fresh activation that exported the Gemfile pin, fully covered by the scrub list"
status.success?
exported.include?("BUNDLE_GEMFILE")
(exported - SHIM_UNSET_KEYS).empty?
end

# A PATH-front stub standing in for ruby: the shim's version probe
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 24 additions & 15 deletions test/dev/bin_dev_test.rb
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,7 +18,8 @@
# exports must be on it (the drift over time).
transform!(RSpock::AST::Transformation)
class Dev::BinDevTest < Minitest::Test
BIN_DEV = File.expand_path("../../bin/dev", __dir__)
DEV_ROOT = File.expand_path("../..", __dir__)
BIN_DEV = File.join(DEV_ROOT, "bin", "dev")

# The scrub list, parsed from the shim's `unset` line (joining its
# backslash continuations). The sh script is the single source of truth
Expand DownExpand Up@@ -66,24 +67,32 @@ class Dev::BinDevTest < Minitest::Test

# The scrub list is a denylist of what `bundle exec` exports, and that
# set grows across bundler versions — a new exported key would silently
# re-open the leak. This suite itself runs under bundle exec, so the
# live truth is at hand: every key where ENV differs from
# Bundler.original_env was exported by the locked bundler. Subset
# direction only: keys the shim lists but this launch didn't export
# (config-dependent ones like BUNDLE_PATH) are free no-ops, so exact
# equality would only add flake.
test "the scrub list covers every key the running bundler exports" do
Given "the env diff bundler's activation left on this test process"
exported = (ENV.keys | Bundler.original_env.keys).select { |key| ENV[key] != Bundler.original_env[key] }
# re-open the leak. The live truth comes from the locked bundler itself:
# a child launched under `bundle exec` reports every key its activation
# exported (its ENV vs its Bundler.original_env). The launch is
# constructed here — the parent's own activation keys are removed first
# — because the suite's inherited env is whatever shell started it (an
# agent harness, an IDE) and proves nothing about the locked bundler.
# Subset direction only: keys the shim lists but this activation didn't
# export (config-dependent ones like BUNDLE_PATH) are free no-ops, so
# exact equality would only add flake.
test "the scrub list covers every key the locked bundler exports" do
Given "a child activated by the repo's bundle exec, from a base env with no prior activation"
# nil values unset the keys; BUNDLE_GEMFILE especially must be absent,
# or bundle exec's BUNDLER_ORIG_* record hides it from the diff.
fresh_env = ENV.keys.grep(/\A(?:BUNDLE_|BUNDLER_|RUBYOPT\z|RUBYLIB\z)/).to_h { |key| [key, nil] }
report_exported = 'puts((ENV.keys | Bundler.original_env.keys)' \
".select { |key| ENV[key] != Bundler.original_env[key] })"
out, _err, status = Open3.capture3(fresh_env, "bundle", "exec", "ruby", "-e", report_exported, chdir: DEV_ROOT)
# In scope: bundler/ruby activation keys. Out of scope: BUNDLER_ORIG_*
# (bundler's inert restore records) and GEM_* (legitimate user config,
# per dev#94).
activation_key = /\A(?:BUNDLE_|BUNDLER_(?!ORIG_)|RUBYOPT\z|RUBYLIB\z)/
hostile = exported.grep(activation_key)
exported = out.split("\n").grep(/\A(?:BUNDLE_|BUNDLER_(?!ORIG_)|RUBYOPT\z|RUBYLIB\z)/)

Expect "a bundler-activated suite (else this guard proves nothing), fully covered by the scrub list"
hostile.include?("BUNDLE_GEMFILE")
(hostile - SHIM_UNSET_KEYS).empty?
Expect "a fresh activation that exported the Gemfile pin, fully covered by the scrub list"
status.success?
exported.include?("BUNDLE_GEMFILE")
(exported - SHIM_UNSET_KEYS).empty?
end

# A PATH-front stub standing in for ruby: the shim's version probe
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 24 additions & 15 deletions test/dev/bin_dev_test.rb
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,7 +18,8 @@
# exports must be on it (the drift over time).
transform!(RSpock::AST::Transformation)
class Dev::BinDevTest < Minitest::Test
BIN_DEV = File.expand_path("../../bin/dev", __dir__)
DEV_ROOT = File.expand_path("../..", __dir__)
BIN_DEV = File.join(DEV_ROOT, "bin", "dev")

# The scrub list, parsed from the shim's `unset` line (joining its
# backslash continuations). The sh script is the single source of truth
Expand DownExpand Up@@ -66,24 +67,32 @@ class Dev::BinDevTest < Minitest::Test

# The scrub list is a denylist of what `bundle exec` exports, and that
# set grows across bundler versions — a new exported key would silently
# re-open the leak. This suite itself runs under bundle exec, so the
# live truth is at hand: every key where ENV differs from
# Bundler.original_env was exported by the locked bundler. Subset
# direction only: keys the shim lists but this launch didn't export
# (config-dependent ones like BUNDLE_PATH) are free no-ops, so exact
# equality would only add flake.
test "the scrub list covers every key the running bundler exports" do
Given "the env diff bundler's activation left on this test process"
exported = (ENV.keys | Bundler.original_env.keys).select { |key| ENV[key] != Bundler.original_env[key] }
# re-open the leak. The live truth comes from the locked bundler itself:
# a child launched under `bundle exec` reports every key its activation
# exported (its ENV vs its Bundler.original_env). The launch is
# constructed here — the parent's own activation keys are removed first
# — because the suite's inherited env is whatever shell started it (an
# agent harness, an IDE) and proves nothing about the locked bundler.
# Subset direction only: keys the shim lists but this activation didn't
# export (config-dependent ones like BUNDLE_PATH) are free no-ops, so
# exact equality would only add flake.
test "the scrub list covers every key the locked bundler exports" do
Given "a child activated by the repo's bundle exec, from a base env with no prior activation"
# nil values unset the keys; BUNDLE_GEMFILE especially must be absent,
# or bundle exec's BUNDLER_ORIG_* record hides it from the diff.
fresh_env = ENV.keys.grep(/\A(?:BUNDLE_|BUNDLER_|RUBYOPT\z|RUBYLIB\z)/).to_h { |key| [key, nil] }
report_exported = 'puts((ENV.keys | Bundler.original_env.keys)' \
".select { |key| ENV[key] != Bundler.original_env[key] })"
out, _err, status = Open3.capture3(fresh_env, "bundle", "exec", "ruby", "-e", report_exported, chdir: DEV_ROOT)
# In scope: bundler/ruby activation keys. Out of scope: BUNDLER_ORIG_*
# (bundler's inert restore records) and GEM_* (legitimate user config,
# per dev#94).
activation_key = /\A(?:BUNDLE_|BUNDLER_(?!ORIG_)|RUBYOPT\z|RUBYLIB\z)/
hostile = exported.grep(activation_key)
exported = out.split("\n").grep(/\A(?:BUNDLE_|BUNDLER_(?!ORIG_)|RUBYOPT\z|RUBYLIB\z)/)

Expect "a bundler-activated suite (else this guard proves nothing), fully covered by the scrub list"
hostile.include?("BUNDLE_GEMFILE")
(hostile - SHIM_UNSET_KEYS).empty?
Expect "a fresh activation that exported the Gemfile pin, fully covered by the scrub list"
status.success?
exported.include?("BUNDLE_GEMFILE")
(exported - SHIM_UNSET_KEYS).empty?
end

# A PATH-front stub standing in for ruby: the shim's version probe
Expand Down
Loading