live_ast 0.2.3 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/devel/jumpstart.rb CHANGED
@@ -1,6 +1,6 @@
1
1
 
2
2
  class Jumpstart
3
- class SimpleInstaller
3
+ class Installer
4
4
  def initialize
5
5
  require 'fileutils'
6
6
  require 'rbconfig'
@@ -219,17 +219,6 @@ class Jumpstart
219
219
  }
220
220
  contents
221
221
  end
222
-
223
- def replace_file(file)
224
- old_contents = File.read(file)
225
- new_contents = yield(old_contents)
226
- if old_contents != new_contents
227
- File.open(file, "wb") { |output|
228
- output.print(new_contents)
229
- }
230
- end
231
- new_contents
232
- end
233
222
  end
234
223
 
235
224
  module InstanceEvalWithArgs
@@ -264,7 +253,6 @@ class Jumpstart
264
253
  $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
265
254
 
266
255
  require 'rubygems/package_task'
267
- require 'rake/clean'
268
256
 
269
257
  @project_name = project_name
270
258
 
@@ -272,7 +260,7 @@ class Jumpstart
272
260
 
273
261
  self.class.instance_methods(false).select { |t|
274
262
  t.to_s =~ %r!\Adefine_!
275
- }.each { |method_name|
263
+ }.sort.each { |method_name|
276
264
  send(method_name)
277
265
  }
278
266
  end
@@ -295,9 +283,9 @@ class Jumpstart
295
283
 
296
284
  attribute :version do
297
285
  catch :bail do
298
- if File.exist?(version_file = "./lib/#{name}/version.rb")
286
+ if File.file?(version_file = "./lib/#{name}/version.rb")
299
287
  require version_file
300
- elsif File.exist?("./lib/#{name}.rb")
288
+ elsif File.file?("./lib/#{name}.rb")
301
289
  require name
302
290
  else
303
291
  throw :bail
@@ -377,43 +365,46 @@ class Jumpstart
377
365
  end
378
366
 
379
367
  attribute :files do
380
- if File.exist?(manifest_file)
368
+ if File.file? manifest_file
381
369
  File.read(manifest_file).split("\n")
382
- else
383
- `git ls-files`.split("\n") + [manifest_file] + generated_files
384
- end
370
+ elsif source_control?
371
+ IO.popen("git ls-files") { |pipe| pipe.read.split "\n" }
372
+ end.to_a + [manifest_file] + generated_files
373
+ end
374
+
375
+ def files_in_require_paths
376
+ require_paths.inject([]) { |acc, dir|
377
+ acc + Dir.glob("#{dir}/**/*.rb")
378
+ }
385
379
  end
386
380
 
387
381
  attribute :rdoc_files do
388
- Dir["lib/**/*.rb"]
382
+ files_in_require_paths
389
383
  end
390
384
 
391
- attribute :extra_rdoc_files do
392
- if File.exist?(readme_file)
393
- [readme_file]
394
- else
395
- []
396
- end
397
- end
398
-
399
385
  attribute :rdoc_title do
400
386
  "#{name}: #{summary}"
401
387
  end
402
388
 
389
+ attribute :require_paths do
390
+ ["lib"]
391
+ end
392
+
403
393
  attribute :rdoc_options do
404
- if File.exist?(readme_file)
394
+ if File.file?(readme_file)
405
395
  ["--main", readme_file]
406
396
  else
407
397
  []
408
398
  end + [
409
399
  "--title", rdoc_title,
410
- ] + (files - rdoc_files).inject(Array.new) { |acc, file|
400
+ ] + (files_in_require_paths - rdoc_files).inject(Array.new) {
401
+ |acc, file|
411
402
  acc + ["--exclude", file]
412
403
  }
413
404
  end
414
405
 
415
- attribute :extra_rdoc_options do
416
- []
406
+ attribute :extra_rdoc_files do
407
+ File.file?(readme_file) ? [readme_file] : []
417
408
  end
418
409
 
419
410
  attribute :browser do
@@ -426,7 +417,7 @@ class Jumpstart
426
417
  end
427
418
 
428
419
  attribute :gemspec do
429
- Gem::Specification.new { |g|
420
+ Gem::Specification.new do |g|
430
421
  g.has_rdoc = true
431
422
  %w[
432
423
  name
@@ -436,26 +427,25 @@ class Jumpstart
436
427
  version
437
428
  description
438
429
  files
439
- extra_rdoc_files
440
430
  rdoc_options
431
+ extra_rdoc_files
432
+ require_paths
441
433
  ].each { |param|
442
434
  value = send(param) and (
443
435
  g.send("#{param}=", value)
444
436
  )
445
437
  }
446
438
 
447
- if url
448
- g.homepage = url
449
- end
439
+ g.homepage = url if url
450
440
 
451
- extra_deps.each { |dep|
441
+ dependencies.each { |dep|
452
442
  g.add_dependency(*dep)
453
443
  }
454
444
 
455
- extra_dev_deps.each { |dep|
445
+ development_dependencies.each { |dep|
456
446
  g.add_development_dependency(*dep)
457
447
  }
458
- }
448
+ end
459
449
  end
460
450
 
461
451
  attribute :readme_contents do
@@ -505,57 +495,53 @@ class Jumpstart
505
495
  }
506
496
 
507
497
  attribute :url do
508
- begin
509
- readme_contents.match(%r!^\*.*?(http://\S+)!)[1]
510
- rescue
511
- "http://#{github_user}.github.com/#{name}"
512
- end
498
+ "http://#{github_user}.github.com/#{name}"
513
499
  end
514
500
 
515
501
  attribute :github_user do
516
- "FIXME"
517
- end
518
-
519
- attribute :extra_deps do
520
- []
502
+ raise "github_user not set"
521
503
  end
522
504
 
523
- attribute :extra_dev_deps do
524
- []
505
+ attribute :rubyforge_info do
506
+ nil
525
507
  end
526
508
 
527
509
  attribute :authors do
528
- Array.new
510
+ developers.map { |d| d[0] }
529
511
  end
530
512
 
531
513
  attribute :email do
532
- Array.new
514
+ developers.map { |d| d[1] }
533
515
  end
534
516
 
535
- def developer(name, email)
536
- authors << name
537
- self.email << email
517
+ attribute :dependencies do
518
+ []
538
519
  end
539
520
 
540
- def dependency(name, version)
541
- extra_deps << [name, version]
521
+ attribute :development_dependencies do
522
+ []
523
+ end
524
+
525
+ attribute :developers do
526
+ []
542
527
  end
543
528
 
544
529
  def define_clean
545
- task :clean do
530
+ require 'rake/clean'
531
+ task :clean do
546
532
  Rake::Task[:clobber].invoke
547
533
  end
548
534
  end
549
535
 
550
536
  def define_package
551
- task manifest_file do
552
- create_manifest
537
+ if source_control?
538
+ task manifest_file do
539
+ create_manifest
540
+ end
541
+ CLEAN.add manifest_file
542
+ task :package => :clean
543
+ Gem::PackageTask.new(gemspec).define
553
544
  end
554
- CLEAN.include manifest_file
555
- task :package => :clean
556
- Gem::PackageTask.new(gemspec) { |t|
557
- t.need_tar = true
558
- }
559
545
  end
560
546
 
561
547
  def define_spec
@@ -598,21 +584,18 @@ class Jumpstart
598
584
  task :prerelease => [:spec, :spec_deps]
599
585
  task :default => :spec
600
586
 
601
- CLEAN.include spec_output_dir
587
+ CLEAN.add spec_output_dir
602
588
  end
603
589
  end
604
590
 
605
- def ruby_18?
606
- RUBY_VERSION =~ %r!\A1\.8!
607
- end
608
-
609
591
  def define_test
610
592
  unless test_files.empty?
611
593
  desc "run tests"
612
594
  task :test do
613
- test_files.each { |file|
614
- require file
615
- }
595
+ test_files.each { |file| require file }
596
+
597
+ # if we use at_exit hook instead, it won't run before :release
598
+ MiniTest::Unit.new.run ARGV
616
599
  end
617
600
 
618
601
  desc "run tests with coverage"
@@ -625,7 +608,7 @@ class Jumpstart
625
608
  }
626
609
  end
627
610
  else
628
- task :full_test do |t, *args|
611
+ task :full_test do
629
612
  rm_rf cov_dir
630
613
  require 'simplecov'
631
614
  SimpleCov.start do
@@ -657,7 +640,7 @@ class Jumpstart
657
640
  task :prerelease => [:test, :test_deps]
658
641
  task :default => :test
659
642
 
660
- CLEAN.include cov_dir
643
+ CLEAN.add cov_dir
661
644
  end
662
645
  end
663
646
 
@@ -668,7 +651,6 @@ class Jumpstart
668
651
  require 'rdoc/rdoc'
669
652
  args = (
670
653
  gemspec.rdoc_options +
671
- extra_rdoc_options +
672
654
  gemspec.require_paths.clone +
673
655
  gemspec.extra_rdoc_files +
674
656
  ["-o", doc_dir]
@@ -691,112 +673,48 @@ class Jumpstart
691
673
  end
692
674
 
693
675
  def define_publish
694
- desc "publish docs"
695
- task :publish => [:clean, :check_directory, :doc] do
696
- git "branch", "-D", "gh-pages"
697
- git "checkout", "--orphan", "gh-pages"
698
- FileUtils.rm ".git/index"
699
- git "clean", "-fdx", "-e", "doc"
700
- Dir["doc/*"].each { |path|
701
- FileUtils.mv path, "."
702
- }
703
- FileUtils.rmdir "doc"
704
- git "add", "."
705
- git "commit", "-m", "generated by rdoc"
706
- git "push", "-f", "origin", "gh-pages"
676
+ if source_control?
677
+ desc "publish docs"
678
+ task :publish => [:clean, :check_directory, :doc] do
679
+ if rubyforge_info
680
+ user, project = rubyforge_info
681
+ Dir.chdir(doc_dir) do
682
+ sh "scp", "-r",
683
+ ".",
684
+ "#{user}@rubyforge.org:/var/www/gforge-projects/#{project}"
685
+ end
686
+ end
687
+ git "branch", "-D", "gh-pages"
688
+ git "checkout", "--orphan", "gh-pages"
689
+ FileUtils.rm ".git/index"
690
+ git "clean", "-fdx", "-e", "doc"
691
+ Dir["doc/*"].each { |path|
692
+ FileUtils.mv path, "."
693
+ }
694
+ FileUtils.rmdir "doc"
695
+ git "add", "."
696
+ git "commit", "-m", "generated by rdoc"
697
+ git "push", "-f", "origin", "gh-pages"
698
+ end
707
699
  end
708
700
  end
709
701
 
710
702
  def define_install
711
703
  desc "direct install (no gem)"
712
704
  task :install do
713
- SimpleInstaller.new.run([])
705
+ Installer.new.run([])
714
706
  end
715
707
 
716
708
  desc "direct uninstall (no gem)"
717
709
  task :uninstall do
718
- SimpleInstaller.new.run(["--uninstall"])
710
+ Installer.new.run(["--uninstall"])
719
711
  end
720
712
  end
721
713
 
722
- def define_debug
723
- runner = Class.new do
724
- def comment_src_dst(on)
725
- on ? ["", "#"] : ["#", ""]
726
- end
727
-
728
- def comment_regions(on, contents, start)
729
- src, dst = comment_src_dst(on)
730
- contents.gsub(%r!^(\s+)#{src}#{start}.*?^\1#{src}(\}|end)!m) { |chunk|
731
- indent = $1
732
- chunk.gsub(%r!^#{indent}#{src}!, "#{indent}#{dst}")
733
- }
734
- end
735
-
736
- def comment_lines(on, contents, start)
737
- src, dst = comment_src_dst(on)
738
- contents.gsub(%r!^(\s*)#{src}#{start}!) {
739
- $1 + dst + start
740
- }
741
- end
742
-
743
- def debug_info(enable)
744
- require 'find'
745
- Find.find("lib", "test") { |path|
746
- if path =~ %r!\.rb\Z!
747
- replace_file(path) { |contents|
748
- result = comment_regions(!enable, contents, "debug")
749
- comment_lines(!enable, result, "trace")
750
- }
751
- end
752
- }
753
- end
754
- end
755
-
756
- desc "enable debug and trace calls"
757
- task :debug_on do
758
- runner.new.debug_info(true)
759
- end
760
-
761
- desc "disable debug and trace calls"
762
- task :debug_off do
763
- runner.new.debug_info(false)
764
- end
765
- end
766
-
767
- def define_columns
768
- desc "check for columns > 80"
769
- task :check_columns do
770
- Dir["**/*.rb"].each { |file|
771
- File.read(file).scan(%r!^.{81}!) { |match|
772
- unless match =~ %r!http://!
773
- raise "#{file} greater than 80 columns: #{match}"
774
- end
775
- }
776
- }
777
- end
778
- end
779
-
780
- def define_comments
781
- task :comments do
782
- file = "comments.txt"
783
- write_file(file) {
784
- result = Array.new
785
- (["Rakefile"] + Dir["**/*.{rb,rake}"]).each { |f|
786
- File.read(f).scan(%r!\#[^\{].*$!) { |match|
787
- result << match
788
- }
789
- }
790
- result.join("\n")
791
- }
792
- CLEAN.include file
793
- end
794
- end
795
-
796
714
  def define_check_directory
797
715
  task :check_directory do
798
716
  unless `git status` =~ %r!nothing to commit \(working directory clean\)!
799
- raise "Directory not clean"
717
+ raise "directory not clean"
800
718
  end
801
719
  end
802
720
  end
@@ -819,24 +737,8 @@ class Jumpstart
819
737
  end
820
738
  end
821
739
 
822
- def define_update_jumpstart
823
- url = ENV["RUBY_JUMPSTART"] || "git://github.com/quix/jumpstart.git"
824
- task :update_jumpstart do
825
- git "clone", url
826
- rm_rf "devel/jumpstart"
827
- Dir["jumpstart/**/*.rb"].each { |source|
828
- dest = source.sub(%r!\Ajumpstart/!, "devel/")
829
- dest_dir = File.dirname(dest)
830
- mkdir_p(dest_dir) unless File.directory?(dest_dir)
831
- cp source, dest
832
- }
833
- rm_r "jumpstart"
834
- git "commit", "devel", "-m", "update jumpstart"
835
- end
836
- end
837
-
838
740
  def git(*args)
839
- sh("git", *args)
741
+ sh "git", *args
840
742
  end
841
743
 
842
744
  def create_manifest
@@ -849,9 +751,9 @@ class Jumpstart
849
751
  task :prerelease => [:clean, :check_directory, :ping, history_file]
850
752
 
851
753
  task :finish_release do
852
- sh("gem", "push", gem)
853
- git("tag", "#{name}-" + version.to_s)
854
- git(*%w(push --tags origin master))
754
+ git "tag", "#{name}-" + version.to_s
755
+ git "push", "--tags", "origin", "master"
756
+ sh "gem", "push", gem
855
757
  end
856
758
 
857
759
  task :release => [:prerelease, :package, :finish_release]
@@ -879,6 +781,14 @@ class Jumpstart
879
781
  }
880
782
  end
881
783
 
784
+ def ruby_18?
785
+ RUBY_VERSION =~ %r!\A1\.8!
786
+ end
787
+
788
+ def source_control?
789
+ File.directory? ".git"
790
+ end
791
+
882
792
  class << self
883
793
  include Util
884
794
  include InstanceEvalWithArgs
@@ -971,8 +881,7 @@ class Jumpstart
971
881
 
972
882
  def doc_to_test(file, *sections, &block)
973
883
  jump = self
974
- test_class = defined?(Test) ? Test : MiniTest
975
- klass = Class.new test_class::Unit::TestCase do
884
+ klass = Class.new MiniTest::Unit::TestCase do
976
885
  sections.each { |section|
977
886
  define_method "test_#{file}_#{section}" do
978
887
  if block
@@ -986,7 +895,7 @@ class Jumpstart
986
895
  end
987
896
  }
988
897
  end
989
- Object.const_set("#{test_class.name}#{file}".gsub(".", ""), klass)
898
+ Object.const_set("Test#{file}".gsub(".", ""), klass)
990
899
  end
991
900
  end
992
901
  end
data/lib/live_ast/base.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  require 'thread'
2
2
 
3
3
  require 'live_ast/reader'
4
- require 'live_ast/parser'
5
4
  require 'live_ast/evaler'
6
5
  require 'live_ast/linker'
7
6
  require 'live_ast/loader'
@@ -11,6 +10,12 @@ module LiveAST
11
10
  NATIVE_EVAL = Kernel.method(:eval) #:nodoc:
12
11
 
13
12
  class << self
13
+ attr_writer :parser #:nodoc:
14
+
15
+ def parser #:nodoc:
16
+ @parser ||= require('live_ast_ruby_parser') && LiveASTRubyParser
17
+ end
18
+
14
19
  #
15
20
  # For use in noninvasive mode (<code>require 'live_ast/base'</code>).
16
21
  #
@@ -6,7 +6,7 @@ module LiveAST
6
6
  end
7
7
 
8
8
  def fetch_ast(line)
9
- @asts ||= Parser.new.parse(@source).tap do
9
+ @asts ||= LiveAST.parser.new.parse(@source).tap do
10
10
  @source = nil
11
11
  end
12
12
  @asts.delete(line - @user_line + 1)
@@ -1,11 +1,9 @@
1
- require 'ruby2ruby'
2
-
3
1
  require 'live_ast/base'
4
2
 
5
3
  [Method, UnboundMethod, Proc].each do |klass|
6
4
  klass.class_eval do
7
5
  def to_ruby #:nodoc:
8
- Ruby2Ruby.new.process(LiveAST.ast(self))
6
+ LiveAST.parser::Unparser.unparse(LiveAST.ast(self))
9
7
  end
10
8
  end
11
9
  end
@@ -13,23 +11,14 @@ end
13
11
  class Method
14
12
  # :method: to_ruby
15
13
  # Generate ruby code which reflects the AST of this object.
16
- #
17
- # Defined by <code>require 'live_ast/to_ruby'</code>. The ruby2ruby
18
- # gem must be installed.
19
14
  end
20
15
 
21
16
  class UnboundMethod
22
17
  # :method: to_ruby
23
18
  # Generate ruby code which reflects the AST of this object.
24
- #
25
- # Defined by <code>require 'live_ast/to_ruby'</code>. The ruby2ruby
26
- # gem must be installed.
27
19
  end
28
20
 
29
21
  class Proc
30
22
  # :method: to_ruby
31
23
  # Generate ruby code which reflects the AST of this object.
32
- #
33
- # Defined by <code>require 'live_ast/to_ruby'</code>. The ruby2ruby
34
- # gem must be installed.
35
24
  end
@@ -1,3 +1,3 @@
1
1
  module LiveAST
2
- VERSION = "0.2.3"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -1,4 +1,4 @@
1
- require_relative 'shared/main'
1
+ require_relative 'main'
2
2
 
3
3
  class AAB_ASTEvalFeatureTest < BaseTest
4
4
  def test_require
@@ -1,4 +1,4 @@
1
- require_relative 'shared/main'
1
+ require_relative 'main'
2
2
 
3
3
  class AAB_ASTLoadFeatureTest < BaseTest
4
4
  def test_require
@@ -1,4 +1,4 @@
1
- require_relative 'shared/main'
1
+ require_relative 'main'
2
2
 
3
3
  # test for raise redefinition side-effects: unsort this TestCase from
4
4
  # other TestCases.
@@ -1,4 +1,4 @@
1
- require_relative 'shared/main'
1
+ require_relative 'main'
2
2
 
3
3
  class CovertDefineMethodTest < RegularTest
4
4
  DEFINE = lambda do
@@ -17,7 +17,7 @@ class CovertDefineMethodTest < RegularTest
17
17
  DEFINE.call
18
18
  assert_equal 77, A.new.h(33, 44)
19
19
 
20
- assert_equal binop_covert_define_method(:h, :+, :my_def),
20
+ assert_equal binop_define_method(:h, :+, :my_def),
21
21
  A.instance_method(:h).to_ast
22
22
  end
23
23
  end
data/test/def_test.rb CHANGED
@@ -1,4 +1,4 @@
1
- require_relative 'shared/main'
1
+ require_relative 'main'
2
2
 
3
3
  class DefTest < RegularTest
4
4
  class A
@@ -1,4 +1,4 @@
1
- require_relative 'shared/main'
1
+ require_relative 'main'
2
2
 
3
3
  class DefineMethodTest < RegularTest
4
4
  DEFINE = lambda do
@@ -1,4 +1,4 @@
1
- require_relative 'shared/main'
1
+ require_relative 'main'
2
2
 
3
3
  class DefineSingletonMethodTest < RegularTest
4
4
  def test_define_singleton_method
@@ -1,4 +1,4 @@
1
- require_relative 'shared/main'
1
+ require_relative 'main'
2
2
 
3
3
  require_relative 'encoding_test/default.rb'
4
4
  require_relative 'encoding_test/usascii.rb'
@@ -44,10 +44,10 @@ class AllEncodingTest < RegularTest
44
44
  end
45
45
 
46
46
  def test_bad
47
- orig = assert_raise ArgumentError do
47
+ orig = assert_raises ArgumentError do
48
48
  require "./test/encoding_test/bad.rb"
49
49
  end
50
- live = assert_raise ArgumentError do
50
+ live = assert_raises ArgumentError do
51
51
  LiveAST.load "./test/encoding_test/bad.rb"
52
52
  end
53
53
  # inconsistent punctuation from Ruby
data/test/error_test.rb CHANGED
@@ -1,10 +1,10 @@
1
- require_relative 'shared/main'
1
+ require_relative 'main'
2
2
 
3
3
  class ErrorTest < RegularTest
4
4
  def test_multiple_lambda_same_line
5
5
  a = lambda { } ; b = lambda { }
6
6
 
7
- assert_raise LiveAST::MultipleDefinitionsOnSameLineError do
7
+ assert_raises LiveAST::MultipleDefinitionsOnSameLineError do
8
8
  a.to_ast
9
9
  end
10
10
  end
@@ -17,13 +17,13 @@ class ErrorTest < RegularTest
17
17
 
18
18
  def test_multi_defs
19
19
  DEFINE_A.call
20
- assert_raise LiveAST::MultipleDefinitionsOnSameLineError do
20
+ assert_raises LiveAST::MultipleDefinitionsOnSameLineError do
21
21
  A.instance_method(:f).to_ast
22
22
  end
23
23
  end
24
24
 
25
25
  def test_ast_not_found
26
- assert_raise LiveAST::NoSourceError do
26
+ assert_raises LiveAST::NoSourceError do
27
27
  File.method(:open).to_ast
28
28
  end
29
29
  end
data/test/eval_test.rb CHANGED
@@ -1,4 +1,4 @@
1
- require_relative 'shared/main'
1
+ require_relative 'main'
2
2
 
3
3
  class EvalTest < RegularTest
4
4
  DEFINE_A = lambda do