joshua-transmogrify 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt ADDED
@@ -0,0 +1,6 @@
1
+ === 1.0.0 / 2008-11-17
2
+
3
+ * 1 major enhancement
4
+
5
+ * Birthday!
6
+
data/README.txt ADDED
@@ -0,0 +1,77 @@
1
+ = transmogrify
2
+
3
+ * http://github.com/zenspider/transmogrify/tree/master
4
+ * http://rubyforge.org/projects/seattlerb
5
+
6
+ == DESCRIPTION:
7
+
8
+ Transmogrify unfactors your code, providing you with much needed job
9
+ security in today's volatile economy.
10
+
11
+ == FEATURES/PROBLEMS:
12
+
13
+ * Transmogrify rewrites your code using Advanced Technology(tm).
14
+ * lvar and ivar renaming:
15
+ * numbered sequences
16
+ * pig latin
17
+ * rot13
18
+ * replace true and false with !!?! and !!!?!
19
+ * combinations of builders (rot13 a douchified name, etc)
20
+ * transmogrify command line tool transmogrifies and replaces the old code!
21
+
22
+ == TODO/IDEAS
23
+
24
+ * loop unrolling
25
+ * hash -> array conversion
26
+ * misuse of raise/rescue, try/catch
27
+ * private method renaming
28
+ * namespacing
29
+ * unnamespacing
30
+ * renamespacing
31
+ * comment removal - this is done via r2r whether we like it or not atm
32
+ * comment addition
33
+ * project restructuring
34
+ * rakefile obfuscation - convolute the build and running tests etc.
35
+ * ungemification
36
+ * randomize method order
37
+ * math identities (*1, +0) and other fun, pi=3
38
+ * replace real word variables with antonyms
39
+
40
+ == SYNOPSIS:
41
+
42
+ % transmogrify lib/blah.rb
43
+
44
+ == REQUIREMENTS:
45
+
46
+ * ruby2ruby
47
+ * sexp_processor
48
+ * ruby_parser
49
+
50
+ == INSTALL:
51
+
52
+ * sudo gem install transmogrify
53
+
54
+ == LICENSE:
55
+
56
+ (The MIT License)
57
+
58
+ Copyright (c) 2008 Ryan Davis, Rein Henrichs
59
+
60
+ Permission is hereby granted, free of charge, to any person obtaining
61
+ a copy of this software and associated documentation files (the
62
+ 'Software'), to deal in the Software without restriction, including
63
+ without limitation the rights to use, copy, modify, merge, publish,
64
+ distribute, sublicense, and/or sell copies of the Software, and to
65
+ permit persons to whom the Software is furnished to do so, subject to
66
+ the following conditions:
67
+
68
+ The above copyright notice and this permission notice shall be
69
+ included in all copies or substantial portions of the Software.
70
+
71
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
72
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
73
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
74
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
75
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
76
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
77
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'echoe'
4
+
5
+ Echoe.new('transmogrify', '1.0.0') do |p|
6
+ p.author = ['Ryan Davis', 'Rein Henrichs']
7
+ p.email = ['ryand-ruby@zenspider.com', 'reinh@reinh.com']
8
+ p.summary = "Unfactoring your code, for evil."
9
+ p.runtime_dependencies = ['ruby2ruby', 'sexp_processor >= 3.0.0', 'ruby_parser >= 2.0.1']
10
+ p.bin_files = "bin/transmogrify"
11
+ end
data/bin/transmogrify ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/ruby -w
2
+
3
+ # p $:
4
+
5
+ require 'transmogrify'
6
+
7
+ trans = Transmogrify.new Transmogrifiers::DouchyNumbers
8
+ trans.run ARGV
9
+
10
+ exit 0
11
+
@@ -0,0 +1,9 @@
1
+ module Transmogrifiers
2
+ module DouchyNumbers
3
+ def transmogrify(name)
4
+ @count ||= 0
5
+ @count += 1
6
+ :"douche#{'%02d' % @count}"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,22 @@
1
+ module Transmogrifiers
2
+ module Piglatin
3
+ def transmogrify(name)
4
+ name = super.to_s
5
+ append_string = ''
6
+
7
+ if match = name.match(/\d+$/)
8
+ name, append_string = match.pre_match, match[0]
9
+ end
10
+
11
+ if match = name.match(/^[^aeiou]+/i)
12
+ name = match.post_match + match[0]
13
+ else
14
+ name << 'w'
15
+ end
16
+
17
+ name.downcase!.capitalize! if name.match(/[A-Z]/)
18
+
19
+ :"#{name}ay#{append_string}"
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,7 @@
1
+ module Transmogrifiers
2
+ module Rot13
3
+ def transmogrify(name)
4
+ name.to_s.tr('a-mn-zA-MN-Z', 'n-za-mN-ZA-M').to_sym
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,103 @@
1
+ require 'rubygems'
2
+ require 'ruby2ruby'
3
+ require 'sexp_processor'
4
+ require 'ruby_parser'
5
+ require 'transmogrifiers/douchy_numbers'
6
+ require 'transmogrifiers/piglatin'
7
+ require 'transmogrifiers/rot13'
8
+
9
+ class Transmogrify < SexpProcessor
10
+ include Transmogrifiers
11
+ VERSION = '1.0.0'
12
+
13
+ def initialize(*transmogrifiers)
14
+ transmogrifiers.each {|transmogrifier| extend transmogrifier}
15
+ super()
16
+
17
+ @r2r = Ruby2Ruby.new
18
+ @ivars = {}
19
+ @lvars = {}
20
+ end
21
+
22
+ def new_ivar(name)
23
+ @ivars[name] = :"@#{transmogrify(name)}" # TODO: LAME
24
+ end
25
+
26
+ def new_lvar(name)
27
+ @lvars[name] = transmogrify(name)
28
+ end
29
+
30
+ def rewrite_args exp
31
+ name = exp[1]
32
+ exp[1] = new_lvar(name)
33
+ exp
34
+ end
35
+
36
+ def rewrite_false exp
37
+ s(:not, s(:not, s(:not, s(:lit, 33))))
38
+ end
39
+
40
+ def rewrite_iasgn exp
41
+ name = exp[1]
42
+ exp[1] = @ivars[name] || new_ivar(name)
43
+ exp
44
+ end
45
+
46
+ def rewrite_lasgn exp
47
+ name = exp[1]
48
+ exp[1] = @lvars[name] || new_lvar(name)
49
+ exp
50
+ end
51
+
52
+ def rewrite_lvar exp
53
+ name = exp[1]
54
+ exp[1] = @lvars[name] || new_ivar(name)
55
+ exp
56
+ end
57
+
58
+ def rewrite_ivar exp
59
+ name = exp[1]
60
+ exp[1] = @ivars[name] || new_ivar(name)
61
+ exp
62
+ end
63
+
64
+ def rewrite_true exp
65
+ s(:not, s(:not, s(:lit, 33)))
66
+ end
67
+
68
+ def run files_and_dirs
69
+ files_and_dirs.each do |file_or_dir|
70
+ if File.file? file_or_dir then
71
+ transmogrify_file file_or_dir
72
+ elsif File.directory? file_or_dir then
73
+ Dir[File.join(file_or_dir, "**/*.rb")].each do |file|
74
+ transmogrify_file file
75
+ end
76
+ else
77
+ # silently skipping for now
78
+ end
79
+ end
80
+ end
81
+
82
+ # TODO: I think this is way too generic a name
83
+ def transmogrify(name)
84
+ name
85
+ end
86
+
87
+ def transmogrify_file path
88
+ ruby = transmogrify_string File.read(path)
89
+ new_path, old_path = "#{path}.new", "#{path}.old"
90
+ File.open("#{path}.new", 'w') do |f|
91
+ f.puts ruby
92
+ end
93
+ File.rename path, old_path
94
+ File.rename new_path, path
95
+ end
96
+
97
+ def transmogrify_string ruby
98
+ rp = RubyParser.new
99
+ sexp = rp.process ruby
100
+ sexp = self.process sexp
101
+ @r2r.process(sexp)
102
+ end
103
+ end
@@ -0,0 +1,125 @@
1
+
2
+ require 'test/unit'
3
+ require 'transmogrify'
4
+
5
+ class TestTransmogrify < Test::Unit::TestCase
6
+ include Transmogrifiers
7
+
8
+ def setup
9
+ # number = 1
10
+ # string = 'string'
11
+ # puts number
12
+ # puts string
13
+
14
+ @lvar_sexp = s(:block,
15
+ s(:lasgn, :number, s(:lit, 1)),
16
+ s(:lasgn, :string, s(:str, "string")),
17
+ s(:call, nil, :puts, s(:arglist, s(:lvar, :number))),
18
+ s(:call, nil, :puts, s(:arglist, s(:lvar, :string))))
19
+
20
+ # def x arg
21
+ # y = 42
22
+ # y + arg
23
+ # end
24
+
25
+ @defn_sexp = s(:defn, :x, s(:args, :arg),
26
+ s(:scope,
27
+ s(:block,
28
+ s(:lasgn, :y, s(:lit, 42)),
29
+ s(:call, s(:lvar, :y), :+,
30
+ s(:arglist, s(:lvar, :arg))))))
31
+
32
+ # @number = 1
33
+ # @string = 'string'
34
+ # puts @number
35
+ # puts @string
36
+
37
+ @iasgn_sexp = s(:block,
38
+ s(:iasgn, :@number, s(:lit, 1)),
39
+ s(:iasgn, :@string, s(:str, "string")),
40
+ s(:call, nil, :puts, s(:arglist, s(:ivar, :@number))),
41
+ s(:call, nil, :puts, s(:arglist, s(:ivar, :@string))))
42
+
43
+ # true
44
+ # false
45
+
46
+ @true_false_sexp = s(:block,
47
+ s(:true),
48
+ s(:false))
49
+ end
50
+
51
+ def test_rewrite_lvar_with_douchy_numbers
52
+ expected = s(:block,
53
+ s(:lasgn, :douche01, s(:lit, 1)),
54
+ s(:lasgn, :douche02, s(:str, "string")),
55
+ s(:call, nil, :puts, s(:arglist, s(:lvar, :douche01))),
56
+ s(:call, nil, :puts, s(:arglist, s(:lvar, :douche02))))
57
+
58
+ trans = Transmogrify.new(DouchyNumbers)
59
+ actual = trans.process @lvar_sexp
60
+
61
+ assert_equal expected, actual
62
+ end
63
+
64
+ def test_rewrite_lvar_with_douchy_numbers_and_piglatin
65
+ expected = s(:block,
66
+ s(:lasgn, :oucheday01, s(:lit, 1)),
67
+ s(:lasgn, :oucheday02, s(:str, "string")),
68
+ s(:call, nil, :puts, s(:arglist, s(:lvar, :oucheday01))),
69
+ s(:call, nil, :puts, s(:arglist, s(:lvar, :oucheday02))))
70
+
71
+ trans = Transmogrify.new(DouchyNumbers, Piglatin)
72
+ actual = trans.process @lvar_sexp
73
+
74
+ assert_equal expected, actual
75
+ end
76
+
77
+ def test_rewrite_lvar_defn_args
78
+ expected = s(:defn, :x, s(:args, :douche01),
79
+ s(:scope,
80
+ s(:block,
81
+ s(:lasgn, :douche02, s(:lit, 42)),
82
+ s(:call, s(:lvar, :douche02), :+,
83
+ s(:arglist, s(:lvar, :douche01))))))
84
+
85
+ trans = Transmogrify.new(DouchyNumbers)
86
+ actual = trans.process @defn_sexp
87
+
88
+ assert_equal expected, actual
89
+ end
90
+
91
+ def test_rewrite_ivar_with_douchy_numbers
92
+ expected = s(:block,
93
+ s(:iasgn, :@douche01, s(:lit, 1)),
94
+ s(:iasgn, :@douche02, s(:str, "string")),
95
+ s(:call, nil, :puts, s(:arglist, s(:ivar, :@douche01))),
96
+ s(:call, nil, :puts, s(:arglist, s(:ivar, :@douche02))))
97
+ trans = Transmogrify.new(DouchyNumbers)
98
+ actual = trans.process @iasgn_sexp
99
+
100
+ assert_equal expected, actual
101
+ end
102
+
103
+ def test_rewrite_true_false
104
+ expected = s(:block,
105
+ s(:not, s(:not, s(:lit, 33))),
106
+ s(:not, s(:not, s(:not, s(:lit, 33)))))
107
+ trans = Transmogrify.new(DouchyNumbers)
108
+ actual = trans.process @true_false_sexp
109
+
110
+ assert_equal expected, actual
111
+ end
112
+
113
+ def test_rewrite_lvar_with_piglatin
114
+ expected = s(:block,
115
+ s(:lasgn, :umbernay, s(:lit, 1)),
116
+ s(:lasgn, :ingstray, s(:str, "string")),
117
+ s(:call, nil, :puts, s(:arglist, s(:lvar, :umbernay))),
118
+ s(:call, nil, :puts, s(:arglist, s(:lvar, :ingstray))))
119
+
120
+ trans = Transmogrify.new(Piglatin)
121
+ actual = trans.process @lvar_sexp
122
+
123
+ assert_equal expected, actual
124
+ end
125
+ end
@@ -0,0 +1,28 @@
1
+ require 'test/unit'
2
+ require 'transmogrify'
3
+
4
+ class TestPiglatin < Test::Unit::TestCase
5
+ def transmogrifier
6
+ Transmogrify.new(Transmogrifiers::Piglatin)
7
+ end
8
+ private :transmogrifier
9
+
10
+ def assert_piglatin_equal(args = {})
11
+ args.each do |before, after|
12
+ assert_equal after, transmogrifier.transmogrify(before)
13
+ end
14
+ end
15
+ private :assert_piglatin_equal
16
+
17
+ def test_piglatin_conversions
18
+ assert_piglatin_equal({
19
+ :asshole => :assholeway,
20
+ :douche => :oucheday,
21
+ :stripper => :ipperstray,
22
+ :Asshole => :Assholeway,
23
+ :Douche => :Oucheday,
24
+ :Stripper => :Ipperstray,
25
+ :foo01 => :oofay01,
26
+ })
27
+ end
28
+ end
@@ -0,0 +1,28 @@
1
+ require 'test/unit'
2
+ require 'transmogrify'
3
+
4
+ class TestRot13 < Test::Unit::TestCase
5
+ include Transmogrifiers::Rot13
6
+
7
+ def test_convert_word_with_leading_vowel
8
+ actual = :asshole
9
+ expected = :nffubyr
10
+
11
+ assert_equal expected, transmogrify(actual)
12
+ end
13
+
14
+ def test_convert_word_with_leading_consonant
15
+ actual = :douche
16
+ expected = :qbhpur
17
+
18
+ assert_equal expected, transmogrify(actual)
19
+ end
20
+
21
+ def test_convert_word_with_multiple_leading_consonants
22
+ actual = :stripper
23
+ expected = :fgevccre
24
+
25
+ assert_equal expected, transmogrify(actual)
26
+ end
27
+
28
+ end
@@ -0,0 +1,46 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{transmogrify}
5
+ s.version = "1.0.0"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Ryan Davis, Rein Henrichs"]
9
+ s.date = %q{2008-12-14}
10
+ s.default_executable = %q{transmogrify}
11
+ s.description = %q{Unfactoring your code, for evil.}
12
+ s.email = ["ryand-ruby@zenspider.com", "reinh@reinh.com"]
13
+ s.executables = ["transmogrify"]
14
+ s.extra_rdoc_files = ["bin/transmogrify", "lib/transmogrifiers/douchy_numbers.rb", "lib/transmogrifiers/piglatin.rb", "lib/transmogrifiers/rot13.rb", "lib/transmogrify.rb", "README.txt"]
15
+ s.files = ["bin/transmogrify", "History.txt", "lib/transmogrifiers/douchy_numbers.rb", "lib/transmogrifiers/piglatin.rb", "lib/transmogrifiers/rot13.rb", "lib/transmogrify.rb", "Manifest", "Rakefile", "README.txt", "test/test_transmogrify.rb", "test/transmigrifiers/test_piglatin.rb", "test/transmigrifiers/test_rot13.rb", "transmogrify.gemspec"]
16
+ s.has_rdoc = true
17
+ s.homepage = %q{}
18
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Transmogrify", "--main", "README.txt"]
19
+ s.require_paths = ["lib"]
20
+ s.rubyforge_project = %q{transmogrify}
21
+ s.rubygems_version = %q{1.3.1}
22
+ s.summary = %q{Unfactoring your code, for evil.}
23
+ s.test_files = ["test/test_transmogrify.rb", "test/transmigrifiers/test_piglatin.rb", "test/transmigrifiers/test_rot13.rb"]
24
+
25
+ if s.respond_to? :specification_version then
26
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
27
+ s.specification_version = 2
28
+
29
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
30
+ s.add_runtime_dependency(%q<ruby2ruby>, [">= 0"])
31
+ s.add_runtime_dependency(%q<sexp_processor>, [">= 0", "= 3.0.0"])
32
+ s.add_runtime_dependency(%q<ruby_parser>, [">= 0", "= 2.0.1"])
33
+ s.add_development_dependency(%q<echoe>, [">= 0"])
34
+ else
35
+ s.add_dependency(%q<ruby2ruby>, [">= 0"])
36
+ s.add_dependency(%q<sexp_processor>, [">= 0", "= 3.0.0"])
37
+ s.add_dependency(%q<ruby_parser>, [">= 0", "= 2.0.1"])
38
+ s.add_dependency(%q<echoe>, [">= 0"])
39
+ end
40
+ else
41
+ s.add_dependency(%q<ruby2ruby>, [">= 0"])
42
+ s.add_dependency(%q<sexp_processor>, [">= 0", "= 3.0.0"])
43
+ s.add_dependency(%q<ruby_parser>, [">= 0", "= 2.0.1"])
44
+ s.add_dependency(%q<echoe>, [">= 0"])
45
+ end
46
+ end
metadata ADDED
@@ -0,0 +1,120 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: joshua-transmogrify
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Ryan Davis, Rein Henrichs
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-12-14 00:00:00 -08:00
13
+ default_executable: transmogrify
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: ruby2ruby
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: "0"
23
+ version:
24
+ - !ruby/object:Gem::Dependency
25
+ name: sexp_processor
26
+ version_requirement:
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ version: "0"
32
+ - - "="
33
+ - !ruby/object:Gem::Version
34
+ version: 3.0.0
35
+ version:
36
+ - !ruby/object:Gem::Dependency
37
+ name: ruby_parser
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "0"
44
+ - - "="
45
+ - !ruby/object:Gem::Version
46
+ version: 2.0.1
47
+ version:
48
+ - !ruby/object:Gem::Dependency
49
+ name: echoe
50
+ version_requirement:
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: "0"
56
+ version:
57
+ description: Unfactoring your code, for evil.
58
+ email:
59
+ - ryand-ruby@zenspider.com
60
+ - reinh@reinh.com
61
+ executables:
62
+ - transmogrify
63
+ extensions: []
64
+
65
+ extra_rdoc_files:
66
+ - bin/transmogrify
67
+ - lib/transmogrifiers/douchy_numbers.rb
68
+ - lib/transmogrifiers/piglatin.rb
69
+ - lib/transmogrifiers/rot13.rb
70
+ - lib/transmogrify.rb
71
+ - README.txt
72
+ files:
73
+ - bin/transmogrify
74
+ - History.txt
75
+ - lib/transmogrifiers/douchy_numbers.rb
76
+ - lib/transmogrifiers/piglatin.rb
77
+ - lib/transmogrifiers/rot13.rb
78
+ - lib/transmogrify.rb
79
+ - Manifest
80
+ - Rakefile
81
+ - README.txt
82
+ - test/test_transmogrify.rb
83
+ - test/transmigrifiers/test_piglatin.rb
84
+ - test/transmigrifiers/test_rot13.rb
85
+ - transmogrify.gemspec
86
+ has_rdoc: true
87
+ homepage: ""
88
+ post_install_message:
89
+ rdoc_options:
90
+ - --line-numbers
91
+ - --inline-source
92
+ - --title
93
+ - Transmogrify
94
+ - --main
95
+ - README.txt
96
+ require_paths:
97
+ - lib
98
+ required_ruby_version: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: "0"
103
+ version:
104
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: "1.2"
109
+ version:
110
+ requirements: []
111
+
112
+ rubyforge_project: transmogrify
113
+ rubygems_version: 1.2.0
114
+ signing_key:
115
+ specification_version: 2
116
+ summary: Unfactoring your code, for evil.
117
+ test_files:
118
+ - test/test_transmogrify.rb
119
+ - test/transmigrifiers/test_piglatin.rb
120
+ - test/transmigrifiers/test_rot13.rb