joshua-transmogrify 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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