ruby_diff 0.1.5 → 0.2

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/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: