history_file 0.1.0 → 0.2.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/.travis.yml +7 -0
 - data/CHANGELOG.markdown +9 -0
 - data/Gemfile +5 -1
 - data/Gemfile.lock +2 -11
 - data/Guardfile +11 -11
 - data/README.markdown +99 -0
 - data/VERSION +1 -1
 - data/history_file.gemspec +9 -7
 - data/lib/history_file/file_delegator.rb +31 -10
 - data/lib/history_file/history_file.rb +11 -2
 - data/spec/history_file/history_file_spec.rb +89 -43
 - data/spec/spec_helper.rb +27 -37
 - metadata +23 -21
 - data/README.rdoc +0 -32
 
    
        data/.travis.yml
    ADDED
    
    
    
        data/CHANGELOG.markdown
    ADDED
    
    
    
        data/Gemfile
    CHANGED
    
    | 
         @@ -12,6 +12,7 @@ group :development do 
     | 
|
| 
       12 
12 
     | 
    
         
             
              gem "jeweler", "~> 1.8.4"
         
     | 
| 
       13 
13 
     | 
    
         
             
              gem "simplecov", ">= 0"
         
     | 
| 
       14 
14 
     | 
    
         
             
            end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
       15 
16 
     | 
    
         
             
            group :development, :test do
         
     | 
| 
       16 
17 
     | 
    
         
             
              gem 'webmock'
         
     | 
| 
       17 
18 
     | 
    
         
             
              gem 'rspec'
         
     | 
| 
         @@ -20,6 +21,9 @@ group :development, :test do 
     | 
|
| 
       20 
21 
     | 
    
         
             
              gem 'guard-rspec'
         
     | 
| 
       21 
22 
     | 
    
         
             
              gem 'guard-bundler'
         
     | 
| 
       22 
23 
     | 
    
         
             
              gem 'guard-yard'
         
     | 
| 
       23 
     | 
    
         
            -
              gem 'guard-spork'
         
     | 
| 
       24 
24 
     | 
    
         
             
              gem 'rb-fsevent'
         
     | 
| 
       25 
25 
     | 
    
         
             
            end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            platform :ruby do
         
     | 
| 
      
 28 
     | 
    
         
            +
              gem 'redcarpet'
         
     | 
| 
      
 29 
     | 
    
         
            +
            end
         
     | 
    
        data/Gemfile.lock
    CHANGED
    
    | 
         @@ -5,12 +5,9 @@ GEM 
     | 
|
| 
       5 
5 
     | 
    
         
             
                  i18n (~> 0.6)
         
     | 
| 
       6 
6 
     | 
    
         
             
                  multi_json (~> 1.0)
         
     | 
| 
       7 
7 
     | 
    
         
             
                addressable (2.3.2)
         
     | 
| 
       8 
     | 
    
         
            -
                childprocess (0.3.6)
         
     | 
| 
       9 
     | 
    
         
            -
                  ffi (~> 1.0, >= 1.0.6)
         
     | 
| 
       10 
8 
     | 
    
         
             
                coderay (1.0.8)
         
     | 
| 
       11 
9 
     | 
    
         
             
                crack (0.3.1)
         
     | 
| 
       12 
10 
     | 
    
         
             
                diff-lcs (1.1.3)
         
     | 
| 
       13 
     | 
    
         
            -
                ffi (1.1.5)
         
     | 
| 
       14 
11 
     | 
    
         
             
                git (1.2.5)
         
     | 
| 
       15 
12 
     | 
    
         
             
                guard (1.5.4)
         
     | 
| 
       16 
13 
     | 
    
         
             
                  listen (>= 0.4.2)
         
     | 
| 
         @@ -23,11 +20,6 @@ GEM 
     | 
|
| 
       23 
20 
     | 
    
         
             
                guard-rspec (2.1.1)
         
     | 
| 
       24 
21 
     | 
    
         
             
                  guard (>= 1.1)
         
     | 
| 
       25 
22 
     | 
    
         
             
                  rspec (~> 2.11)
         
     | 
| 
       26 
     | 
    
         
            -
                guard-spork (1.2.3)
         
     | 
| 
       27 
     | 
    
         
            -
                  childprocess (>= 0.2.3)
         
     | 
| 
       28 
     | 
    
         
            -
                  guard (>= 1.1)
         
     | 
| 
       29 
     | 
    
         
            -
                  spork (>= 0.8.4)
         
     | 
| 
       30 
     | 
    
         
            -
                  sys-proctable
         
     | 
| 
       31 
23 
     | 
    
         
             
                guard-yard (2.0.1)
         
     | 
| 
       32 
24 
     | 
    
         
             
                  guard (>= 1.1.0)
         
     | 
| 
       33 
25 
     | 
    
         
             
                  yard (>= 0.7.0)
         
     | 
| 
         @@ -50,6 +42,7 @@ GEM 
     | 
|
| 
       50 
42 
     | 
    
         
             
                rb-fsevent (0.9.2)
         
     | 
| 
       51 
43 
     | 
    
         
             
                rdoc (3.12)
         
     | 
| 
       52 
44 
     | 
    
         
             
                  json (~> 1.4)
         
     | 
| 
      
 45 
     | 
    
         
            +
                redcarpet (2.2.2)
         
     | 
| 
       53 
46 
     | 
    
         
             
                rspec (2.12.0)
         
     | 
| 
       54 
47 
     | 
    
         
             
                  rspec-core (~> 2.12.0)
         
     | 
| 
       55 
48 
     | 
    
         
             
                  rspec-expectations (~> 2.12.0)
         
     | 
| 
         @@ -69,8 +62,6 @@ GEM 
     | 
|
| 
       69 
62 
     | 
    
         
             
                  simplecov-html (~> 0.7.1)
         
     | 
| 
       70 
63 
     | 
    
         
             
                simplecov-html (0.7.1)
         
     | 
| 
       71 
64 
     | 
    
         
             
                slop (3.3.3)
         
     | 
| 
       72 
     | 
    
         
            -
                spork (0.9.2)
         
     | 
| 
       73 
     | 
    
         
            -
                sys-proctable (0.9.2)
         
     | 
| 
       74 
65 
     | 
    
         
             
                terminal-notifier (1.4.2)
         
     | 
| 
       75 
66 
     | 
    
         
             
                thor (0.16.0)
         
     | 
| 
       76 
67 
     | 
    
         
             
                webmock (1.9.0)
         
     | 
| 
         @@ -86,11 +77,11 @@ DEPENDENCIES 
     | 
|
| 
       86 
77 
     | 
    
         
             
              guard
         
     | 
| 
       87 
78 
     | 
    
         
             
              guard-bundler
         
     | 
| 
       88 
79 
     | 
    
         
             
              guard-rspec
         
     | 
| 
       89 
     | 
    
         
            -
              guard-spork
         
     | 
| 
       90 
80 
     | 
    
         
             
              guard-yard
         
     | 
| 
       91 
81 
     | 
    
         
             
              jeweler (~> 1.8.4)
         
     | 
| 
       92 
82 
     | 
    
         
             
              rb-fsevent
         
     | 
| 
       93 
83 
     | 
    
         
             
              rdoc (~> 3.12)
         
     | 
| 
      
 84 
     | 
    
         
            +
              redcarpet
         
     | 
| 
       94 
85 
     | 
    
         
             
              rspec
         
     | 
| 
       95 
86 
     | 
    
         
             
              shoulda
         
     | 
| 
       96 
87 
     | 
    
         
             
              simplecov
         
     | 
    
        data/Guardfile
    CHANGED
    
    | 
         @@ -26,17 +26,17 @@ guard 'rspec', :version => 2 do 
     | 
|
| 
       26 
26 
     | 
    
         
             
            end
         
     | 
| 
       27 
27 
     | 
    
         | 
| 
       28 
28 
     | 
    
         | 
| 
       29 
     | 
    
         
            -
            guard 'spork', :cucumber_env => { 'RAILS_ENV' => 'test' }, :rspec_env => { 'RAILS_ENV' => 'test' } do
         
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
            end
         
     | 
| 
      
 29 
     | 
    
         
            +
            # guard 'spork', :cucumber_env => { 'RAILS_ENV' => 'test' }, :rspec_env => { 'RAILS_ENV' => 'test' } do
         
     | 
| 
      
 30 
     | 
    
         
            +
            #   watch('config/application.rb')
         
     | 
| 
      
 31 
     | 
    
         
            +
            #   watch('config/environment.rb')
         
     | 
| 
      
 32 
     | 
    
         
            +
            #   watch('config/environments/test.rb')
         
     | 
| 
      
 33 
     | 
    
         
            +
            #   watch(%r{^config/initializers/.+\.rb$})
         
     | 
| 
      
 34 
     | 
    
         
            +
            #   watch('Gemfile')
         
     | 
| 
      
 35 
     | 
    
         
            +
            #   watch('Gemfile.lock')
         
     | 
| 
      
 36 
     | 
    
         
            +
            #   watch('spec/spec_helper.rb') { :rspec }
         
     | 
| 
      
 37 
     | 
    
         
            +
            #   watch('test/test_helper.rb') { :test_unit }
         
     | 
| 
      
 38 
     | 
    
         
            +
            #   watch(%r{features/support/}) { :cucumber }
         
     | 
| 
      
 39 
     | 
    
         
            +
            # end
         
     | 
| 
       40 
40 
     | 
    
         | 
| 
       41 
41 
     | 
    
         
             
            guard 'yard', port: 8808, stdout: '/dev/null' do
         
     | 
| 
       42 
42 
     | 
    
         
             
              watch(%r{app/.+\.rb})
         
     | 
    
        data/README.markdown
    ADDED
    
    | 
         @@ -0,0 +1,99 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            HistoryFile
         
     | 
| 
      
 2 
     | 
    
         
            +
            ===========
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            Behaves like a `File` class and does some convenience stuff
         
     | 
| 
      
 5 
     | 
    
         
            +
            around a `HistoryFile::FileDelegator` instance. It lets you 
         
     | 
| 
      
 6 
     | 
    
         
            +
            version files by dates. A date prefix is added to the file
         
     | 
| 
      
 7 
     | 
    
         
            +
            name.
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            If you want to write a file to store data from yesterday, 
         
     | 
| 
      
 10 
     | 
    
         
            +
            you could write:
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 13 
     | 
    
         
            +
            > f = HistoryFile[1.day.ago].new("/tmp/foo.txt", "w")
         
     | 
| 
      
 14 
     | 
    
         
            +
            => #<File:/tmp/2012.11.02-foo.txt>
         
     | 
| 
      
 15 
     | 
    
         
            +
            ```
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            The returned `HistoryFile::FileDelegator` object supports all
         
     | 
| 
      
 18 
     | 
    
         
            +
            methods that File has, but adds a date prefix to those methods
         
     | 
| 
      
 19 
     | 
    
         
            +
            that revolve around a single file (reading, writing, etc.)
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            If a file for a given date is not available, `HistoryFile` falls
         
     | 
| 
      
 22 
     | 
    
         
            +
            back to the freshest file that is older than the given date.
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 25 
     | 
    
         
            +
            > f = HistoryFile[3.days.ago].new("test.txt", "w")
         
     | 
| 
      
 26 
     | 
    
         
            +
            => #<File:./2012.11.12-test.txt>
         
     | 
| 
      
 27 
     | 
    
         
            +
            > f.write("I am old")
         
     | 
| 
      
 28 
     | 
    
         
            +
            => 8
         
     | 
| 
      
 29 
     | 
    
         
            +
            > f.close
         
     | 
| 
      
 30 
     | 
    
         
            +
            => nil
         
     | 
| 
      
 31 
     | 
    
         
            +
            > HistoryFile[Date.today].read("test.txt")
         
     | 
| 
      
 32 
     | 
    
         
            +
            => "I am old"
         
     | 
| 
      
 33 
     | 
    
         
            +
            > HistoryFile[10.days.ago].read("test.txt")
         
     | 
| 
      
 34 
     | 
    
         
            +
            Errno::ENOENT: No such file or directory - ./2012.11.05-test.txt
         
     | 
| 
      
 35 
     | 
    
         
            +
            ```
         
     | 
| 
      
 36 
     | 
    
         
            +
            It does this for every method where a prefix is added and when
         
     | 
| 
      
 37 
     | 
    
         
            +
            an `Errno::ENOENT` is thrown.
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
            Methods that patch all arguments with a date prefix
         
     | 
| 
      
 40 
     | 
    
         
            +
            ---------------------------------------------------
         
     | 
| 
      
 41 
     | 
    
         
            +
            You can pass an arbitrary amount of arguments to these methods,
         
     | 
| 
      
 42 
     | 
    
         
            +
            but all of them are file names. So we'll go ahead and prefix all
         
     | 
| 
      
 43 
     | 
    
         
            +
            of them:
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
            - `delete`
         
     | 
| 
      
 46 
     | 
    
         
            +
            - `unlink`
         
     | 
| 
      
 47 
     | 
    
         
            +
            - `safe_unlink`
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
            Methods that patch nothing and just delegate to File
         
     | 
| 
      
 50 
     | 
    
         
            +
            ----------------------------------------------------
         
     | 
| 
      
 51 
     | 
    
         
            +
            These are mostly methods that are either not `HistoryFile` specific
         
     | 
| 
      
 52 
     | 
    
         
            +
            (i.e. `File.join` to join components with the OS dependant path 
         
     | 
| 
      
 53 
     | 
    
         
            +
            separator) or where one can't dumbly prefix filenames. 
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
            - `absolute_path`
         
     | 
| 
      
 56 
     | 
    
         
            +
            - `basename`
         
     | 
| 
      
 57 
     | 
    
         
            +
            - `catname`
         
     | 
| 
      
 58 
     | 
    
         
            +
            - `chmod`
         
     | 
| 
      
 59 
     | 
    
         
            +
            - `chown`
         
     | 
| 
      
 60 
     | 
    
         
            +
            - `compare`
         
     | 
| 
      
 61 
     | 
    
         
            +
            - `copy`
         
     | 
| 
      
 62 
     | 
    
         
            +
            - `directory?`
         
     | 
| 
      
 63 
     | 
    
         
            +
            - `dirname`
         
     | 
| 
      
 64 
     | 
    
         
            +
            - `expand_path`
         
     | 
| 
      
 65 
     | 
    
         
            +
            - `extname`
         
     | 
| 
      
 66 
     | 
    
         
            +
            - `fnmatch`
         
     | 
| 
      
 67 
     | 
    
         
            +
            - `fnmatch?`
         
     | 
| 
      
 68 
     | 
    
         
            +
            - `identical?`
         
     | 
| 
      
 69 
     | 
    
         
            +
            - `install`
         
     | 
| 
      
 70 
     | 
    
         
            +
            - `join`
         
     | 
| 
      
 71 
     | 
    
         
            +
            - `lchown`
         
     | 
| 
      
 72 
     | 
    
         
            +
            - `link`
         
     | 
| 
      
 73 
     | 
    
         
            +
            - `makedirs`
         
     | 
| 
      
 74 
     | 
    
         
            +
            - `move`
         
     | 
| 
      
 75 
     | 
    
         
            +
            - `path`
         
     | 
| 
      
 76 
     | 
    
         
            +
            - `realdirpath`
         
     | 
| 
      
 77 
     | 
    
         
            +
            - `realpath`
         
     | 
| 
      
 78 
     | 
    
         
            +
            - `rename`
         
     | 
| 
      
 79 
     | 
    
         
            +
            - `split`
         
     | 
| 
      
 80 
     | 
    
         
            +
            - `umask`
         
     | 
| 
      
 81 
     | 
    
         
            +
            - `utime`
         
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
      
 83 
     | 
    
         
            +
            Methods that add a prefix to the filename
         
     | 
| 
      
 84 
     | 
    
         
            +
            -----------------------------------------
         
     | 
| 
      
 85 
     | 
    
         
            +
            All methods not mentioned in the previous two sections
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
      
 87 
     | 
    
         
            +
            Methods that automatically create a sub directory
         
     | 
| 
      
 88 
     | 
    
         
            +
            -------------------------------------------------
         
     | 
| 
      
 89 
     | 
    
         
            +
            If you set `HistoryFile.mode = :subdir` and you call one of the
         
     | 
| 
      
 90 
     | 
    
         
            +
            following methods, Historyfile will create a sub directory for the given
         
     | 
| 
      
 91 
     | 
    
         
            +
            date if it does not exist already
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
            - `new`
         
     | 
| 
      
 94 
     | 
    
         
            +
            - `open`
         
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
      
 96 
     | 
    
         
            +
            Tests
         
     | 
| 
      
 97 
     | 
    
         
            +
            -----
         
     | 
| 
      
 98 
     | 
    
         
            +
            We use simplecov and it reports 100% coverage.
         
     | 
| 
      
 99 
     | 
    
         
            +
            [](https://travis-ci.org/moviepilot/history_file)
         
     | 
    
        data/VERSION
    CHANGED
    
    | 
         @@ -1 +1 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            0. 
     | 
| 
      
 1 
     | 
    
         
            +
            0.2.0
         
     | 
    
        data/history_file.gemspec
    CHANGED
    
    | 
         @@ -5,25 +5,27 @@ 
     | 
|
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
            Gem::Specification.new do |s|
         
     | 
| 
       7 
7 
     | 
    
         
             
              s.name = "history_file"
         
     | 
| 
       8 
     | 
    
         
            -
              s.version = "0. 
     | 
| 
      
 8 
     | 
    
         
            +
              s.version = "0.2.0"
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
10 
     | 
    
         
             
              s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
         
     | 
| 
       11 
11 
     | 
    
         
             
              s.authors = ["Jannis Hermanns"]
         
     | 
| 
       12 
     | 
    
         
            -
              s.date = "2012-11- 
     | 
| 
      
 12 
     | 
    
         
            +
              s.date = "2012-11-21"
         
     | 
| 
       13 
13 
     | 
    
         
             
              s.description = "A File like class that supports versioning by date and has a fallback to older files"
         
     | 
| 
       14 
14 
     | 
    
         
             
              s.email = "jannis@moviepilot.com"
         
     | 
| 
       15 
15 
     | 
    
         
             
              s.extra_rdoc_files = [
         
     | 
| 
       16 
16 
     | 
    
         
             
                "LICENSE.txt",
         
     | 
| 
       17 
     | 
    
         
            -
                "README. 
     | 
| 
      
 17 
     | 
    
         
            +
                "README.markdown"
         
     | 
| 
       18 
18 
     | 
    
         
             
              ]
         
     | 
| 
       19 
19 
     | 
    
         
             
              s.files = [
         
     | 
| 
       20 
20 
     | 
    
         
             
                ".document",
         
     | 
| 
       21 
21 
     | 
    
         
             
                ".rvmrc",
         
     | 
| 
      
 22 
     | 
    
         
            +
                ".travis.yml",
         
     | 
| 
      
 23 
     | 
    
         
            +
                "CHANGELOG.markdown",
         
     | 
| 
       22 
24 
     | 
    
         
             
                "Gemfile",
         
     | 
| 
       23 
25 
     | 
    
         
             
                "Gemfile.lock",
         
     | 
| 
       24 
26 
     | 
    
         
             
                "Guardfile",
         
     | 
| 
       25 
27 
     | 
    
         
             
                "LICENSE.txt",
         
     | 
| 
       26 
     | 
    
         
            -
                "README. 
     | 
| 
      
 28 
     | 
    
         
            +
                "README.markdown",
         
     | 
| 
       27 
29 
     | 
    
         
             
                "Rakefile",
         
     | 
| 
       28 
30 
     | 
    
         
             
                "VERSION",
         
     | 
| 
       29 
31 
     | 
    
         
             
                "history_file.gemspec",
         
     | 
| 
         @@ -43,6 +45,7 @@ Gem::Specification.new do |s| 
     | 
|
| 
       43 
45 
     | 
    
         
             
                s.specification_version = 3
         
     | 
| 
       44 
46 
     | 
    
         | 
| 
       45 
47 
     | 
    
         
             
                if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
         
     | 
| 
      
 48 
     | 
    
         
            +
                  s.add_runtime_dependency(%q<redcarpet>, [">= 0"])
         
     | 
| 
       46 
49 
     | 
    
         
             
                  s.add_development_dependency(%q<shoulda>, [">= 0"])
         
     | 
| 
       47 
50 
     | 
    
         
             
                  s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
         
     | 
| 
       48 
51 
     | 
    
         
             
                  s.add_development_dependency(%q<bundler>, [">= 0"])
         
     | 
| 
         @@ -55,9 +58,9 @@ Gem::Specification.new do |s| 
     | 
|
| 
       55 
58 
     | 
    
         
             
                  s.add_development_dependency(%q<guard-rspec>, [">= 0"])
         
     | 
| 
       56 
59 
     | 
    
         
             
                  s.add_development_dependency(%q<guard-bundler>, [">= 0"])
         
     | 
| 
       57 
60 
     | 
    
         
             
                  s.add_development_dependency(%q<guard-yard>, [">= 0"])
         
     | 
| 
       58 
     | 
    
         
            -
                  s.add_development_dependency(%q<guard-spork>, [">= 0"])
         
     | 
| 
       59 
61 
     | 
    
         
             
                  s.add_development_dependency(%q<rb-fsevent>, [">= 0"])
         
     | 
| 
       60 
62 
     | 
    
         
             
                else
         
     | 
| 
      
 63 
     | 
    
         
            +
                  s.add_dependency(%q<redcarpet>, [">= 0"])
         
     | 
| 
       61 
64 
     | 
    
         
             
                  s.add_dependency(%q<shoulda>, [">= 0"])
         
     | 
| 
       62 
65 
     | 
    
         
             
                  s.add_dependency(%q<rdoc>, ["~> 3.12"])
         
     | 
| 
       63 
66 
     | 
    
         
             
                  s.add_dependency(%q<bundler>, [">= 0"])
         
     | 
| 
         @@ -70,10 +73,10 @@ Gem::Specification.new do |s| 
     | 
|
| 
       70 
73 
     | 
    
         
             
                  s.add_dependency(%q<guard-rspec>, [">= 0"])
         
     | 
| 
       71 
74 
     | 
    
         
             
                  s.add_dependency(%q<guard-bundler>, [">= 0"])
         
     | 
| 
       72 
75 
     | 
    
         
             
                  s.add_dependency(%q<guard-yard>, [">= 0"])
         
     | 
| 
       73 
     | 
    
         
            -
                  s.add_dependency(%q<guard-spork>, [">= 0"])
         
     | 
| 
       74 
76 
     | 
    
         
             
                  s.add_dependency(%q<rb-fsevent>, [">= 0"])
         
     | 
| 
       75 
77 
     | 
    
         
             
                end
         
     | 
| 
       76 
78 
     | 
    
         
             
              else
         
     | 
| 
      
 79 
     | 
    
         
            +
                s.add_dependency(%q<redcarpet>, [">= 0"])
         
     | 
| 
       77 
80 
     | 
    
         
             
                s.add_dependency(%q<shoulda>, [">= 0"])
         
     | 
| 
       78 
81 
     | 
    
         
             
                s.add_dependency(%q<rdoc>, ["~> 3.12"])
         
     | 
| 
       79 
82 
     | 
    
         
             
                s.add_dependency(%q<bundler>, [">= 0"])
         
     | 
| 
         @@ -86,7 +89,6 @@ Gem::Specification.new do |s| 
     | 
|
| 
       86 
89 
     | 
    
         
             
                s.add_dependency(%q<guard-rspec>, [">= 0"])
         
     | 
| 
       87 
90 
     | 
    
         
             
                s.add_dependency(%q<guard-bundler>, [">= 0"])
         
     | 
| 
       88 
91 
     | 
    
         
             
                s.add_dependency(%q<guard-yard>, [">= 0"])
         
     | 
| 
       89 
     | 
    
         
            -
                s.add_dependency(%q<guard-spork>, [">= 0"])
         
     | 
| 
       90 
92 
     | 
    
         
             
                s.add_dependency(%q<rb-fsevent>, [">= 0"])
         
     | 
| 
       91 
93 
     | 
    
         
             
              end
         
     | 
| 
       92 
94 
     | 
    
         
             
            end
         
     | 
| 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module HistoryFile
         
     | 
| 
       2 
     | 
    
         
            -
              # This class delegates all method calls to the  
     | 
| 
      
 2 
     | 
    
         
            +
              # This class delegates all method calls to the `File` class.
         
     | 
| 
       3 
3 
     | 
    
         
             
              # The generic methods that don't revolve around one specific
         
     | 
| 
       4 
     | 
    
         
            -
              # file,  
     | 
| 
      
 4 
     | 
    
         
            +
              # file, `File.join` for example, are just passed on. These
         
     | 
| 
       5 
5 
     | 
    
         
             
              # methods are defined in
         
     | 
| 
       6 
6 
     | 
    
         
             
              # {HistoryFile::FileDelegator::EXCLUDED_METHODS}.
         
     | 
| 
       7 
7 
     | 
    
         
             
              #
         
     | 
| 
         @@ -16,7 +16,7 @@ module HistoryFile 
     | 
|
| 
       16 
16 
     | 
    
         
             
              #     > puts fd.read("/path/to/my_file.txt")
         
     | 
| 
       17 
17 
     | 
    
         
             
              #     => hello there
         
     | 
| 
       18 
18 
     | 
    
         
             
              #
         
     | 
| 
       19 
     | 
    
         
            -
              # This will pass on your block to  
     | 
| 
      
 19 
     | 
    
         
            +
              # This will pass on your block to `File.open`, but with a
         
     | 
| 
       20 
20 
     | 
    
         
             
              # prefixed the filename. So what's really called is:
         
     | 
| 
       21 
21 
     | 
    
         
             
              #
         
     | 
| 
       22 
22 
     | 
    
         
             
              #     File.open("/path/to/some_prefix-my_file.txt")
         
     | 
| 
         @@ -65,15 +65,21 @@ module HistoryFile 
     | 
|
| 
       65 
65 
     | 
    
         
             
                  :safe_unlink
         
     | 
| 
       66 
66 
     | 
    
         
             
                ]
         
     | 
| 
       67 
67 
     | 
    
         | 
| 
      
 68 
     | 
    
         
            +
                POTENTIALLY_FILE_CREATING_METHODS = [
         
     | 
| 
      
 69 
     | 
    
         
            +
                  :new,
         
     | 
| 
      
 70 
     | 
    
         
            +
                  :open
         
     | 
| 
      
 71 
     | 
    
         
            +
                ]
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
       68 
73 
     | 
    
         
             
                # @param prefix [String] The prefix for all methods that revolve around
         
     | 
| 
       69 
74 
     | 
    
         
             
                #   filenames
         
     | 
| 
       70 
     | 
    
         
            -
                # @param fallback_glob [ 
     | 
| 
       71 
     | 
    
         
            -
                #   smaller file on Errno::ENOENT, you can supply a  
     | 
| 
       72 
     | 
    
         
            -
                #   will be used with  
     | 
| 
      
 75 
     | 
    
         
            +
                # @param fallback_glob [Hash] If you want to fall back to an alphabetically
         
     | 
| 
      
 76 
     | 
    
         
            +
                #   smaller file on Errno::ENOENT, you can supply a :fallback_glob here. It
         
     | 
| 
      
 77 
     | 
    
         
            +
                #   will be used with `Dir.glob` to find all candidates (so this should match
         
     | 
| 
       73 
78 
     | 
    
         
             
                #   all prefixes)
         
     | 
| 
       74 
     | 
    
         
            -
                def initialize( 
     | 
| 
       75 
     | 
    
         
            -
                  @prefix = prefix
         
     | 
| 
       76 
     | 
    
         
            -
                  @fallback_glob = fallback_glob
         
     | 
| 
      
 79 
     | 
    
         
            +
                def initialize(opts)
         
     | 
| 
      
 80 
     | 
    
         
            +
                  @prefix = opts[:prefix] or raise ArgumentError,":prefix needed"
         
     | 
| 
      
 81 
     | 
    
         
            +
                  @fallback_glob = opts[:fallback_glob]
         
     | 
| 
      
 82 
     | 
    
         
            +
                  @subdir = opts[:use_subdirs]
         
     | 
| 
       77 
83 
     | 
    
         
             
                end
         
     | 
| 
       78 
84 
     | 
    
         | 
| 
       79 
85 
     | 
    
         
             
                # Either
         
     | 
| 
         @@ -95,7 +101,11 @@ module HistoryFile 
     | 
|
| 
       95 
101 
     | 
    
         
             
                def prefixed_filename(f)
         
     | 
| 
       96 
102 
     | 
    
         
             
                  dir  = File.dirname(f.to_s)
         
     | 
| 
       97 
103 
     | 
    
         
             
                  file = File.basename(f.to_s)
         
     | 
| 
       98 
     | 
    
         
            -
                   
     | 
| 
      
 104 
     | 
    
         
            +
                  if @subdir
         
     | 
| 
      
 105 
     | 
    
         
            +
                    File.join(dir, @prefix, file)
         
     | 
| 
      
 106 
     | 
    
         
            +
                  else
         
     | 
| 
      
 107 
     | 
    
         
            +
                    File.join(dir, "#{@prefix}-#{file}")
         
     | 
| 
      
 108 
     | 
    
         
            +
                  end
         
     | 
| 
       99 
109 
     | 
    
         
             
                end
         
     | 
| 
       100 
110 
     | 
    
         | 
| 
       101 
111 
     | 
    
         
             
                private
         
     | 
| 
         @@ -116,6 +126,7 @@ module HistoryFile 
     | 
|
| 
       116 
126 
     | 
    
         
             
                def delegate_with_patched_filename(method, *args, &block)
         
     | 
| 
       117 
127 
     | 
    
         
             
                  filename = args.slice!(0,1).first
         
     | 
| 
       118 
128 
     | 
    
         
             
                  pf = prefixed_filename(filename)
         
     | 
| 
      
 129 
     | 
    
         
            +
                  create_prefix_subdir(method, pf)
         
     | 
| 
       119 
130 
     | 
    
         
             
                  begin
         
     | 
| 
       120 
131 
     | 
    
         
             
                    File.send(method, pf, *args, &block)
         
     | 
| 
       121 
132 
     | 
    
         
             
                  rescue Errno::ENOENT => e
         
     | 
| 
         @@ -124,6 +135,16 @@ module HistoryFile 
     | 
|
| 
       124 
135 
     | 
    
         
             
                  end
         
     | 
| 
       125 
136 
     | 
    
         
             
                end
         
     | 
| 
       126 
137 
     | 
    
         | 
| 
      
 138 
     | 
    
         
            +
                # We just assume that #new and #open are used to create files and create
         
     | 
| 
      
 139 
     | 
    
         
            +
                # sub directories for prefixes when in prefix mode.
         
     | 
| 
      
 140 
     | 
    
         
            +
                def create_prefix_subdir(method, filename)
         
     | 
| 
      
 141 
     | 
    
         
            +
                  return unless @subdir
         
     | 
| 
      
 142 
     | 
    
         
            +
                  return unless POTENTIALLY_FILE_CREATING_METHODS.include?(method)
         
     | 
| 
      
 143 
     | 
    
         
            +
                  dir = File.dirname(filename.to_s)
         
     | 
| 
      
 144 
     | 
    
         
            +
                  return if Dir.exists?(dir)
         
     | 
| 
      
 145 
     | 
    
         
            +
                  Dir.mkdir(dir)
         
     | 
| 
      
 146 
     | 
    
         
            +
                end
         
     | 
| 
      
 147 
     | 
    
         
            +
             
     | 
| 
       127 
148 
     | 
    
         
             
                # Treats all arguments of the methods as files and prepends the 
         
     | 
| 
       128 
149 
     | 
    
         
             
                # history prefix
         
     | 
| 
       129 
150 
     | 
    
         
             
                def delegate_with_patched_filenames(method, *args, &block)
         
     | 
| 
         @@ -1,4 +1,4 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # Behaves like a  
     | 
| 
      
 1 
     | 
    
         
            +
            # Behaves like a `File` class and does some convenience stuff
         
     | 
| 
       2 
2 
     | 
    
         
             
            # around a {HistoryFile::FileDelegator} instance. It all
         
     | 
| 
       3 
3 
     | 
    
         
             
            # revolves about defining a time offset. If however, you want
         
     | 
| 
       4 
4 
     | 
    
         
             
            # to access different versions of a file, use it like this:
         
     | 
| 
         @@ -27,10 +27,19 @@ 
     | 
|
| 
       27 
27 
     | 
    
         
             
            #
         
     | 
| 
       28 
28 
     | 
    
         
             
            module HistoryFile
         
     | 
| 
       29 
29 
     | 
    
         | 
| 
      
 30 
     | 
    
         
            +
              def self.mode=(mode)
         
     | 
| 
      
 31 
     | 
    
         
            +
                return @mode = :filename if mode.to_sym == :filename
         
     | 
| 
      
 32 
     | 
    
         
            +
                return @mode = :subdir   if mode.to_sym == :subdir
         
     | 
| 
      
 33 
     | 
    
         
            +
                raise ArgumentError, "Mode must be :filename or :subdir"
         
     | 
| 
      
 34 
     | 
    
         
            +
              end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
       30 
36 
     | 
    
         
             
              def self.[](offset)
         
     | 
| 
       31 
37 
     | 
    
         
             
                validate_offset(offset)
         
     | 
| 
      
 38 
     | 
    
         
            +
                use_subdirs = @mode == :subdir
         
     | 
| 
       32 
39 
     | 
    
         
             
                fallback_glob = "[0-9][0-9][0-9][0-9].[0-9][0-9].[0-9][0-9]-"
         
     | 
| 
       33 
     | 
    
         
            -
                FileDelegator.new(prefix(offset), 
     | 
| 
      
 40 
     | 
    
         
            +
                FileDelegator.new(prefix: prefix(offset),
         
     | 
| 
      
 41 
     | 
    
         
            +
                                  fallback_glob: fallback_glob,
         
     | 
| 
      
 42 
     | 
    
         
            +
                                  use_subdirs: use_subdirs)
         
     | 
| 
       34 
43 
     | 
    
         
             
              end
         
     | 
| 
       35 
44 
     | 
    
         | 
| 
       36 
45 
     | 
    
         
             
              private
         
     | 
| 
         @@ -3,41 +3,81 @@ require 'date' 
     | 
|
| 
       3 
3 
     | 
    
         | 
| 
       4 
4 
     | 
    
         
             
            describe HistoryFile::FileDelegator do
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
               
     | 
| 
      
 6 
     | 
    
         
            +
              context "prefixing the filename" do
         
     | 
| 
      
 7 
     | 
    
         
            +
                let(:fd){ HistoryFile::FileDelegator.new(prefix: "some_prefix") }
         
     | 
| 
       7 
8 
     | 
    
         | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
      
 9 
     | 
    
         
            +
                after(:all) do
         
     | 
| 
      
 10 
     | 
    
         
            +
                  File.unlink("some_prefix-rspec_tmp_test.txt") rescue nil
         
     | 
| 
      
 11 
     | 
    
         
            +
                end
         
     | 
| 
       11 
12 
     | 
    
         | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
                 
     | 
| 
       15 
     | 
    
         
            -
              end
         
     | 
| 
      
 13 
     | 
    
         
            +
                before(:each) do
         
     | 
| 
      
 14 
     | 
    
         
            +
                  HistoryFile.mode = :filename
         
     | 
| 
      
 15 
     | 
    
         
            +
                end
         
     | 
| 
       16 
16 
     | 
    
         | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
      
 17 
     | 
    
         
            +
                it "raises an exception if a :prefix is missing" do
         
     | 
| 
      
 18 
     | 
    
         
            +
                  expect{
         
     | 
| 
      
 19 
     | 
    
         
            +
                    HistoryFile::FileDelegator.new({})
         
     | 
| 
      
 20 
     | 
    
         
            +
                  }.to raise_error(ArgumentError, ":prefix needed")
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                it "raises an exception if you try to set an invalid mode" do
         
     | 
| 
      
 24 
     | 
    
         
            +
                  expect{
         
     | 
| 
      
 25 
     | 
    
         
            +
                    HistoryFile.mode = :made_up
         
     | 
| 
      
 26 
     | 
    
         
            +
                  }.to raise_error(ArgumentError, "Mode must be :filename or :subdir")
         
     | 
| 
      
 27 
     | 
    
         
            +
                end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                it "delegates generic methods to File directly" do
         
     | 
| 
      
 31 
     | 
    
         
            +
                  File.should_receive(:split).with("/some/path")
         
     | 
| 
      
 32 
     | 
    
         
            +
                  fd.split("/some/path")
         
     | 
| 
      
 33 
     | 
    
         
            +
                end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                it "delegates bulk methods with all parameters prefixed" do
         
     | 
| 
      
 36 
     | 
    
         
            +
                  offset = Date.parse("1983-04-03")
         
     | 
| 
      
 37 
     | 
    
         
            +
                  File.should_receive(:unlink).with("./1983.04.03-file1", "./1983.04.03-file2")
         
     | 
| 
      
 38 
     | 
    
         
            +
                  HistoryFile[offset].unlink("file1", "file2")
         
     | 
| 
      
 39 
     | 
    
         
            +
                end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                it "instanciating new File instances works as expected" do
         
     | 
| 
      
 42 
     | 
    
         
            +
                  f = fd.new("rspec_tmp_test.txt", "w")
         
     | 
| 
      
 43 
     | 
    
         
            +
                  f.write("works")
         
     | 
| 
      
 44 
     | 
    
         
            +
                  f.close
         
     | 
| 
      
 45 
     | 
    
         
            +
                  File.read("some_prefix-rspec_tmp_test.txt").should == "works"
         
     | 
| 
      
 46 
     | 
    
         
            +
                end
         
     | 
| 
       22 
47 
     | 
    
         | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
      
 48 
     | 
    
         
            +
                it "writing into a file using a block works as expected" do
         
     | 
| 
      
 49 
     | 
    
         
            +
                  fd.open("rspec_tmp_test.txt", "w") do |file|
         
     | 
| 
      
 50 
     | 
    
         
            +
                    file.write("works")
         
     | 
| 
      
 51 
     | 
    
         
            +
                  end
         
     | 
| 
      
 52 
     | 
    
         
            +
                  File.read("some_prefix-rspec_tmp_test.txt").should == "works"
         
     | 
| 
      
 53 
     | 
    
         
            +
                end
         
     | 
| 
       28 
54 
     | 
    
         
             
              end
         
     | 
| 
       29 
55 
     | 
    
         | 
| 
       30 
     | 
    
         
            -
               
     | 
| 
       31 
     | 
    
         
            -
                 
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
      
 56 
     | 
    
         
            +
              context "prefixing with sub directories" do
         
     | 
| 
      
 57 
     | 
    
         
            +
                let(:sdfd){ HistoryFile::FileDelegator.new(prefix: "some_prefix", use_subdirs: true) }
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                it "creates the right filename with a directory as a prefix" do
         
     | 
| 
      
 60 
     | 
    
         
            +
                  sdfd.prefixed_filename('test').should == "./some_prefix/test"
         
     | 
| 
       33 
61 
     | 
    
         
             
                end
         
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
                it "attempts to create a directory" do
         
     | 
| 
      
 64 
     | 
    
         
            +
                  Dir.should_receive(:mkdir).with("./some_prefix")
         
     | 
| 
      
 65 
     | 
    
         
            +
                  File.should_receive(:open).with("./some_prefix/foo")
         
     | 
| 
      
 66 
     | 
    
         
            +
                  sdfd.open("foo") do |io|
         
     | 
| 
      
 67 
     | 
    
         
            +
                    io.write "don't"
         
     | 
| 
      
 68 
     | 
    
         
            +
                  end
         
     | 
| 
      
 69 
     | 
    
         
            +
                end
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
       35 
71 
     | 
    
         
             
              end
         
     | 
| 
       36 
72 
     | 
    
         
             
            end
         
     | 
| 
       37 
73 
     | 
    
         | 
| 
       38 
74 
     | 
    
         
             
            describe HistoryFile do
         
     | 
| 
       39 
75 
     | 
    
         | 
| 
       40 
76 
     | 
    
         
             
              context "writing and reading files" do
         
     | 
| 
      
 77 
     | 
    
         
            +
                before(:each) do
         
     | 
| 
      
 78 
     | 
    
         
            +
                  HistoryFile.mode = :filename
         
     | 
| 
      
 79 
     | 
    
         
            +
                end
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
       41 
81 
     | 
    
         
             
                it "uses a correct prefix" do
         
     | 
| 
       42 
82 
     | 
    
         
             
                  offset = Date.parse("1979-12-22")
         
     | 
| 
       43 
83 
     | 
    
         
             
                  HistoryFile[offset].open("rspec_tmp_test.txt", "w") do |file|
         
     | 
| 
         @@ -54,33 +94,39 @@ describe HistoryFile do 
     | 
|
| 
       54 
94 
     | 
    
         
             
                end
         
     | 
| 
       55 
95 
     | 
    
         
             
              end
         
     | 
| 
       56 
96 
     | 
    
         | 
| 
       57 
     | 
    
         
            -
               
     | 
| 
       58 
     | 
    
         
            -
             
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
       62 
     | 
    
         
            -
             
     | 
| 
      
 97 
     | 
    
         
            +
              # We run these tests twice
         
     | 
| 
      
 98 
     | 
    
         
            +
              [:subdir, :filename].each do |mode|
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
      
 100 
     | 
    
         
            +
                HistoryFile.mode = mode
         
     | 
| 
      
 101 
     | 
    
         
            +
                context "falling back to older files in #{mode} mode" do
         
     | 
| 
      
 102 
     | 
    
         
            +
                  before(:all) do
         
     | 
| 
      
 103 
     | 
    
         
            +
                    [1,2,3,6,7].each do |i|
         
     | 
| 
      
 104 
     | 
    
         
            +
                      date = DateTime.now - i
         
     | 
| 
      
 105 
     | 
    
         
            +
                      HistoryFile[date].open("ht.txt", "w") do |file|
         
     | 
| 
      
 106 
     | 
    
         
            +
                        file.write "Day #{i} #{mode}"
         
     | 
| 
      
 107 
     | 
    
         
            +
                      end
         
     | 
| 
       63 
108 
     | 
    
         
             
                    end
         
     | 
| 
       64 
109 
     | 
    
         
             
                  end
         
     | 
| 
       65 
     | 
    
         
            -
                end
         
     | 
| 
       66 
110 
     | 
    
         | 
| 
       67 
     | 
    
         
            -
             
     | 
| 
       68 
     | 
    
         
            -
             
     | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
       70 
     | 
    
         
            -
             
     | 
| 
      
 111 
     | 
    
         
            +
                  after(:all) do
         
     | 
| 
      
 112 
     | 
    
         
            +
                    [1,2,3,6,7].each do |i|
         
     | 
| 
      
 113 
     | 
    
         
            +
                      date = DateTime.now - i
         
     | 
| 
      
 114 
     | 
    
         
            +
                      HistoryFile[date].unlink("ht.txt")
         
     | 
| 
      
 115 
     | 
    
         
            +
                    end
         
     | 
| 
      
 116 
     | 
    
         
            +
                    Dir.unlink("some_prefix") rescue nil
         
     | 
| 
       71 
117 
     | 
    
         
             
                  end
         
     | 
| 
       72 
     | 
    
         
            -
                end
         
     | 
| 
       73 
118 
     | 
    
         | 
| 
       74 
     | 
    
         
            -
             
     | 
| 
       75 
     | 
    
         
            -
             
     | 
| 
       76 
     | 
    
         
            -
             
     | 
| 
       77 
     | 
    
         
            -
             
     | 
| 
      
 119 
     | 
    
         
            +
                  it "to yesterday's file" do
         
     | 
| 
      
 120 
     | 
    
         
            +
                    date = DateTime.now - 4
         
     | 
| 
      
 121 
     | 
    
         
            +
                    HistoryFile[date].read("ht.txt").should == "Day 6 #{mode}"
         
     | 
| 
      
 122 
     | 
    
         
            +
                  end
         
     | 
| 
       78 
123 
     | 
    
         | 
| 
       79 
     | 
    
         
            -
             
     | 
| 
       80 
     | 
    
         
            -
             
     | 
| 
       81 
     | 
    
         
            -
             
     | 
| 
       82 
     | 
    
         
            -
             
     | 
| 
       83 
     | 
    
         
            -
             
     | 
| 
      
 124 
     | 
    
         
            +
                  it "to an error if nothing older exists" do
         
     | 
| 
      
 125 
     | 
    
         
            +
                    expect{
         
     | 
| 
      
 126 
     | 
    
         
            +
                      date = DateTime.now - 8
         
     | 
| 
      
 127 
     | 
    
         
            +
                      HistoryFile[date].read("ht.txt")
         
     | 
| 
      
 128 
     | 
    
         
            +
                    }.to raise_error(Errno::ENOENT)
         
     | 
| 
      
 129 
     | 
    
         
            +
                  end
         
     | 
| 
       84 
130 
     | 
    
         
             
                end
         
     | 
| 
       85 
131 
     | 
    
         
             
              end
         
     | 
| 
       86 
132 
     | 
    
         
             
            end
         
     | 
    
        data/spec/spec_helper.rb
    CHANGED
    
    | 
         @@ -1,56 +1,46 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'rubygems'
         
     | 
| 
       2 
     | 
    
         
            -
            require 'spork'
         
     | 
| 
       3 
2 
     | 
    
         
             
            require 'simplecov'
         
     | 
| 
       4 
3 
     | 
    
         
             
            SimpleCov.start
         
     | 
| 
       5 
4 
     | 
    
         
             
            require 'bundler'
         
     | 
| 
       6 
5 
     | 
    
         
             
            Bundler.require
         
     | 
| 
       7 
6 
     | 
    
         | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
      
 7 
     | 
    
         
            +
            # This file is copied to spec/ when you run 'rails generate rspec:install'
         
     | 
| 
      
 8 
     | 
    
         
            +
            ENV["RAILS_ENV"] ||= 'test'
         
     | 
| 
      
 9 
     | 
    
         
            +
            # require File.expand_path("../../config/environment", __FILE__)
         
     | 
| 
      
 10 
     | 
    
         
            +
            #require 'capybara/poltergeist'
         
     | 
| 
       12 
11 
     | 
    
         | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
              #require 'capybara/poltergeist'
         
     | 
| 
      
 12 
     | 
    
         
            +
            # Requires supporting ruby files with custom matchers and macros, etc,
         
     | 
| 
      
 13 
     | 
    
         
            +
            # in spec/support/ and its subdirectories.
         
     | 
| 
      
 14 
     | 
    
         
            +
            Dir[File.expand_path("../../spec/support/**/*.rb", __FILE__)].each {|f| require f}
         
     | 
| 
       17 
15 
     | 
    
         | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
              #  
     | 
| 
       20 
     | 
    
         
            -
               
     | 
| 
      
 16 
     | 
    
         
            +
            RSpec.configure do |config|
         
     | 
| 
      
 17 
     | 
    
         
            +
              # == Mock Framework
         
     | 
| 
      
 18 
     | 
    
         
            +
              #
         
     | 
| 
      
 19 
     | 
    
         
            +
              # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
         
     | 
| 
      
 20 
     | 
    
         
            +
              #
         
     | 
| 
      
 21 
     | 
    
         
            +
              # config.mock_with :mocha
         
     | 
| 
      
 22 
     | 
    
         
            +
              # config.mock_with :flexmock
         
     | 
| 
      
 23 
     | 
    
         
            +
              # config.mock_with :rr
         
     | 
| 
      
 24 
     | 
    
         
            +
              config.mock_with :rspec
         
     | 
| 
       21 
25 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
               
     | 
| 
       23 
     | 
    
         
            -
                # == Mock Framework
         
     | 
| 
       24 
     | 
    
         
            -
                #
         
     | 
| 
       25 
     | 
    
         
            -
                # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
         
     | 
| 
       26 
     | 
    
         
            -
                #
         
     | 
| 
       27 
     | 
    
         
            -
                # config.mock_with :mocha
         
     | 
| 
       28 
     | 
    
         
            -
                # config.mock_with :flexmock
         
     | 
| 
       29 
     | 
    
         
            -
                # config.mock_with :rr
         
     | 
| 
       30 
     | 
    
         
            -
                config.mock_with :rspec
         
     | 
| 
      
 26 
     | 
    
         
            +
              # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
         
     | 
| 
       31 
27 
     | 
    
         | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
              end
         
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
              module TestResponseExtensions
         
     | 
| 
       37 
     | 
    
         
            -
                def json_body
         
     | 
| 
       38 
     | 
    
         
            -
                  JSON.parse(self.body)
         
     | 
| 
       39 
     | 
    
         
            -
                end
         
     | 
| 
      
 28 
     | 
    
         
            +
            end
         
     | 
| 
       40 
29 
     | 
    
         | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
                 
     | 
| 
      
 30 
     | 
    
         
            +
            module TestResponseExtensions
         
     | 
| 
      
 31 
     | 
    
         
            +
              def json_body
         
     | 
| 
      
 32 
     | 
    
         
            +
                JSON.parse(self.body)
         
     | 
| 
       44 
33 
     | 
    
         
             
              end
         
     | 
| 
       45 
34 
     | 
    
         | 
| 
       46 
     | 
    
         
            -
              def  
     | 
| 
       47 
     | 
    
         
            -
                 
     | 
| 
      
 35 
     | 
    
         
            +
              def unauthorized?
         
     | 
| 
      
 36 
     | 
    
         
            +
                code.to_i == 401
         
     | 
| 
       48 
37 
     | 
    
         
             
              end
         
     | 
| 
      
 38 
     | 
    
         
            +
            end
         
     | 
| 
       49 
39 
     | 
    
         | 
| 
      
 40 
     | 
    
         
            +
            def expect_id_and_return(id, ret_val)
         
     | 
| 
      
 41 
     | 
    
         
            +
              lambda { |id| id.to_s.should == id.to_s; ret_val }
         
     | 
| 
       50 
42 
     | 
    
         
             
            end
         
     | 
| 
       51 
43 
     | 
    
         | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
       52 
45 
     | 
    
         
             
            require File.expand_path("../../lib/history_file/", __FILE__)
         
     | 
| 
       53 
46 
     | 
    
         | 
| 
       54 
     | 
    
         
            -
            # Spork.each_run do
         
     | 
| 
       55 
     | 
    
         
            -
            #   FactoryGirl.reload
         
     | 
| 
       56 
     | 
    
         
            -
            # end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: history_file
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.2.0
         
     | 
| 
       5 
5 
     | 
    
         
             
              prerelease: 
         
     | 
| 
       6 
6 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       7 
7 
     | 
    
         
             
            authors:
         
     | 
| 
         @@ -9,8 +9,24 @@ authors: 
     | 
|
| 
       9 
9 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       10 
10 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       11 
11 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       12 
     | 
    
         
            -
            date: 2012-11- 
     | 
| 
      
 12 
     | 
    
         
            +
            date: 2012-11-21 00:00:00.000000000 Z
         
     | 
| 
       13 
13 
     | 
    
         
             
            dependencies:
         
     | 
| 
      
 14 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 15 
     | 
    
         
            +
              name: redcarpet
         
     | 
| 
      
 16 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 17 
     | 
    
         
            +
                none: false
         
     | 
| 
      
 18 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 19 
     | 
    
         
            +
                - - ! '>='
         
     | 
| 
      
 20 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 21 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 22 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 23 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 24 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 25 
     | 
    
         
            +
                none: false
         
     | 
| 
      
 26 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 27 
     | 
    
         
            +
                - - ! '>='
         
     | 
| 
      
 28 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 29 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
       14 
30 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       15 
31 
     | 
    
         
             
              name: shoulda
         
     | 
| 
       16 
32 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -203,22 +219,6 @@ dependencies: 
     | 
|
| 
       203 
219 
     | 
    
         
             
                - - ! '>='
         
     | 
| 
       204 
220 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       205 
221 
     | 
    
         
             
                    version: '0'
         
     | 
| 
       206 
     | 
    
         
            -
            - !ruby/object:Gem::Dependency
         
     | 
| 
       207 
     | 
    
         
            -
              name: guard-spork
         
     | 
| 
       208 
     | 
    
         
            -
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       209 
     | 
    
         
            -
                none: false
         
     | 
| 
       210 
     | 
    
         
            -
                requirements:
         
     | 
| 
       211 
     | 
    
         
            -
                - - ! '>='
         
     | 
| 
       212 
     | 
    
         
            -
                  - !ruby/object:Gem::Version
         
     | 
| 
       213 
     | 
    
         
            -
                    version: '0'
         
     | 
| 
       214 
     | 
    
         
            -
              type: :development
         
     | 
| 
       215 
     | 
    
         
            -
              prerelease: false
         
     | 
| 
       216 
     | 
    
         
            -
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       217 
     | 
    
         
            -
                none: false
         
     | 
| 
       218 
     | 
    
         
            -
                requirements:
         
     | 
| 
       219 
     | 
    
         
            -
                - - ! '>='
         
     | 
| 
       220 
     | 
    
         
            -
                  - !ruby/object:Gem::Version
         
     | 
| 
       221 
     | 
    
         
            -
                    version: '0'
         
     | 
| 
       222 
222 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       223 
223 
     | 
    
         
             
              name: rb-fsevent
         
     | 
| 
       224 
224 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -242,15 +242,17 @@ executables: [] 
     | 
|
| 
       242 
242 
     | 
    
         
             
            extensions: []
         
     | 
| 
       243 
243 
     | 
    
         
             
            extra_rdoc_files:
         
     | 
| 
       244 
244 
     | 
    
         
             
            - LICENSE.txt
         
     | 
| 
       245 
     | 
    
         
            -
            - README. 
     | 
| 
      
 245 
     | 
    
         
            +
            - README.markdown
         
     | 
| 
       246 
246 
     | 
    
         
             
            files:
         
     | 
| 
       247 
247 
     | 
    
         
             
            - .document
         
     | 
| 
       248 
248 
     | 
    
         
             
            - .rvmrc
         
     | 
| 
      
 249 
     | 
    
         
            +
            - .travis.yml
         
     | 
| 
      
 250 
     | 
    
         
            +
            - CHANGELOG.markdown
         
     | 
| 
       249 
251 
     | 
    
         
             
            - Gemfile
         
     | 
| 
       250 
252 
     | 
    
         
             
            - Gemfile.lock
         
     | 
| 
       251 
253 
     | 
    
         
             
            - Guardfile
         
     | 
| 
       252 
254 
     | 
    
         
             
            - LICENSE.txt
         
     | 
| 
       253 
     | 
    
         
            -
            - README. 
     | 
| 
      
 255 
     | 
    
         
            +
            - README.markdown
         
     | 
| 
       254 
256 
     | 
    
         
             
            - Rakefile
         
     | 
| 
       255 
257 
     | 
    
         
             
            - VERSION
         
     | 
| 
       256 
258 
     | 
    
         
             
            - history_file.gemspec
         
     | 
| 
         @@ -274,7 +276,7 @@ required_ruby_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       274 
276 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       275 
277 
     | 
    
         
             
                  segments:
         
     | 
| 
       276 
278 
     | 
    
         
             
                  - 0
         
     | 
| 
       277 
     | 
    
         
            -
                  hash:  
     | 
| 
      
 279 
     | 
    
         
            +
                  hash: -4078239623642015702
         
     | 
| 
       278 
280 
     | 
    
         
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
       279 
281 
     | 
    
         
             
              none: false
         
     | 
| 
       280 
282 
     | 
    
         
             
              requirements:
         
     | 
    
        data/README.rdoc
    DELETED
    
    | 
         @@ -1,32 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            HistoryFile
         
     | 
| 
       2 
     | 
    
         
            -
            ===========
         
     | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
            Behaves like a {File} class and does some convenience stuff
         
     | 
| 
       5 
     | 
    
         
            -
            around a {HistoryFile::FileDelegator} instance. It all
         
     | 
| 
       6 
     | 
    
         
            -
            revolves about defining a time offset. If however, you want
         
     | 
| 
       7 
     | 
    
         
            -
            to access different versions of a file, use it like this:
         
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
            ```ruby
         
     | 
| 
       10 
     | 
    
         
            -
                > f = HistoryFile[1.day.ago].new("/tmp/foo.txt", "w")
         
     | 
| 
       11 
     | 
    
         
            -
                => #<File:/tmp/2012.11.02-foo.txt>
         
     | 
| 
       12 
     | 
    
         
            -
            ```
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
            The returned {HistoryFile::FileDelegator} object supports all
         
     | 
| 
       15 
     | 
    
         
            -
            methods that File has, but adds a date prefix to those methods
         
     | 
| 
       16 
     | 
    
         
            -
            that revolve around a single file (reading, writing, etc.)
         
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
            If a file for a given date is not available, {HistoryFile} falls
         
     | 
| 
       19 
     | 
    
         
            -
            back to the freshest file that is older than the given date.
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
            ```ruby
         
     | 
| 
       22 
     | 
    
         
            -
                > f = HistoryFile[3.days.ago].new("test.txt", "w")
         
     | 
| 
       23 
     | 
    
         
            -
                => #<File:./2012.11.12-test.txt>
         
     | 
| 
       24 
     | 
    
         
            -
                > f.write("I am old")
         
     | 
| 
       25 
     | 
    
         
            -
                => 8
         
     | 
| 
       26 
     | 
    
         
            -
                > f.close
         
     | 
| 
       27 
     | 
    
         
            -
                => nil
         
     | 
| 
       28 
     | 
    
         
            -
                > HistoryFile[Date.today].read("test.txt")
         
     | 
| 
       29 
     | 
    
         
            -
                => "I am old"
         
     | 
| 
       30 
     | 
    
         
            -
                > HistoryFile[10.days.ago].read("test.txt")
         
     | 
| 
       31 
     | 
    
         
            -
                Errno::ENOENT: No such file or directory - ./2012.11.05-test.txt
         
     | 
| 
       32 
     | 
    
         
            -
            ```
         
     |