pleasant_path 1.2.0 → 1.3.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.
- checksums.yaml +4 -4
 - data/CHANGELOG.md +26 -9
 - data/README.md +11 -11
 - data/lib/pleasant_path.rb +1 -1
 - data/lib/pleasant_path/enumerable.rb +43 -0
 - data/lib/pleasant_path/file.rb +28 -25
 - data/lib/pleasant_path/io.rb +22 -21
 - data/lib/pleasant_path/json/object.rb +12 -12
 - data/lib/pleasant_path/json/pathname.rb +24 -27
 - data/lib/pleasant_path/pathname.rb +745 -221
 - data/lib/pleasant_path/string.rb +31 -19
 - data/lib/pleasant_path/version.rb +1 -1
 - data/lib/pleasant_path/yaml/object.rb +9 -5
 - data/lib/pleasant_path/yaml/pathname.rb +18 -11
 - metadata +4 -5
 - data/lib/pleasant_path/array.rb +0 -37
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: b6e3e6a96f3381618fe73ebb4d09a95cd607f22939398eb4352da162fed9581e
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 995c964b867b1632d22bf58da748afadcb0a2d3824680a1c8fdcbf69fd494d1e
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 3c0d567cbb4c9579685a4f1923b74787321d03f4118d46af4c863272ec1ef63af48e42c0cd17a6b431043bc43a32d621c810bbae9c05ca9a4933e2d8feecff31
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 10d3683e71e7dc881dde05622bdb1d7d53c83ce853f6376f9dc48bb53cc1150a1f67bf412bb80d7ff8717f1aaf03693c78c64d865c4c8820861b5149ae9fcdad
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -1,17 +1,34 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ## 1.3.0
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            * Add `Pathname#find_dirs`
         
     | 
| 
      
 4 
     | 
    
         
            +
            * Add `Pathname#find_files`
         
     | 
| 
      
 5 
     | 
    
         
            +
            * Add `Pathname#make_file`
         
     | 
| 
      
 6 
     | 
    
         
            +
            * Add `Pathname#available_name`
         
     | 
| 
      
 7 
     | 
    
         
            +
            * Add `Pathname#move_as`
         
     | 
| 
      
 8 
     | 
    
         
            +
            * Add `Pathname#copy_as`
         
     | 
| 
      
 9 
     | 
    
         
            +
            * Add `eol` parameter to line-oriented methods (`Pathname#read_lines`,
         
     | 
| 
      
 10 
     | 
    
         
            +
              `Pathname#write_lines`, `Pathname#append_lines`, etc)
         
     | 
| 
      
 11 
     | 
    
         
            +
            * Move Array methods to Enumerable
         
     | 
| 
      
 12 
     | 
    
         
            +
            * Use `JSON.dump_default_options` and `JSON.load_default_options` in
         
     | 
| 
      
 13 
     | 
    
         
            +
              JSON-related API
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
       1 
16 
     | 
    
         
             
            ## 1.2.0
         
     | 
| 
       2 
17 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            *  
     | 
| 
       4 
     | 
    
         
            -
            *  
     | 
| 
       5 
     | 
    
         
            -
            *  
     | 
| 
      
 18 
     | 
    
         
            +
            * Add `Pathname#existence`
         
     | 
| 
      
 19 
     | 
    
         
            +
            * Add `Pathname#chdir`
         
     | 
| 
      
 20 
     | 
    
         
            +
            * Fix `Object#write_to_yaml` to make parent directories as necessary
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
       6 
22 
     | 
    
         | 
| 
       7 
23 
     | 
    
         
             
            ## 1.1.0
         
     | 
| 
       8 
24 
     | 
    
         | 
| 
       9 
     | 
    
         
            -
            *  
     | 
| 
       10 
     | 
    
         
            -
            *  
     | 
| 
       11 
     | 
    
         
            -
            *  
     | 
| 
       12 
     | 
    
         
            -
            *  
     | 
| 
       13 
     | 
    
         
            -
            *  
     | 
| 
       14 
     | 
    
         
            -
            *  
     | 
| 
      
 25 
     | 
    
         
            +
            * Add `Pathname#copy` and `Pathname#copy_into`
         
     | 
| 
      
 26 
     | 
    
         
            +
            * Add `Pathname#rename_basename` and `Pathname#rename_extname`
         
     | 
| 
      
 27 
     | 
    
         
            +
            * Add `File.common_path` and `Pathname#common_path`
         
     | 
| 
      
 28 
     | 
    
         
            +
            * Add `Pathname::NULL`
         
     | 
| 
      
 29 
     | 
    
         
            +
            * Add JSON-related and YAML-related APIs
         
     | 
| 
      
 30 
     | 
    
         
            +
            * Fix `File.edit_text` and `File.edit_lines` to properly truncate
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
       15 
32 
     | 
    
         | 
| 
       16 
33 
     | 
    
         
             
            ## 1.0.0
         
     | 
| 
       17 
34 
     | 
    
         | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -10,10 +10,8 @@ objects.  See API listing below, or browse the [full documentation]. 
     | 
|
| 
       10 
10 
     | 
    
         
             
            ## Examples
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
12 
     | 
    
         
             
            ```ruby
         
     | 
| 
       13 
     | 
    
         
            -
            #  
     | 
| 
       14 
     | 
    
         
            -
            " 
     | 
| 
       15 
     | 
    
         
            -
              log.read_lines.grep(/^ERROR /).append_to_file("errors.txt")
         
     | 
| 
       16 
     | 
    
         
            -
            end
         
     | 
| 
      
 13 
     | 
    
         
            +
            # Pluck lines from a file
         
     | 
| 
      
 14 
     | 
    
         
            +
            "log.txt".path.read_lines.grep(/^ERROR /).append_to_file("errors.txt")
         
     | 
| 
       17 
15 
     | 
    
         | 
| 
       18 
16 
     | 
    
         
             
            # Dedup lines in a file
         
     | 
| 
       19 
17 
     | 
    
         
             
            "names.txt".path.edit_lines(&:uniq)
         
     | 
| 
         @@ -30,13 +28,14 @@ The following methods are available: 
     | 
|
| 
       30 
28 
     | 
    
         
             
              - [#append_file](http://www.rubydoc.info/gems/pleasant_path/Pathname:append_file)
         
     | 
| 
       31 
29 
     | 
    
         
             
              - [#append_lines](http://www.rubydoc.info/gems/pleasant_path/Pathname:append_lines)
         
     | 
| 
       32 
30 
     | 
    
         
             
              - [#append_text](http://www.rubydoc.info/gems/pleasant_path/Pathname:append_text)
         
     | 
| 
      
 31 
     | 
    
         
            +
              - [#available_name](http://www.rubydoc.info/gems/pleasant_path/Pathname:available_name)
         
     | 
| 
       33 
32 
     | 
    
         
             
              - [#chdir](http://www.rubydoc.info/gems/pleasant_path/Pathname:chdir)
         
     | 
| 
       34 
33 
     | 
    
         
             
              - [#common_path](http://www.rubydoc.info/gems/pleasant_path/Pathname:common_path)
         
     | 
| 
       35 
34 
     | 
    
         
             
              - [#copy](http://www.rubydoc.info/gems/pleasant_path/Pathname:copy)
         
     | 
| 
      
 35 
     | 
    
         
            +
              - [#copy_as](http://www.rubydoc.info/gems/pleasant_path/Pathname:copy_as)
         
     | 
| 
       36 
36 
     | 
    
         
             
              - [#copy_into](http://www.rubydoc.info/gems/pleasant_path/Pathname:copy_into)
         
     | 
| 
       37 
37 
     | 
    
         
             
              - [#delete!](http://www.rubydoc.info/gems/pleasant_path/Pathname:delete%21)
         
     | 
| 
       38 
38 
     | 
    
         
             
              - [#dir?](http://www.rubydoc.info/gems/pleasant_path/Pathname:dir%3F)
         
     | 
| 
       39 
     | 
    
         
            -
              - [#dir_empty?](http://www.rubydoc.info/gems/pleasant_path/Pathname:dir_empty%3F)
         
     | 
| 
       40 
39 
     | 
    
         
             
              - [#dirs](http://www.rubydoc.info/gems/pleasant_path/Pathname:dirs)
         
     | 
| 
       41 
40 
     | 
    
         
             
              - [#dirs_r](http://www.rubydoc.info/gems/pleasant_path/Pathname:dirs_r)
         
     | 
| 
       42 
41 
     | 
    
         
             
              - [#edit_lines](http://www.rubydoc.info/gems/pleasant_path/Pathname:edit_lines)
         
     | 
| 
         @@ -44,29 +43,30 @@ The following methods are available: 
     | 
|
| 
       44 
43 
     | 
    
         
             
              - [#existence](http://www.rubydoc.info/gems/pleasant_path/Pathname:existence)
         
     | 
| 
       45 
44 
     | 
    
         
             
              - [#files](http://www.rubydoc.info/gems/pleasant_path/Pathname:files)
         
     | 
| 
       46 
45 
     | 
    
         
             
              - [#files_r](http://www.rubydoc.info/gems/pleasant_path/Pathname:files_r)
         
     | 
| 
      
 46 
     | 
    
         
            +
              - [#find_dirs](http://www.rubydoc.info/gems/pleasant_path/Pathname:find_dirs)
         
     | 
| 
      
 47 
     | 
    
         
            +
              - [#find_files](http://www.rubydoc.info/gems/pleasant_path/Pathname:find_files)
         
     | 
| 
       47 
48 
     | 
    
         
             
              - [#make_dir](http://www.rubydoc.info/gems/pleasant_path/Pathname:make_dir)
         
     | 
| 
       48 
49 
     | 
    
         
             
              - [#make_dirname](http://www.rubydoc.info/gems/pleasant_path/Pathname:make_dirname)
         
     | 
| 
      
 50 
     | 
    
         
            +
              - [#make_file](http://www.rubydoc.info/gems/pleasant_path/Pathname:make_file)
         
     | 
| 
       49 
51 
     | 
    
         
             
              - [#move](http://www.rubydoc.info/gems/pleasant_path/Pathname:move)
         
     | 
| 
      
 52 
     | 
    
         
            +
              - [#move_as](http://www.rubydoc.info/gems/pleasant_path/Pathname:move_as)
         
     | 
| 
       50 
53 
     | 
    
         
             
              - [#move_into](http://www.rubydoc.info/gems/pleasant_path/Pathname:move_into)
         
     | 
| 
       51 
54 
     | 
    
         
             
              - [#parentname](http://www.rubydoc.info/gems/pleasant_path/Pathname:parentname)
         
     | 
| 
       52 
55 
     | 
    
         
             
              - [#read_lines](http://www.rubydoc.info/gems/pleasant_path/Pathname:read_lines)
         
     | 
| 
       53 
56 
     | 
    
         
             
              - [#rename_basename](http://www.rubydoc.info/gems/pleasant_path/Pathname:rename_basename)
         
     | 
| 
       54 
57 
     | 
    
         
             
              - [#rename_extname](http://www.rubydoc.info/gems/pleasant_path/Pathname:rename_extname)
         
     | 
| 
       55 
58 
     | 
    
         
             
              - [#to_pathname](http://www.rubydoc.info/gems/pleasant_path/Pathname:to_pathname)
         
     | 
| 
       56 
     | 
    
         
            -
              - [#touch_file](http://www.rubydoc.info/gems/pleasant_path/Pathname:touch_file)
         
     | 
| 
       57 
59 
     | 
    
         
             
              - [#write_lines](http://www.rubydoc.info/gems/pleasant_path/Pathname:write_lines)
         
     | 
| 
       58 
60 
     | 
    
         
             
              - [#write_text](http://www.rubydoc.info/gems/pleasant_path/Pathname:write_text)
         
     | 
| 
       59 
61 
     | 
    
         
             
            - [String](http://www.rubydoc.info/gems/pleasant_path/String)
         
     | 
| 
       60 
62 
     | 
    
         
             
              - [#/](http://www.rubydoc.info/gems/pleasant_path/String:%2F)
         
     | 
| 
       61 
     | 
    
         
            -
              - [#^](http://www.rubydoc.info/gems/pleasant_path/String:%5E)
         
     | 
| 
       62 
63 
     | 
    
         
             
              - [#append_to_file](http://www.rubydoc.info/gems/pleasant_path/String:append_to_file)
         
     | 
| 
       63 
     | 
    
         
            -
              - [#glob](http://www.rubydoc.info/gems/pleasant_path/String:glob)
         
     | 
| 
       64 
64 
     | 
    
         
             
              - [#path](http://www.rubydoc.info/gems/pleasant_path/String:path)
         
     | 
| 
       65 
65 
     | 
    
         
             
              - [#to_pathname](http://www.rubydoc.info/gems/pleasant_path/String:to_pathname)
         
     | 
| 
       66 
66 
     | 
    
         
             
              - [#write_to_file](http://www.rubydoc.info/gems/pleasant_path/String:write_to_file)
         
     | 
| 
       67 
     | 
    
         
            -
            - [ 
     | 
| 
       68 
     | 
    
         
            -
              - [#append_to_file](http://www.rubydoc.info/gems/pleasant_path/ 
     | 
| 
       69 
     | 
    
         
            -
              - [#write_to_file](http://www.rubydoc.info/gems/pleasant_path/ 
     | 
| 
      
 67 
     | 
    
         
            +
            - [Enumerable](http://www.rubydoc.info/gems/pleasant_path/Enumerable)
         
     | 
| 
      
 68 
     | 
    
         
            +
              - [#append_to_file](http://www.rubydoc.info/gems/pleasant_path/Enumerable:append_to_file)
         
     | 
| 
      
 69 
     | 
    
         
            +
              - [#write_to_file](http://www.rubydoc.info/gems/pleasant_path/Enumerable:write_to_file)
         
     | 
| 
       70 
70 
     | 
    
         
             
            - [File](http://www.rubydoc.info/gems/pleasant_path/File)
         
     | 
| 
       71 
71 
     | 
    
         
             
              - [.common_path](http://www.rubydoc.info/gems/pleasant_path/File.common_path)
         
     | 
| 
       72 
72 
     | 
    
         
             
              - [.edit_lines](http://www.rubydoc.info/gems/pleasant_path/File.edit_lines)
         
     | 
    
        data/lib/pleasant_path.rb
    CHANGED
    
    | 
         @@ -1,6 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require "pathname"
         
     | 
| 
       2 
2 
     | 
    
         
             
            require_relative "pleasant_path/version"
         
     | 
| 
       3 
     | 
    
         
            -
            require_relative "pleasant_path/ 
     | 
| 
      
 3 
     | 
    
         
            +
            require_relative "pleasant_path/enumerable"
         
     | 
| 
       4 
4 
     | 
    
         
             
            require_relative "pleasant_path/file"
         
     | 
| 
       5 
5 
     | 
    
         
             
            require_relative "pleasant_path/io"
         
     | 
| 
       6 
6 
     | 
    
         
             
            require_relative "pleasant_path/pathname"
         
     | 
| 
         @@ -0,0 +1,43 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Enumerable
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
              # Writes each object in the Enumerable as a string plus end-of-line
         
     | 
| 
      
 4 
     | 
    
         
            +
              # (EOL) characters to the specified +file+, overwriting the file if it
         
     | 
| 
      
 5 
     | 
    
         
            +
              # exists.  Creates the file if it does not exist, including any
         
     | 
| 
      
 6 
     | 
    
         
            +
              # necessary parent directories.  Returns the Enumerable.
         
     | 
| 
      
 7 
     | 
    
         
            +
              #
         
     | 
| 
      
 8 
     | 
    
         
            +
              # @see Pathname#write_lines
         
     | 
| 
      
 9 
     | 
    
         
            +
              #
         
     | 
| 
      
 10 
     | 
    
         
            +
              # @example
         
     | 
| 
      
 11 
     | 
    
         
            +
              #   [:one, :two].write_to_file("out.txt")  # == [:one, :two]
         
     | 
| 
      
 12 
     | 
    
         
            +
              #   File.read("out.txt")                   # == "one\ntwo\n"
         
     | 
| 
      
 13 
     | 
    
         
            +
              #
         
     | 
| 
      
 14 
     | 
    
         
            +
              # @param file [String, Pathname]
         
     | 
| 
      
 15 
     | 
    
         
            +
              # @param eol [String]
         
     | 
| 
      
 16 
     | 
    
         
            +
              # @return [self]
         
     | 
| 
      
 17 
     | 
    
         
            +
              def write_to_file(file, eol: $/)
         
     | 
| 
      
 18 
     | 
    
         
            +
                file.to_pathname.write_lines(self, eol: eol)
         
     | 
| 
      
 19 
     | 
    
         
            +
                self
         
     | 
| 
      
 20 
     | 
    
         
            +
              end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
              # Appends each object in the Enumerable as a string plus end-of-line
         
     | 
| 
      
 23 
     | 
    
         
            +
              # (EOL) characters to the specified +file+.  Creates the file if it
         
     | 
| 
      
 24 
     | 
    
         
            +
              # does not exist, including any necessary parent directories.  Returns
         
     | 
| 
      
 25 
     | 
    
         
            +
              # the Enumerable.
         
     | 
| 
      
 26 
     | 
    
         
            +
              #
         
     | 
| 
      
 27 
     | 
    
         
            +
              # @see Pathname#append_lines
         
     | 
| 
      
 28 
     | 
    
         
            +
              #
         
     | 
| 
      
 29 
     | 
    
         
            +
              # @example
         
     | 
| 
      
 30 
     | 
    
         
            +
              #   [:one, :two].append_to_file("out.txt")     # == [:one, :two]
         
     | 
| 
      
 31 
     | 
    
         
            +
              #   File.read("out.txt")                       # == "one\ntwo\n"
         
     | 
| 
      
 32 
     | 
    
         
            +
              #   [:three, :four].append_to_file("out.txt")  # == [:three, :four]
         
     | 
| 
      
 33 
     | 
    
         
            +
              #   File.read("out.txt")                       # == "one\ntwo\nthree\nfour\n"
         
     | 
| 
      
 34 
     | 
    
         
            +
              #
         
     | 
| 
      
 35 
     | 
    
         
            +
              # @param file [String, Pathname]
         
     | 
| 
      
 36 
     | 
    
         
            +
              # @param eol [String]
         
     | 
| 
      
 37 
     | 
    
         
            +
              # @return [self]
         
     | 
| 
      
 38 
     | 
    
         
            +
              def append_to_file(file, eol: $/)
         
     | 
| 
      
 39 
     | 
    
         
            +
                file.to_pathname.append_lines(self, eol: eol)
         
     | 
| 
      
 40 
     | 
    
         
            +
                self
         
     | 
| 
      
 41 
     | 
    
         
            +
              end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/pleasant_path/file.rb
    CHANGED
    
    | 
         @@ -1,11 +1,13 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            class File
         
     | 
| 
       2 
4 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
              #  
     | 
| 
      
 5 
     | 
    
         
            +
              # Returns the longest path that all of +paths+ have in common.
         
     | 
| 
       4 
6 
     | 
    
         
             
              #
         
     | 
| 
       5 
7 
     | 
    
         
             
              # @example
         
     | 
| 
       6 
8 
     | 
    
         
             
              #   File.common_path(["a/b/x", "a/b/y", "a/b/z"])  # == "a/b/"
         
     | 
| 
       7 
     | 
    
         
            -
              #   File.common_path(["a/ 
     | 
| 
       8 
     | 
    
         
            -
              #   File.common_path(["a/b/x", "a/b 
     | 
| 
      
 9 
     | 
    
         
            +
              #   File.common_path(["a/bx", "a/by", "a/bz"])     # == "a/"
         
     | 
| 
      
 10 
     | 
    
         
            +
              #   File.common_path(["a/b/x", "a/b", "a"])        # == "a"
         
     | 
| 
       9 
11 
     | 
    
         
             
              #
         
     | 
| 
       10 
12 
     | 
    
         
             
              # @param paths [Enumerable<String>]
         
     | 
| 
       11 
13 
     | 
    
         
             
              # @return [String]
         
     | 
| 
         @@ -15,18 +17,18 @@ class File 
     | 
|
| 
       15 
17 
     | 
    
         
             
                i = 0
         
     | 
| 
       16 
18 
     | 
    
         
             
                last = -1
         
     | 
| 
       17 
19 
     | 
    
         
             
                while i < short.length && short[i] == long[i]
         
     | 
| 
       18 
     | 
    
         
            -
                  last = i if short[i] == "/" 
     | 
| 
      
 20 
     | 
    
         
            +
                  last = i if short[i] == "/"
         
     | 
| 
       19 
21 
     | 
    
         
             
                  i += 1
         
     | 
| 
       20 
22 
     | 
    
         
             
                end
         
     | 
| 
       21 
23 
     | 
    
         
             
                short[0, i == short.length ? i : (last + 1)]
         
     | 
| 
       22 
24 
     | 
    
         
             
              end
         
     | 
| 
       23 
25 
     | 
    
         | 
| 
       24 
     | 
    
         
            -
              # Reads  
     | 
| 
       25 
     | 
    
         
            -
              #  
     | 
| 
       26 
     | 
    
         
            -
              # of the block back to the file, overwriting 
     | 
| 
       27 
     | 
    
         
            -
              # Returns the  
     | 
| 
      
 26 
     | 
    
         
            +
              # Reads the entire contents of the file indicated by +filename+ as a
         
     | 
| 
      
 27 
     | 
    
         
            +
              # string, and yields that string to the given block for editing.
         
     | 
| 
      
 28 
     | 
    
         
            +
              # Writes the return value of the block back to the file, overwriting
         
     | 
| 
      
 29 
     | 
    
         
            +
              # previous contents.  Returns the return value of the block.
         
     | 
| 
       28 
30 
     | 
    
         
             
              #
         
     | 
| 
       29 
     | 
    
         
            -
              # @example  
     | 
| 
      
 31 
     | 
    
         
            +
              # @example Update JSON data file
         
     | 
| 
       30 
32 
     | 
    
         
             
              #   File.read("data.json")  # == '{"nested":{"key":"value"}}'
         
     | 
| 
       31 
33 
     | 
    
         
             
              #
         
     | 
| 
       32 
34 
     | 
    
         
             
              #   File.edit_text("data.json") do |text|
         
     | 
| 
         @@ -38,9 +40,9 @@ class File 
     | 
|
| 
       38 
40 
     | 
    
         
             
              #   File.read("data.json")  # == '{"nested":{"key":"new value"}}'
         
     | 
| 
       39 
41 
     | 
    
         
             
              #
         
     | 
| 
       40 
42 
     | 
    
         
             
              # @param filename [String, Pathname]
         
     | 
| 
       41 
     | 
    
         
            -
              # @yield [text] 
     | 
| 
       42 
     | 
    
         
            -
              # @yieldparam text [String] 
     | 
| 
       43 
     | 
    
         
            -
              # @yieldreturn [String] 
     | 
| 
      
 43 
     | 
    
         
            +
              # @yield [text]
         
     | 
| 
      
 44 
     | 
    
         
            +
              # @yieldparam text [String]
         
     | 
| 
      
 45 
     | 
    
         
            +
              # @yieldreturn [String]
         
     | 
| 
       44 
46 
     | 
    
         
             
              # @return [String]
         
     | 
| 
       45 
47 
     | 
    
         
             
              def self.edit_text(filename)
         
     | 
| 
       46 
48 
     | 
    
         
             
                self.open(filename, "r+") do |f|
         
     | 
| 
         @@ -52,14 +54,14 @@ class File 
     | 
|
| 
       52 
54 
     | 
    
         
             
                end
         
     | 
| 
       53 
55 
     | 
    
         
             
              end
         
     | 
| 
       54 
56 
     | 
    
         | 
| 
       55 
     | 
    
         
            -
              # Reads  
     | 
| 
       56 
     | 
    
         
            -
              # yields  
     | 
| 
       57 
     | 
    
         
            -
              # value of the block back to the file, 
     | 
| 
       58 
     | 
    
         
            -
              #  
     | 
| 
       59 
     | 
    
         
            -
              #  
     | 
| 
       60 
     | 
    
         
            -
              #  
     | 
| 
      
 57 
     | 
    
         
            +
              # Reads the entire contents of the file indicated by +filename+ as an
         
     | 
| 
      
 58 
     | 
    
         
            +
              # array of lines, and yields that array to the given block for
         
     | 
| 
      
 59 
     | 
    
         
            +
              # editing.  Writes the return value of the block back to the file,
         
     | 
| 
      
 60 
     | 
    
         
            +
              # overwriting previous contents.  End-of-line (EOL) characters are
         
     | 
| 
      
 61 
     | 
    
         
            +
              # stripped when reading, and appended after each line when writing.
         
     | 
| 
      
 62 
     | 
    
         
            +
              # Returns the return value of the block.
         
     | 
| 
       61 
63 
     | 
    
         
             
              #
         
     | 
| 
       62 
     | 
    
         
            -
              # @example  
     | 
| 
      
 64 
     | 
    
         
            +
              # @example Dedup lines of file
         
     | 
| 
       63 
65 
     | 
    
         
             
              #   File.read("entries.txt")  # == "AAA\nBBB\nBBB\nCCC\nAAA\n"
         
     | 
| 
       64 
66 
     | 
    
         
             
              #
         
     | 
| 
       65 
67 
     | 
    
         
             
              #   File.edit_lines("entries.txt", &:uniq)
         
     | 
| 
         @@ -68,15 +70,16 @@ class File 
     | 
|
| 
       68 
70 
     | 
    
         
             
              #   File.read("entries.txt")  # == "AAA\nBBB\nCCC\n"
         
     | 
| 
       69 
71 
     | 
    
         
             
              #
         
     | 
| 
       70 
72 
     | 
    
         
             
              # @param filename [String, Pathname]
         
     | 
| 
       71 
     | 
    
         
            -
              # @ 
     | 
| 
       72 
     | 
    
         
            -
              # @ 
     | 
| 
       73 
     | 
    
         
            -
              # @ 
     | 
| 
      
 73 
     | 
    
         
            +
              # @param eol [String]
         
     | 
| 
      
 74 
     | 
    
         
            +
              # @yield [lines]
         
     | 
| 
      
 75 
     | 
    
         
            +
              # @yieldparam lines [Array<String>]
         
     | 
| 
      
 76 
     | 
    
         
            +
              # @yieldreturn [Array<String>]
         
     | 
| 
       74 
77 
     | 
    
         
             
              # @return [Array<String>]
         
     | 
| 
       75 
     | 
    
         
            -
              def self.edit_lines(filename)
         
     | 
| 
      
 78 
     | 
    
         
            +
              def self.edit_lines(filename, eol: $/)
         
     | 
| 
       76 
79 
     | 
    
         
             
                self.open(filename, "r+") do |f|
         
     | 
| 
       77 
     | 
    
         
            -
                  lines = yield f.read_lines
         
     | 
| 
      
 80 
     | 
    
         
            +
                  lines = yield f.read_lines(eol: eol)
         
     | 
| 
       78 
81 
     | 
    
         
             
                  f.seek(0, IO::SEEK_SET)
         
     | 
| 
       79 
     | 
    
         
            -
                  f.write_lines(lines)
         
     | 
| 
      
 82 
     | 
    
         
            +
                  f.write_lines(lines, eol: eol)
         
     | 
| 
       80 
83 
     | 
    
         
             
                  f.truncate(f.pos)
         
     | 
| 
       81 
84 
     | 
    
         
             
                  lines
         
     | 
| 
       82 
85 
     | 
    
         
             
                end
         
     | 
    
        data/lib/pleasant_path/io.rb
    CHANGED
    
    | 
         @@ -1,45 +1,46 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            class IO
         
     | 
| 
       2 
4 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
              # Writes each object as a string plus  
     | 
| 
       4 
     | 
    
         
            -
              #  
     | 
| 
      
 5 
     | 
    
         
            +
              # Writes each object in +lines+ as a string plus end-of-line (EOL)
         
     | 
| 
      
 6 
     | 
    
         
            +
              # characters to the IO.  Returns +lines+, unmodified.
         
     | 
| 
       5 
7 
     | 
    
         
             
              #
         
     | 
| 
       6 
8 
     | 
    
         
             
              # @example
         
     | 
| 
       7 
     | 
    
         
            -
              #    
     | 
| 
       8 
     | 
    
         
            -
              # 
     | 
| 
       9 
     | 
    
         
            -
              # 
     | 
| 
       10 
     | 
    
         
            -
              #   end                               # == [:one, :two]
         
     | 
| 
      
 9 
     | 
    
         
            +
              #   File.open("out.txt") do |io|
         
     | 
| 
      
 10 
     | 
    
         
            +
              #     io.write_lines([:one, :two])  # == [:one, :two]
         
     | 
| 
      
 11 
     | 
    
         
            +
              #   end                             # == [:one, :two]
         
     | 
| 
       11 
12 
     | 
    
         
             
              #
         
     | 
| 
       12 
     | 
    
         
            -
              #   File.read("out.txt") 
     | 
| 
      
 13 
     | 
    
         
            +
              #   File.read("out.txt")            # == "one\ntwo\n"
         
     | 
| 
       13 
14 
     | 
    
         
             
              #
         
     | 
| 
       14 
15 
     | 
    
         
             
              # @param lines [Enumerable<#to_s>]
         
     | 
| 
      
 16 
     | 
    
         
            +
              # @param eol [String]
         
     | 
| 
       15 
17 
     | 
    
         
             
              # @return [Enumerable<#to_s>]
         
     | 
| 
       16 
     | 
    
         
            -
              def write_lines(lines)
         
     | 
| 
      
 18 
     | 
    
         
            +
              def write_lines(lines, eol: $/)
         
     | 
| 
       17 
19 
     | 
    
         
             
                lines.each do |line|
         
     | 
| 
       18 
20 
     | 
    
         
             
                  self.write(line)
         
     | 
| 
       19 
     | 
    
         
            -
                  self.write( 
     | 
| 
      
 21 
     | 
    
         
            +
                  self.write(eol)
         
     | 
| 
       20 
22 
     | 
    
         
             
                end
         
     | 
| 
       21 
23 
     | 
    
         
             
                self.write("") # write something even if no lines
         
     | 
| 
       22 
24 
     | 
    
         
             
                lines
         
     | 
| 
       23 
25 
     | 
    
         
             
              end
         
     | 
| 
       24 
26 
     | 
    
         | 
| 
       25 
     | 
    
         
            -
              # Reads from the IO 
     | 
| 
       26 
     | 
    
         
            -
              #  
     | 
| 
       27 
     | 
    
         
            -
              # specifies what end-of-line characters to exclude.
         
     | 
| 
      
 27 
     | 
    
         
            +
              # Reads all lines from the IO, and returns them with all end-of-line
         
     | 
| 
      
 28 
     | 
    
         
            +
              # (EOL) characters stripped.
         
     | 
| 
       28 
29 
     | 
    
         
             
              #
         
     | 
| 
       29 
     | 
    
         
            -
              #  
     | 
| 
       30 
     | 
    
         
            -
              # characters 
     | 
| 
      
 30 
     | 
    
         
            +
              # @note Not to be confused with +IO#readlines+, which retains
         
     | 
| 
      
 31 
     | 
    
         
            +
              #   end-of-line (EOL) characters.
         
     | 
| 
       31 
32 
     | 
    
         
             
              #
         
     | 
| 
       32 
33 
     | 
    
         
             
              # @example
         
     | 
| 
       33 
     | 
    
         
            -
              #   #  
     | 
| 
       34 
     | 
    
         
            -
              #   File.read("in.txt")            # == "one\ntwo\n"
         
     | 
| 
      
 34 
     | 
    
         
            +
              #   File.read("in.txt")          # == "one\ntwo\n"
         
     | 
| 
       35 
35 
     | 
    
         
             
              #
         
     | 
| 
       36 
     | 
    
         
            -
              #   File.open("in.txt") do | 
     | 
| 
       37 
     | 
    
         
            -
              #      
     | 
| 
       38 
     | 
    
         
            -
              #   end 
     | 
| 
      
 36 
     | 
    
         
            +
              #   File.open("in.txt") do |io|
         
     | 
| 
      
 37 
     | 
    
         
            +
              #     io.read_lines              # == ["one", "two"]
         
     | 
| 
      
 38 
     | 
    
         
            +
              #   end                          # == ["one", "two"]
         
     | 
| 
       39 
39 
     | 
    
         
             
              #
         
     | 
| 
      
 40 
     | 
    
         
            +
              # @param eol [String]
         
     | 
| 
       40 
41 
     | 
    
         
             
              # @return [Array<String>]
         
     | 
| 
       41 
     | 
    
         
            -
              def read_lines
         
     | 
| 
       42 
     | 
    
         
            -
                self.readlines 
     | 
| 
      
 42 
     | 
    
         
            +
              def read_lines(eol: $/)
         
     | 
| 
      
 43 
     | 
    
         
            +
                self.readlines(eol, chomp: true)
         
     | 
| 
       43 
44 
     | 
    
         
             
              end
         
     | 
| 
       44 
45 
     | 
    
         | 
| 
       45 
46 
     | 
    
         
             
            end
         
     | 
| 
         @@ -1,26 +1,26 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            class Object
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
              #  
     | 
| 
       4 
     | 
    
         
            -
              #  
     | 
| 
      
 3 
     | 
    
         
            +
              # Writes the Object serialized as JSON to the specified +file+,
         
     | 
| 
      
 4 
     | 
    
         
            +
              # overwriting the file if it exists.  Creates the file if it does not
         
     | 
| 
      
 5 
     | 
    
         
            +
              # exist, including any necessary parent directories.  Returns the
         
     | 
| 
      
 6 
     | 
    
         
            +
              # Object, unmodified.
         
     | 
| 
       5 
7 
     | 
    
         
             
              #
         
     | 
| 
       6 
     | 
    
         
            -
              # For information about  
     | 
| 
       7 
     | 
    
         
            -
              # { 
     | 
| 
       8 
     | 
    
         
            -
              # +JSON.generate+}.
         
     | 
| 
      
 8 
     | 
    
         
            +
              # For information about +options+ see
         
     | 
| 
      
 9 
     | 
    
         
            +
              # {https://docs.ruby-lang.org/en/trunk/JSON.html#method-i-generate
         
     | 
| 
      
 10 
     | 
    
         
            +
              # +JSON.generate+}.  By default, this method uses
         
     | 
| 
      
 11 
     | 
    
         
            +
              # {https://docs.ruby-lang.org/en/trunk/JSON.html#attribute-c-dump_default_options
         
     | 
| 
      
 12 
     | 
    
         
            +
              # +JSON.dump_default_options+}.
         
     | 
| 
       9 
13 
     | 
    
         
             
              #
         
     | 
| 
       10 
14 
     | 
    
         
             
              # @example
         
     | 
| 
       11 
15 
     | 
    
         
             
              #   { "key" => "value" }.write_to_json("out.json")  # == { "key" => "value" }
         
     | 
| 
       12 
16 
     | 
    
         
             
              #   File.read("out.json")                           # == '{"key":"value"}'
         
     | 
| 
       13 
17 
     | 
    
         
             
              #
         
     | 
| 
       14 
18 
     | 
    
         
             
              # @param file [String, Pathname]
         
     | 
| 
       15 
     | 
    
         
            -
              # @param options [Hash]
         
     | 
| 
      
 19 
     | 
    
         
            +
              # @param options [Hash<Symbol, Object>]
         
     | 
| 
       16 
20 
     | 
    
         
             
              # @return [self]
         
     | 
| 
       17 
21 
     | 
    
         
             
              def write_to_json(file, options = {})
         
     | 
| 
       18 
     | 
    
         
            -
                options =  
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
                  allow_nan: true,
         
     | 
| 
       21 
     | 
    
         
            -
                }.merge(options)
         
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
                file.to_pathname.write_text(JSON.generate(self, options))
         
     | 
| 
      
 22 
     | 
    
         
            +
                options = JSON.dump_default_options.merge(options)
         
     | 
| 
      
 23 
     | 
    
         
            +
                file.to_pathname.write_text(self.to_json(options))
         
     | 
| 
       24 
24 
     | 
    
         
             
                self
         
     | 
| 
       25 
25 
     | 
    
         
             
              end
         
     | 
| 
       26 
26 
     | 
    
         | 
| 
         @@ -1,41 +1,38 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            class Pathname
         
     | 
| 
       2 
4 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
              #  
     | 
| 
       4 
     | 
    
         
            -
              #  
     | 
| 
       5 
     | 
    
         
            -
              #  
     | 
| 
       6 
     | 
    
         
            -
              # +String+, an +Array+, or a +Hash+.
         
     | 
| 
      
 5 
     | 
    
         
            +
              # Parses the contents of the file indicated by the Pathname as JSON.
         
     | 
| 
      
 6 
     | 
    
         
            +
              # The returned result will composed of only basic data types, e.g.
         
     | 
| 
      
 7 
     | 
    
         
            +
              # +nil+, +true+, +false+, +Numeric+, +String+, +Array+, and +Hash+.
         
     | 
| 
       7 
8 
     | 
    
         
             
              #
         
     | 
| 
       8 
     | 
    
         
            -
              # For information about  
     | 
| 
       9 
     | 
    
         
            -
              # { 
     | 
| 
       10 
     | 
    
         
            -
              # +JSON.parse+}.
         
     | 
| 
      
 9 
     | 
    
         
            +
              # For information about +options+, see
         
     | 
| 
      
 10 
     | 
    
         
            +
              # {https://docs.ruby-lang.org/en/trunk/JSON.html#method-i-parse
         
     | 
| 
      
 11 
     | 
    
         
            +
              # +JSON.parse+}.  By default, this method uses
         
     | 
| 
      
 12 
     | 
    
         
            +
              # {https://docs.ruby-lang.org/en/trunk/JSON.html#attribute-c-load_default_options
         
     | 
| 
      
 13 
     | 
    
         
            +
              # +JSON.load_default_options+} plus +create_additions: false+.
         
     | 
| 
       11 
14 
     | 
    
         
             
              #
         
     | 
| 
       12 
15 
     | 
    
         
             
              # @example
         
     | 
| 
       13 
16 
     | 
    
         
             
              #   File.write("in.json", '{"key": "value"}')
         
     | 
| 
       14 
17 
     | 
    
         
             
              #
         
     | 
| 
       15 
18 
     | 
    
         
             
              #   Pathname.new("in.json").read_json  # == { "key" => "value" }
         
     | 
| 
       16 
19 
     | 
    
         
             
              #
         
     | 
| 
       17 
     | 
    
         
            -
              # @param options [Hash]
         
     | 
| 
      
 20 
     | 
    
         
            +
              # @param options [Hash<Symbol, Object>]
         
     | 
| 
       18 
21 
     | 
    
         
             
              # @return [nil, true, false, Numeric, String, Symbol, Array, Hash]
         
     | 
| 
       19 
22 
     | 
    
         
             
              def read_json(options = {})
         
     | 
| 
       20 
     | 
    
         
            -
                 
     | 
| 
       21 
     | 
    
         
            -
                  quirks_mode: true,
         
     | 
| 
       22 
     | 
    
         
            -
                  allow_nan: true,
         
     | 
| 
       23 
     | 
    
         
            -
                  max_nesting: false,
         
     | 
| 
       24 
     | 
    
         
            -
                  create_additions: false,
         
     | 
| 
       25 
     | 
    
         
            -
                }.merge(options)
         
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
                JSON.parse(self.read_text, options)
         
     | 
| 
      
 23 
     | 
    
         
            +
                JSON.load(self, nil, { create_additions: false, **options })
         
     | 
| 
       28 
24 
     | 
    
         
             
              end
         
     | 
| 
       29 
25 
     | 
    
         | 
| 
       30 
     | 
    
         
            -
              #  
     | 
| 
       31 
     | 
    
         
            -
              #  
     | 
| 
       32 
     | 
    
         
            -
              # JSON 
     | 
| 
       33 
     | 
    
         
            -
              #  
     | 
| 
       34 
     | 
    
         
            -
              # {Pathname#read_json} instead.
         
     | 
| 
      
 26 
     | 
    
         
            +
              # Parses the contents of the file indicated by the Pathname as JSON,
         
     | 
| 
      
 27 
     | 
    
         
            +
              # deserializing arbitrary data types via type information embedded in
         
     | 
| 
      
 28 
     | 
    
         
            +
              # the JSON.  This is *UNSAFE* for JSON from an untrusted source.  To
         
     | 
| 
      
 29 
     | 
    
         
            +
              # consume untrusted JSON, use {Pathname#read_json} instead.
         
     | 
| 
       35 
30 
     | 
    
         
             
              #
         
     | 
| 
       36 
     | 
    
         
            -
              # For information about  
     | 
| 
       37 
     | 
    
         
            -
              # { 
     | 
| 
       38 
     | 
    
         
            -
              # +JSON.parse+}.
         
     | 
| 
      
 31 
     | 
    
         
            +
              # For information about +options+, see
         
     | 
| 
      
 32 
     | 
    
         
            +
              # {https://docs.ruby-lang.org/en/trunk/JSON.html#method-i-parse
         
     | 
| 
      
 33 
     | 
    
         
            +
              # +JSON.parse+}.  By default, this method uses
         
     | 
| 
      
 34 
     | 
    
         
            +
              # {https://docs.ruby-lang.org/en/trunk/JSON.html#attribute-c-load_default_options
         
     | 
| 
      
 35 
     | 
    
         
            +
              # +JSON.load_default_options+}.
         
     | 
| 
       39 
36 
     | 
    
         
             
              #
         
     | 
| 
       40 
37 
     | 
    
         
             
              # For information about serializing custom types to JSON, see the
         
     | 
| 
       41 
38 
     | 
    
         
             
              # {https://github.com/flori/json/blob/master/README.md#more-examples
         
     | 
| 
         @@ -49,10 +46,10 @@ class Pathname 
     | 
|
| 
       49 
46 
     | 
    
         
             
              #
         
     | 
| 
       50 
47 
     | 
    
         
             
              #   Pathname.new("in.json").load_json  # == Point.new(10, 20)
         
     | 
| 
       51 
48 
     | 
    
         
             
              #
         
     | 
| 
       52 
     | 
    
         
            -
              # @param options [Hash]
         
     | 
| 
       53 
     | 
    
         
            -
              # @return  
     | 
| 
      
 49 
     | 
    
         
            +
              # @param options [Hash<Symbol, Object>]
         
     | 
| 
      
 50 
     | 
    
         
            +
              # @return [Object]
         
     | 
| 
       54 
51 
     | 
    
         
             
              def load_json(options = {})
         
     | 
| 
       55 
     | 
    
         
            -
                 
     | 
| 
      
 52 
     | 
    
         
            +
                JSON.load(self, nil, options)
         
     | 
| 
       56 
53 
     | 
    
         
             
              end
         
     | 
| 
       57 
54 
     | 
    
         | 
| 
       58 
55 
     | 
    
         
             
            end
         
     |