ruby_diff 0.1.5 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest.txt CHANGED
@@ -12,6 +12,7 @@ lib/ruby_diff/git_support.rb
12
12
  lib/ruby_diff/git_working_dir_feeder.rb
13
13
  lib/ruby_diff/patterns.rb
14
14
  lib/ruby_diff/structure_processor.rb
15
+ lib/ruby_diff/svn_feeder.rb
15
16
  ruby_diff.gemspec
16
17
  test/code_comparison_test.rb
17
18
  test/file_feeder_test.rb
data/README.txt CHANGED
@@ -28,14 +28,17 @@ changes to instance methods. The API is likely to change drastically.
28
28
  This is likely to change a bunch, but for the moment:
29
29
  ruby_diff old_file new_file
30
30
 
31
- Or for git repositories, etc.
31
+ For git repositories, etc.
32
32
  ruby_diff --git HEAD --git-wd
33
33
 
34
34
  Compare three different release tags.
35
35
  ruby_diff --git v0.1 --git v0.2 --git v0.3
36
-
36
+
37
+ For subversion repositories
38
+ ruby_diff --svn http://project.svnserver.org/lib --svn BASE:lib
39
+
37
40
  See help for more information.
38
41
 
39
- == Contact
42
+ == Contact
40
43
  Feel free to get in touch with me:
41
44
  netghost@gmail.com
data/Rakefile CHANGED
@@ -11,7 +11,7 @@ HOE = Hoe.new('ruby_diff', RubyDiff::VERSION) do |p|
11
11
  p.remote_rdoc_dir = '' # Release to root
12
12
  p.test_globs = ['test/*_test.rb']
13
13
  p.summary = "a higher level diff application for analyzing changes to ruby code"
14
- p.extra_deps << ['ParseTree', '>= 2.0.2']
14
+ p.extra_deps << ['ParseTree', '~> 2.1']
15
15
  end
16
16
  SPEC = HOE.spec
17
17
 
@@ -30,7 +30,7 @@ namespace :git do
30
30
 
31
31
  desc "Updates the manifest to match the git repository"
32
32
  task :update_manifest do |t|
33
- `git-ls-files > Manifest.txt`
33
+ `git ls-files > Manifest.txt`
34
34
  end
35
35
 
36
36
  desc "Pushes git repository out"
data/bin/ruby_diff CHANGED
@@ -21,15 +21,13 @@ feeder_mapping = {
21
21
  :file => FileFeeder,
22
22
  :git => GitFeeder,
23
23
  :git_wd => GitWorkingDirFeeder,
24
+ :svn => SVNFeeder
24
25
  }
25
26
 
26
27
  feeders = []
27
28
 
28
29
  opts = OptionParser.new
29
- opts.banner = "Usage: ruby_diff.rb [options]"
30
-
31
- opts.separator ""
32
- opts.separator "Specific options:"
30
+ opts.banner = "Usage: ruby_diff.rb [options] sources"
33
31
 
34
32
  opts.define_head <<-HEAD
35
33
 
@@ -39,17 +37,10 @@ ruby_diff --git HEAD --git-wd ./
39
37
 
40
38
  Changes between two sets of files:
41
39
  ruby_diff --file old_dir --file new_dir
42
-
43
40
  HEAD
44
41
 
45
- opts.on('--sexp', "Show the s expressions for each input (mostly for debugging)"){
46
- @options[:sexp] = true
47
- }
48
-
49
- opts.on('--verbose', "Shows more information while processing files"){
50
- @options[:verbose] = true
51
- }
52
-
42
+ opts.separator ""
43
+ opts.separator "Code sources:"
53
44
  opts.on('--git PATH', "Use a git repository as a code source"){|path|
54
45
  feeders << feeder_mapping[:git].new(path)
55
46
  }
@@ -58,10 +49,25 @@ opts.on('--git-wd PATH', "Use the git working directory as a code source"){|path
58
49
  feeders << feeder_mapping[:git_wd].new(path)
59
50
  }
60
51
 
52
+ opts.on('--svn PATH', "Use a svn repository as a code source"){|path|
53
+ feeders << feeder_mapping[:svn].new(path)
54
+ }
55
+
61
56
  opts.on('--file PATH', "Use a file system path as a code source"){|path|
62
57
  feeders << feeder_mapping[:file].new(path)
63
58
  }
64
59
 
60
+
61
+ opts.separator ""
62
+ opts.separator "Options:"
63
+ opts.on('--sexp', "Show the s expressions for each input (mostly for debugging)"){
64
+ @options[:sexp] = true
65
+ }
66
+
67
+ opts.on('--verbose', "Shows more information while processing files"){
68
+ @options[:verbose] = true
69
+ }
70
+
65
71
  opts.on_tail('-v', '--version') { puts "ruby_diff #{RubyDiff::VERSION}" ; exit }
66
72
  opts.on_tail('-h', '--help') { puts opts; exit }
67
73
 
data/lib/ruby_diff.rb CHANGED
@@ -11,10 +11,10 @@ require 'set'
11
11
  require 'pp'
12
12
 
13
13
  module RubyDiff
14
- VERSION = "0.1.5"
14
+ VERSION = "0.2"
15
15
  end
16
16
 
17
17
  # RubyDiff
18
- %w(code_comparison structure_processor file_feeder git_support git_feeder git_working_dir_feeder).each do |name|
18
+ %w(code_comparison structure_processor file_feeder git_support git_feeder git_working_dir_feeder svn_feeder).each do |name|
19
19
  require File.expand_path(File.dirname(__FILE__) + "/ruby_diff/#{name}")
20
20
  end
@@ -124,10 +124,12 @@ class StructureProcessor < SexpProcessor
124
124
 
125
125
  def process_class(exp)
126
126
  name = exp.shift
127
- super_class = exp.shift #?
127
+ super_class = exp.shift
128
128
  body = exp.shift
129
129
 
130
- record ClassCode.new(name, self.scope, body) do
130
+ name, temp_scope = process_colon2_constants(name) if name.is_a? Array
131
+
132
+ record ClassCode.new(name, temp_scope || self.scope, body) do
131
133
  s(:class, name, process(super_class), process(body))
132
134
  end
133
135
  end
@@ -136,7 +138,9 @@ class StructureProcessor < SexpProcessor
136
138
  name = exp.shift
137
139
  body = exp.shift
138
140
 
139
- record ModuleCode.new(name, self.scope, body) do
141
+ name, temp_scope = process_colon2_constants(name) if name.is_a? Array
142
+
143
+ record ModuleCode.new(name, temp_scope || self.scope, body) do
140
144
  s(:class, name, process(body))
141
145
  end
142
146
  end
@@ -186,6 +190,22 @@ class StructureProcessor < SexpProcessor
186
190
  end
187
191
 
188
192
  protected
193
+ # If the class is defined as: A::B::C, then get the constants and register them.
194
+ # This is rather a dirty piece of code. Fear it.
195
+ def process_colon2_constants(array)
196
+ array = array.flatten
197
+ constants = array[array.length/-2..-1]
198
+ name = constants.pop
199
+
200
+ parent = self.scope
201
+
202
+ constants.each do |c|
203
+ parent = record ModuleCode.new(c, parent, Sexp.new)
204
+ end
205
+
206
+ [name,parent]
207
+ end
208
+
189
209
  def record obj
190
210
  signature = obj.signature
191
211
  if !self.code_objects[signature]
@@ -196,7 +216,7 @@ class StructureProcessor < SexpProcessor
196
216
  self.scope_stack << self.code_objects[signature]
197
217
  result = yield if block_given?
198
218
  self.scope_stack.pop
199
- result
219
+ result || obj
200
220
  end
201
221
 
202
222
  def scope
@@ -0,0 +1,56 @@
1
+ # A Feeder reads in files for RubyDiff's processor to
2
+ # run over. FileFeeder reads them from the file system.
3
+ #
4
+ # Example Usage:
5
+ # ruby_diff --svn PREV:file.rb --svn new_version.rb
6
+ # ruby_diff --svn http://project.server.org/lib --svn .
7
+ class SVNFeeder
8
+ attr_accessor :files
9
+ attr_accessor :path
10
+
11
+ include Enumerable
12
+
13
+ # Expects something in the form of PATH
14
+ # --file [PATH]
15
+ def initialize(path)
16
+ @path = path
17
+
18
+ # TODO: Add support for SVN date format
19
+ if @path =~ /^(\d+)|HEAD|BASE|COMMITTED|PREV\:/
20
+ parts = path.split(":",2)
21
+ svn_path = parts.pop
22
+ rev = parts.shift
23
+ else
24
+ svn_path = @path
25
+ rev = nil
26
+ end
27
+
28
+ @svn_options = (rev ? "-r #{rev} " : " ")+svn_path
29
+
30
+ @file_pattern = "**/*.rb"
31
+
32
+ @files = []
33
+
34
+ svn("ls -R #{@svn_options}").each_line do |file|
35
+ file.chomp!
36
+ @files << file if File.fnmatch(@file_pattern, file)
37
+ end
38
+ end
39
+
40
+ def each
41
+ @files.each do |file|
42
+ cat_path = File.join(@svn_options, file)
43
+ yield(svn("cat #{cat_path}"), file)
44
+ end
45
+ end
46
+
47
+
48
+ # issues a command to svn
49
+ def svn command
50
+ output = `svn #{command} 2>&1`.chomp
51
+ unless $?.success?
52
+ raise RuntimeError, output
53
+ end
54
+ output
55
+ end
56
+ end
data/ruby_diff.gemspec CHANGED
@@ -1,20 +1,38 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = %q{ruby_diff}
3
- s.version = "0.0.1"
4
- s.date = %q{2008-06-03}
5
- s.summary = %q{a higher level diff application for analyzing changes to ruby code}
6
- s.email = ["netghost@gmail.com"]
7
- s.homepage = %q{RubyDiff does higher level comparisons of ruby code.}
8
- s.rubyforge_project = %q{rubydiff}
9
- s.description = %q{}
3
+ s.version = "0.2"
4
+
5
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
6
+ s.authors = ["Adam Sanderson"]
7
+ s.date = %q{2008-10-02}
10
8
  s.default_executable = %q{ruby_diff}
9
+ s.description = %q{}
10
+ s.email = ["netghost@gmail.com"]
11
+ s.executables = ["ruby_diff"]
12
+ s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.txt"]
13
+ s.files = [".gitignore", "History.txt", "Manifest.txt", "README.txt", "Rakefile", "bin/ruby_diff", "lib/ruby_diff.rb", "lib/ruby_diff/code_comparison.rb", "lib/ruby_diff/file_feeder.rb", "lib/ruby_diff/git_feeder.rb", "lib/ruby_diff/git_support.rb", "lib/ruby_diff/git_working_dir_feeder.rb", "lib/ruby_diff/patterns.rb", "lib/ruby_diff/structure_processor.rb", "lib/ruby_diff/svn_feeder.rb", "ruby_diff.gemspec", "test/code_comparison_test.rb", "test/file_feeder_test.rb", "test/git_feeder_test.rb", "test/git_sample/README", "test/git_sample/book.rb", "test/git_sample/lib/chapter.rb", "test/git_working_dir_feeder_test.rb", "test/structure_processor_test.rb"]
11
14
  s.has_rdoc = true
12
- s.authors = ["Adam Sanderson"]
13
- s.files = [".gitignore", "README.txt", "Rakefile", "bin/ruby_diff", "lib/ruby_diff.rb", "lib/ruby_diff/code_comparison.rb", "lib/ruby_diff/file_feeder.rb", "lib/ruby_diff/git_feeder.rb", "lib/ruby_diff/patterns.rb", "lib/ruby_diff/structure_processor.rb", "ruby_diff.gemspec", "test/file_feeder_test.rb", "test/git_feeder_test.rb", "test/git_sample/README", "test/git_sample/book.rb", "test/git_sample/lib/chapter.rb", "test/structure_processor_test.rb"]
14
- s.test_files = ["test/git_feeder_test.rb", "test/file_feeder_test.rb", "test/structure_processor_test.rb"]
15
+ s.homepage = %q{RubyDiff does higher level comparisons of ruby code.}
15
16
  s.rdoc_options = ["--main", "README.txt"]
16
- s.extra_rdoc_files = ["README.txt"]
17
- s.executables = ["ruby_diff"]
18
- s.add_dependency(%q<ParseTree>, [">= 2.0.2"])
19
- s.add_dependency(%q<hoe>, [">= 1.5.3"])
17
+ s.require_paths = ["lib"]
18
+ s.rubyforge_project = %q{rubydiff}
19
+ s.rubygems_version = %q{1.2.0}
20
+ s.summary = %q{a higher level diff application for analyzing changes to ruby code}
21
+ s.test_files = ["test/git_feeder_test.rb", "test/file_feeder_test.rb", "test/code_comparison_test.rb", "test/structure_processor_test.rb", "test/git_working_dir_feeder_test.rb"]
22
+
23
+ if s.respond_to? :specification_version then
24
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
25
+ s.specification_version = 2
26
+
27
+ if current_version >= 3 then
28
+ s.add_runtime_dependency(%q<ParseTree>, ["~> 2.1"])
29
+ s.add_development_dependency(%q<hoe>, [">= 1.7.0"])
30
+ else
31
+ s.add_dependency(%q<ParseTree>, ["~> 2.1"])
32
+ s.add_dependency(%q<hoe>, [">= 1.7.0"])
33
+ end
34
+ else
35
+ s.add_dependency(%q<ParseTree>, ["~> 2.1"])
36
+ s.add_dependency(%q<hoe>, [">= 1.7.0"])
37
+ end
20
38
  end
@@ -79,13 +79,54 @@ class StructureProcessorTestCase < Test::Unit::TestCase
79
79
  CODE
80
80
  end
81
81
 
82
+ def test_simple_class
83
+ assert_signatures <<-CODE, ["A"], [ClassCode]
84
+ class A
85
+ end
86
+ CODE
87
+ end
88
+
89
+ def test_class_in_module
90
+ assert_signatures <<-CODE, ["B", "B::A"], [ClassCode,ModuleCode]
91
+ module B
92
+ class A
93
+ end
94
+ end
95
+ CODE
96
+ end
97
+
98
+ def test_namespaced_class
99
+ assert_signatures <<-CODE, ["C::B::A"], [ClassCode]
100
+ class C::B::A
101
+ end
102
+ CODE
103
+ end
104
+
105
+ def test_namespaced_module
106
+ assert_signatures <<-CODE, ["C", "C::B", "C::B::A"], [ModuleCode]
107
+ module C::B::A
108
+ end
109
+ CODE
110
+ end
111
+
112
+ # Lets just be nuts...
113
+ def test_nested_namespaced_class
114
+ assert_signatures <<-CODE, ["C", "C::B", "C::B::A", "C::B::A::D"], [ModuleCode, ClassCode]
115
+ module C::B::A
116
+ class D
117
+ end
118
+ end
119
+ CODE
120
+ end
121
+
82
122
  def assert_signatures(code, signatures, types=[MethodCode])
83
123
  sexp = ParseTree.new.parse_tree_for_string(code)
124
+ serialized = sexp.pretty_inspect
84
125
  processor = StructureProcessor.new()
85
126
  processor.process(* sexp)
86
127
 
87
128
  found_signatures = processor.code_objects.values.select{|co| types.include?(co.class)}.map{|key| key.signature }.sort
88
- assert_equal signatures.sort, found_signatures
129
+ assert_equal signatures.sort, found_signatures, "Sexp was:\n#{serialized}"
89
130
  end
90
131
 
91
- end
132
+ end
metadata CHANGED
@@ -1,34 +1,48 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.4
3
- specification_version: 1
4
2
  name: ruby_diff
5
3
  version: !ruby/object:Gem::Version
6
- version: 0.1.5
7
- date: 2008-06-09 00:00:00 -07:00
8
- summary: a higher level diff application for analyzing changes to ruby code
9
- require_paths:
10
- - lib
11
- email:
12
- - netghost@gmail.com
13
- homepage: RubyDiff does higher level comparisons of ruby code.
14
- rubyforge_project: rubydiff
15
- description: ""
16
- autorequire:
17
- default_executable:
18
- bindir: bin
19
- has_rdoc: true
20
- required_ruby_version: !ruby/object:Gem::Version::Requirement
21
- requirements:
22
- - - ">"
23
- - !ruby/object:Gem::Version
24
- version: 0.0.0
25
- version:
4
+ version: "0.2"
26
5
  platform: ruby
27
- signing_key:
28
- cert_chain:
29
- post_install_message:
30
6
  authors:
31
7
  - Adam Sanderson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-10-02 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: ParseTree
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ~>
22
+ - !ruby/object:Gem::Version
23
+ version: "2.1"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: hoe
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.7.0
34
+ version:
35
+ description: ""
36
+ email:
37
+ - netghost@gmail.com
38
+ executables:
39
+ - ruby_diff
40
+ extensions: []
41
+
42
+ extra_rdoc_files:
43
+ - History.txt
44
+ - Manifest.txt
45
+ - README.txt
32
46
  files:
33
47
  - .gitignore
34
48
  - History.txt
@@ -44,6 +58,7 @@ files:
44
58
  - lib/ruby_diff/git_working_dir_feeder.rb
45
59
  - lib/ruby_diff/patterns.rb
46
60
  - lib/ruby_diff/structure_processor.rb
61
+ - lib/ruby_diff/svn_feeder.rb
47
62
  - ruby_diff.gemspec
48
63
  - test/code_comparison_test.rb
49
64
  - test/file_feeder_test.rb
@@ -53,41 +68,36 @@ files:
53
68
  - test/git_sample/lib/chapter.rb
54
69
  - test/git_working_dir_feeder_test.rb
55
70
  - test/structure_processor_test.rb
71
+ has_rdoc: true
72
+ homepage: RubyDiff does higher level comparisons of ruby code.
73
+ post_install_message:
74
+ rdoc_options:
75
+ - --main
76
+ - README.txt
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: "0"
84
+ version:
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: "0"
90
+ version:
91
+ requirements: []
92
+
93
+ rubyforge_project: rubydiff
94
+ rubygems_version: 1.2.0
95
+ signing_key:
96
+ specification_version: 2
97
+ summary: a higher level diff application for analyzing changes to ruby code
56
98
  test_files:
57
99
  - test/git_feeder_test.rb
58
100
  - test/file_feeder_test.rb
59
101
  - test/code_comparison_test.rb
60
102
  - test/structure_processor_test.rb
61
103
  - test/git_working_dir_feeder_test.rb
62
- rdoc_options:
63
- - --main
64
- - README.txt
65
- extra_rdoc_files:
66
- - History.txt
67
- - Manifest.txt
68
- - README.txt
69
- executables:
70
- - ruby_diff
71
- extensions: []
72
-
73
- requirements: []
74
-
75
- dependencies:
76
- - !ruby/object:Gem::Dependency
77
- name: ParseTree
78
- version_requirement:
79
- version_requirements: !ruby/object:Gem::Version::Requirement
80
- requirements:
81
- - - ">="
82
- - !ruby/object:Gem::Version
83
- version: 2.0.2
84
- version:
85
- - !ruby/object:Gem::Dependency
86
- name: hoe
87
- version_requirement:
88
- version_requirements: !ruby/object:Gem::Version::Requirement
89
- requirements:
90
- - - ">="
91
- - !ruby/object:Gem::Version
92
- version: 1.5.3
93
- version: