ruco 0.1.8 → 0.1.9
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/Readme.md +3 -1
- data/VERSION +1 -1
- data/lib/ruco/core_ext/object.rb +7 -1
- data/lib/ruco/core_ext/string.rb +6 -0
- data/lib/ruco/text_area.rb +34 -1
- data/ruco.gemspec +2 -2
- data/spec/ruco/core_ext/string_spec.rb +16 -1
- data/spec/ruco/text_area_spec.rb +96 -0
- metadata +4 -4
    
        data/Readme.md
    CHANGED
    
    | @@ -15,7 +15,7 @@ Features: | |
| 15 15 | 
             
             - stays at last position when reopening a file
         | 
| 16 16 | 
             
             - opens file at line with `ruco foo/bar.rb:32` syntax
         | 
| 17 17 | 
             
             - keeps whatever newline format you use (\r \n \r\n)
         | 
| 18 | 
            -
             -  | 
| 18 | 
            +
             - surrounds selection with quotes/braces (select abc + " --> "abc")
         | 
| 19 19 | 
             
             - (optional) remove trailing whitespace on save
         | 
| 20 20 | 
             
             - (optional) blank line before eof on save
         | 
| 21 21 | 
             
             - (optional) line numbers
         | 
| @@ -82,6 +82,7 @@ TIPS | |
| 82 82 |  | 
| 83 83 | 
             
            TODO
         | 
| 84 84 | 
             
            =====
         | 
| 85 | 
            +
             - do not fall back to 0:0 after undoing the first change
         | 
| 85 86 | 
             
             - slow when opening file with 10,000+ short lines -> investigate
         | 
| 86 87 | 
             
             - check writable status every x seconds (e.g. in background) -> faster while typing
         | 
| 87 88 | 
             
             - search help e.g. 'Nothing found' '#4 of 6 hits' 'no more hits, start from beginning ?'
         | 
| @@ -98,6 +99,7 @@ TODO | |
| 98 99 | 
             
             - add auto-confirm to 'replace?' dialog -> type s == skip, no enter needed
         | 
| 99 100 | 
             
             - 1.8: unicode support <-> already finished but unusable due to Curses (see encoding branch)
         | 
| 100 101 | 
             
             - shorten long file names in the middle/start, not at the end
         | 
| 102 | 
            +
             - add double quotes/braces when typing one + skip over quote/brace when its already typed at current position
         | 
| 101 103 |  | 
| 102 104 | 
             
            Authors
         | 
| 103 105 | 
             
            =======
         | 
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            0.1. | 
| 1 | 
            +
            0.1.9
         | 
    
        data/lib/ruco/core_ext/object.rb
    CHANGED
    
    | @@ -13,7 +13,7 @@ def #{method}(*args, &block) | |
| 13 13 | 
             
            end
         | 
| 14 14 | 
             
            EOS
         | 
| 15 15 | 
             
                end
         | 
| 16 | 
            -
              end
         | 
| 16 | 
            +
              end unless defined? delegate
         | 
| 17 17 | 
             
            end
         | 
| 18 18 |  | 
| 19 19 | 
             
            class Object
         | 
| @@ -44,3 +44,9 @@ class Object | |
| 44 44 | 
             
                end
         | 
| 45 45 | 
             
              end
         | 
| 46 46 | 
             
            end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
            class Object
         | 
| 49 | 
            +
              def deep_copy
         | 
| 50 | 
            +
                Marshal.load(Marshal.dump(self))
         | 
| 51 | 
            +
              end unless defined? deep_copy
         | 
| 52 | 
            +
            end
         | 
    
        data/lib/ruco/core_ext/string.rb
    CHANGED
    
    | @@ -36,6 +36,12 @@ class String | |
| 36 36 | 
             
                  bytes.first
         | 
| 37 37 | 
             
                end
         | 
| 38 38 | 
             
              end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
              def surrounded_in?(*words)
         | 
| 41 | 
            +
                first = words.first
         | 
| 42 | 
            +
                last = words.last
         | 
| 43 | 
            +
                slice(0,first.size) == first and slice(-last.size,last.size) == last
         | 
| 44 | 
            +
              end
         | 
| 39 45 | 
             
            end
         | 
| 40 46 |  | 
| 41 47 | 
             
            # http://grosser.it/2010/12/31/ruby-string-indexes-indices-find-all-indexes-in-a-string
         | 
    
        data/lib/ruco/text_area.rb
    CHANGED
    
    | @@ -1,5 +1,15 @@ | |
| 1 1 | 
             
            module Ruco
         | 
| 2 2 | 
             
              class TextArea
         | 
| 3 | 
            +
                SURROUNDING_CHARS = {
         | 
| 4 | 
            +
                  '<' => '>',
         | 
| 5 | 
            +
                  '(' => ')',
         | 
| 6 | 
            +
                  '[' => ']',
         | 
| 7 | 
            +
                  '{' => '}',
         | 
| 8 | 
            +
                  '"' => '"',
         | 
| 9 | 
            +
                  "'" => "'",
         | 
| 10 | 
            +
                  '/' => '/'
         | 
| 11 | 
            +
                }
         | 
| 12 | 
            +
             | 
| 3 13 | 
             
                attr_reader :lines, :selection, :column, :line
         | 
| 4 14 |  | 
| 5 15 | 
             
                def initialize(content, options)
         | 
| @@ -78,7 +88,13 @@ module Ruco | |
| 78 88 | 
             
                end
         | 
| 79 89 |  | 
| 80 90 | 
             
                def insert(text)
         | 
| 81 | 
            -
                   | 
| 91 | 
            +
                  if @selection
         | 
| 92 | 
            +
                    if SURROUNDING_CHARS[text]
         | 
| 93 | 
            +
                      return surround_selection_with(text)
         | 
| 94 | 
            +
                    else
         | 
| 95 | 
            +
                      delete_content_in_selection
         | 
| 96 | 
            +
                    end
         | 
| 97 | 
            +
                  end
         | 
| 82 98 |  | 
| 83 99 | 
             
                  text.tabs_to_spaces!
         | 
| 84 100 | 
             
                  if text == "\n" and @column >= current_line.leading_whitespace.size
         | 
| @@ -269,5 +285,22 @@ module Ruco | |
| 269 285 | 
             
                  sanitize_position
         | 
| 270 286 | 
             
                  @window.set_position(position, :max_lines => @lines.size)
         | 
| 271 287 | 
             
                end
         | 
| 288 | 
            +
             | 
| 289 | 
            +
                def surround_selection_with(text)
         | 
| 290 | 
            +
                  open_char = text
         | 
| 291 | 
            +
                  close_char = SURROUNDING_CHARS[text]
         | 
| 292 | 
            +
                  old_selection = @selection.deep_copy
         | 
| 293 | 
            +
                  selected = text_in_selection
         | 
| 294 | 
            +
             | 
| 295 | 
            +
                  replace_surrounding_chars = SURROUNDING_CHARS.any?{|chars| selected.surrounded_in?(*chars) }
         | 
| 296 | 
            +
                  if replace_surrounding_chars
         | 
| 297 | 
            +
                    selected = selected[1..-2]
         | 
| 298 | 
            +
                  else
         | 
| 299 | 
            +
                    old_selection.last.column += 2
         | 
| 300 | 
            +
                  end
         | 
| 301 | 
            +
             | 
| 302 | 
            +
                  insert("#{open_char}#{selected}#{close_char}")
         | 
| 303 | 
            +
                  @selection = old_selection
         | 
| 304 | 
            +
                end
         | 
| 272 305 | 
             
              end
         | 
| 273 306 | 
             
            end
         | 
    
        data/ruco.gemspec
    CHANGED
    
    | @@ -5,11 +5,11 @@ | |
| 5 5 |  | 
| 6 6 | 
             
            Gem::Specification.new do |s|
         | 
| 7 7 | 
             
              s.name = %q{ruco}
         | 
| 8 | 
            -
              s.version = "0.1. | 
| 8 | 
            +
              s.version = "0.1.9"
         | 
| 9 9 |  | 
| 10 10 | 
             
              s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
         | 
| 11 11 | 
             
              s.authors = ["Michael Grosser"]
         | 
| 12 | 
            -
              s.date = %q{2011-08- | 
| 12 | 
            +
              s.date = %q{2011-08-24}
         | 
| 13 13 | 
             
              s.default_executable = %q{ruco}
         | 
| 14 14 | 
             
              s.email = %q{michael@grosser.it}
         | 
| 15 15 | 
             
              s.executables = ["ruco"]
         | 
| @@ -14,4 +14,19 @@ describe String do | |
| 14 14 | 
             
                  "".naive_split('a').should == ['']
         | 
| 15 15 | 
             
                end
         | 
| 16 16 | 
             
              end
         | 
| 17 | 
            -
             | 
| 17 | 
            +
             | 
| 18 | 
            +
              describe :surrounded_in? do
         | 
| 19 | 
            +
                [
         | 
| 20 | 
            +
                  ['aba','a',true],
         | 
| 21 | 
            +
                  ['abcab','ab',true],
         | 
| 22 | 
            +
                  ['acc','a',false],
         | 
| 23 | 
            +
                  ['cca','a',false],
         | 
| 24 | 
            +
                  ['(cca)',['(',')'],true],
         | 
| 25 | 
            +
                  ['(cca',['(',')'],false],
         | 
| 26 | 
            +
                ].each do |text, word, success|
         | 
| 27 | 
            +
                  it "is #{success} for #{word} in #{text}" do
         | 
| 28 | 
            +
                    text.surrounded_in?(*[*word]).should == success
         | 
| 29 | 
            +
                  end
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
            end
         | 
    
        data/spec/ruco/text_area_spec.rb
    CHANGED
    
    | @@ -54,4 +54,100 @@ describe Ruco::TextArea do | |
| 54 54 | 
             
                  end
         | 
| 55 55 | 
             
                end
         | 
| 56 56 | 
             
              end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
              describe :insert do
         | 
| 59 | 
            +
                let(:text){Ruco::TextArea.new("", :lines => 3, :columns => 10)}
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                describe "inserting surrounding characters" do
         | 
| 62 | 
            +
                  xit "does nothing special when pasting" do
         | 
| 63 | 
            +
                    text.insert("'bar'")
         | 
| 64 | 
            +
                    text.view.should == "'bar'\n\n"
         | 
| 65 | 
            +
                    text.cursor.should == [0,5]
         | 
| 66 | 
            +
                  end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                  xit "inserts a pair when just typing" do
         | 
| 69 | 
            +
                    text.insert("'")
         | 
| 70 | 
            +
                    text.view.should == "''\n\n"
         | 
| 71 | 
            +
                    text.cursor.should == [0,1]
         | 
| 72 | 
            +
                  end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                  xit "closes the surround if only char in surround" do
         | 
| 75 | 
            +
                    text.insert("'")
         | 
| 76 | 
            +
                    text.insert("'")
         | 
| 77 | 
            +
                    text.view.should == "''\n\n"
         | 
| 78 | 
            +
                    text.cursor.should == [0,2]
         | 
| 79 | 
            +
                  end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                  xit "overwrites next if its the same" do
         | 
| 82 | 
            +
                    text.insert("'bar'")
         | 
| 83 | 
            +
                    text.move(:relative, 0,-1)
         | 
| 84 | 
            +
                    text.insert("'")
         | 
| 85 | 
            +
                    text.view.should == "'bar'\n\n"
         | 
| 86 | 
            +
                    text.cursor.should == [0,5]
         | 
| 87 | 
            +
                  end
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                  it "surrounds text when selecting" do
         | 
| 90 | 
            +
                    text.insert('bar')
         | 
| 91 | 
            +
                    text.move(:to, 0,0)
         | 
| 92 | 
            +
                    text.selecting{ move(:to, 0,2) }
         | 
| 93 | 
            +
                    text.insert("{")
         | 
| 94 | 
            +
                    text.view.should == "{ba}r\n\n"
         | 
| 95 | 
            +
                    text.cursor.should == [0,4]
         | 
| 96 | 
            +
                  end
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                  it "does not surround text with closing char when selecting" do
         | 
| 99 | 
            +
                    text.insert('bar')
         | 
| 100 | 
            +
                    text.move(:to, 0,0)
         | 
| 101 | 
            +
                    text.selecting{ move(:to, 0,2) }
         | 
| 102 | 
            +
                    text.insert("}")
         | 
| 103 | 
            +
                    text.view.should == "}r\n\n"
         | 
| 104 | 
            +
                    text.cursor.should == [0,1]
         | 
| 105 | 
            +
                  end
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                  it "replaces surrounding quotes" do
         | 
| 108 | 
            +
                    text.insert('"bar"')
         | 
| 109 | 
            +
                    text.move(:to, 0,0)
         | 
| 110 | 
            +
                    text.selecting{ move(:to, 0,5) }
         | 
| 111 | 
            +
                    text.insert("'")
         | 
| 112 | 
            +
                    text.view.should == "'bar'\n\n"
         | 
| 113 | 
            +
                    text.cursor.should == [0,5]
         | 
| 114 | 
            +
                  end
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                  it "replace surrounding braces" do
         | 
| 117 | 
            +
                    text.insert('(bar)')
         | 
| 118 | 
            +
                    text.move(:to, 0,0)
         | 
| 119 | 
            +
                    text.selecting{ move(:to, 0,5) }
         | 
| 120 | 
            +
                    text.insert("'")
         | 
| 121 | 
            +
                    text.view.should == "'bar'\n\n"
         | 
| 122 | 
            +
                    text.cursor.should == [0,5]
         | 
| 123 | 
            +
                  end
         | 
| 124 | 
            +
             | 
| 125 | 
            +
                  it "does not replace when only one side has surrounding char" do
         | 
| 126 | 
            +
                    text.insert("\"bar\"")
         | 
| 127 | 
            +
                    text.move(:to, 0,0)
         | 
| 128 | 
            +
                    text.selecting{ move(:to, 0,3) }
         | 
| 129 | 
            +
                    text.insert("'")
         | 
| 130 | 
            +
                    text.view.should == "'\"ba'r\"\n\n"
         | 
| 131 | 
            +
                    text.cursor.should == [0,5]
         | 
| 132 | 
            +
                  end
         | 
| 133 | 
            +
             | 
| 134 | 
            +
                  it "expands selection when surrounding" do
         | 
| 135 | 
            +
                    text.insert('bar')
         | 
| 136 | 
            +
                    text.move(:to, 0,0)
         | 
| 137 | 
            +
                    text.selecting{ move(:to, 0,2) }
         | 
| 138 | 
            +
                    text.insert("{")
         | 
| 139 | 
            +
                    text.view.should == "{ba}r\n\n"
         | 
| 140 | 
            +
                    text.selection.should == ([0,0]..[0,4])
         | 
| 141 | 
            +
                  end
         | 
| 142 | 
            +
             | 
| 143 | 
            +
                  it "keeps selection when replacing surround" do
         | 
| 144 | 
            +
                    text.insert('"bar"')
         | 
| 145 | 
            +
                    text.move(:to, 0,0)
         | 
| 146 | 
            +
                    text.selecting{ move(:to, 0,5) }
         | 
| 147 | 
            +
                    text.insert("'")
         | 
| 148 | 
            +
                    text.view.should == "'bar'\n\n"
         | 
| 149 | 
            +
                    text.selection.should == ([0,0]..[0,5])
         | 
| 150 | 
            +
                  end
         | 
| 151 | 
            +
                end
         | 
| 152 | 
            +
              end
         | 
| 57 153 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,13 +1,13 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: ruco
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
              hash:  | 
| 4 | 
            +
              hash: 9
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
              segments: 
         | 
| 7 7 | 
             
              - 0
         | 
| 8 8 | 
             
              - 1
         | 
| 9 | 
            -
              -  | 
| 10 | 
            -
              version: 0.1. | 
| 9 | 
            +
              - 9
         | 
| 10 | 
            +
              version: 0.1.9
         | 
| 11 11 | 
             
            platform: ruby
         | 
| 12 12 | 
             
            authors: 
         | 
| 13 13 | 
             
            - Michael Grosser
         | 
| @@ -15,7 +15,7 @@ autorequire: | |
| 15 15 | 
             
            bindir: bin
         | 
| 16 16 | 
             
            cert_chain: []
         | 
| 17 17 |  | 
| 18 | 
            -
            date: 2011-08- | 
| 18 | 
            +
            date: 2011-08-24 00:00:00 +02:00
         | 
| 19 19 | 
             
            default_executable: ruco
         | 
| 20 20 | 
             
            dependencies: 
         | 
| 21 21 | 
             
            - !ruby/object:Gem::Dependency 
         |