Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

View JacobNinja's full-sized avatar

JR Richardson JacobNinja

View GitHub Profile
(defn unsafe-deserialization? [node]
(and (call-with-receiver-node? node)
(eq-receiver? node "YAML")
(some #(eq-method-name? node %)
["load" "load_documents" "load_stream" "parse_documents" "parse_stream"])))
@JacobNinja
JacobNinja / gist:a38d0f4b02759c910dc3
Created May 2, 2014 16:03
Mandatory keyword args
2.1.1 :001 > def test(foo:)
2.1.1 :002?> puts foo
2.1.1 :003?> end
=> :test
2.1.1 :004 > test()
ArgumentError: missing keyword: foo
jacob@Ninja:$ bin/benchmark_rails
Rehearsal ------------------------------------
"Codeminer encountered 2 errors parsing 1711 files"
6.520000 0.040000 6.560000 ( 6.564404)
"RubyParser encountered 26 errors parsing 1711 files"
17.110000 0.240000 17.350000 ( 17.340777)
-------------------------- total: 23.910000sec
user system total real
class RenameTableToLongerName < ActiveRecord::Migration
def change
remove_index :table, name: 'index_table_on_something_id'
remove_index :table, name: 'index_table_on_something_id'
rename_table :table, :incredibly_long_table_name_overflowing_index_length
add_index :incredibly_long_table_name_overflowing_index_length, :something_id, name: 'index_iltnoil_on_something_id'
add_index :incredibly_long_table_name_overflowing_index_length, :something_id, name: 'index_iltnoil_on_something_id'
end
end
@JacobNinja
JacobNinja / substitution_example.rb
Created July 9, 2014 21:45
Source tree substitution examples
# Example 1: Swap the consequence and else statements in an if expression
if_node = CodeMiner.parse(<<-RUBY).each.first
if foo
begin
do_something
end
else
do_something_else
end
Parse results for Rails
user system total real
"Codeminer parse results: 0 parse errors, 0 runtime errors, 1621 files total"
7.760000 0.080000 7.840000 ( 7.980644)
"Codeminer sexp results: 0 parse errors, 0 runtime errors, 1621 files total"
11.080000 0.040000 11.120000 ( 11.136238)
"Codeminer (RubyParser compatible) sexp results: 0 parse errors, 0 runtime errors, 1621 files total"
11.250000 0.070000 11.320000 ( 11.317630)
"Codeminer flog results: 0 parse errors, 0 runtime errors, 1621 files total"
@JacobNinja
JacobNinja / gist:f5fda976f38d23477547
Created November 23, 2014 15:47
Destructuring with splat
class NilClass
def to_a
p 'calling to_a within NilClass'
[]
end
end
# irb(main):017:0> [*nil]
# "calling to_a within NilClass"
# => []
@JacobNinja
JacobNinja / gist:0032e88f980f217bc61f
Created January 22, 2015 19:30
' vs " in MRI parser
irb(main):002:0> Ripper.sexp "'foo'"
=> [:program, [[:string_literal, [:string_content, [:@tstring_content, "foo", [1, 1]]]]]]
irb(main):003:0> Ripper.sexp '"foo"'
=> [:program, [[:string_literal, [:string_content, [:@tstring_content, "foo", [1, 1]]]]]]
irb(main):004:0> Ripper.sexp '"#{foo}"'
=> [:program, [[:string_literal, [:string_content, [:string_embexpr, [[:vcall, [:@ident, "foo", [1, 3]]]]]]]]]
@JacobNinja
JacobNinja / aot.clj
Created August 4, 2015 00:55
Scan namespace declarations for potential AOT targets
; Add the resulting vector to `:aot` on your dev profile
(def directory ".")
(defn- read-file [file]
(binding [*read-eval* false]
(read-string (slurp file))))
(defn- require-form? [form]
(and (seq? form)
@JacobNinja
JacobNinja / greeting-kata.clj
Created August 12, 2015 20:08
Greeting kata solution
;; Core
(defn- maplast
"Apply map-fn to the last element in s
unless s contains only 1 element"
[map-fn s]
(if (> (count s) 1)
(conj (vec (butlast s))
(map-fn (last s)))
s))