dumb_delimited 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 4522a4b2571eae677938c2c9ff3a20ed7d0a2b22
4
- data.tar.gz: 7d832b4eaf31490dd95f6e547ddf9e74e677f712
2
+ SHA256:
3
+ metadata.gz: 2a4d7deecbbed56e6940058fdc548436cbdb0f081b43164bc841017601c27726
4
+ data.tar.gz: b94ae4701ae2dec7cee54befe2e85c11ea20a9ae5906d0f7da6a8da1ef377eb6
5
5
  SHA512:
6
- metadata.gz: 3cd992cc109129c7342815b227c6ebe4ac167c0635917d894774b5509fc92e7f5f119fe5bb9fc8aeeedd2f3d9937bc031ea71059172fb44d5f1d8fc942492cad
7
- data.tar.gz: eef544b4373011f28996a3a902d25a354baf961aa4655f3819889132660adad59031811b776afe52bbba22fc36440e5731f270b10779323f805c27f4472f81c0
6
+ metadata.gz: 9f2994715b89523b10c4fb1375b2a073e306cedfae565f502241a4ad8f82876b1ec02d1b453641842ca331bba2812ea73783c70af7cc1431b0bbaeec83e0ce09
7
+ data.tar.gz: 36b9db417ddd340f695e1332ea005ad8ec03c3e8d31f5cc395b8479463497bee0e518e89f5916a90d0267ebfe9779abb21995d35e66f8da67b91f282e955b2b1
data/CHANGELOG.md ADDED
@@ -0,0 +1,10 @@
1
+ ## 1.1.0
2
+
3
+ * Fixed gem load on case-sensitive file systems.
4
+ * Added `parse_text` class method.
5
+ * Added `append_to_file` instance method.
6
+
7
+
8
+ ## 1.0.0
9
+
10
+ * Initial release
data/README.md CHANGED
@@ -27,8 +27,8 @@ Bob Bobbington|best_bob@bobbers.bob|808 Bounce Lane, Austin, TX 78703
27
27
  ```
28
28
 
29
29
  To interact with these files, we create model classes via the
30
- `DumbDelimited#[]` method. Note that a created class can either be used
31
- as a superclass or simply assigned to a constant.
30
+ `DumbDelimited::[]` method. Note that a created class can either be
31
+ used as a superclass or simply assigned to a constant.
32
32
 
33
33
  ```ruby
34
34
  class Product < DumbDelimited[:sku, :name, :base_price, :sale_price]
@@ -79,10 +79,10 @@ end
79
79
 
80
80
  Let's say the sale is now over, and we want to change our sale prices
81
81
  back to our base prices. *dumb_delimited* includes the
82
- [*pleasant_path*](https://github.com/jonathanhefner/pleasant_path) gem,
83
- which offers a fluent API for writing files. To finish our task, we use
84
- the `Array#write_to_file` method provided by *pleasant_path*, which in
85
- turn invokes `Product#to_s` (provided by *dumb_delimited*) on each model
82
+ [*pleasant_path*](https://rubygems.org/gems/pleasant_path) gem, which
83
+ offers a fluent API for writing files. To finish our task, we use the
84
+ `Array#write_to_file` method provided by *pleasant_path*, which in turn
85
+ invokes `Product#to_s` (provided by *dumb_delimited*) on each model
86
86
  object.
87
87
 
88
88
  ```ruby
@@ -97,10 +97,20 @@ For a more detailed explanation of the *dumb_delimited* API, browse the
97
97
 
98
98
  ## Installation
99
99
 
100
- $ gem install dumb_delimited
100
+ Install from [Ruby Gems](https://rubygems.org/gems/dumb_delimited):
101
+
102
+ ```bash
103
+ $ gem install dumb_delimited
104
+ ```
105
+
106
+ Then require in your Ruby script:
107
+
108
+ ```ruby
109
+ require "dumb_delimited"
110
+ ```
101
111
 
102
112
 
103
- ## Development
113
+ ## Contributing
104
114
 
105
115
  Run `rake test` to run the tests. You can also run `rake irb` for an
106
116
  interactive prompt that pre-loads the project code.
@@ -108,4 +118,4 @@ interactive prompt that pre-loads the project code.
108
118
 
109
119
  ## License
110
120
 
111
- [MIT License](http://opensource.org/licenses/MIT)
121
+ [MIT License](https://opensource.org/licenses/MIT)
@@ -1,6 +1,6 @@
1
- require "CSV"
1
+ require "csv"
2
2
  require "pleasant_path"
3
- require "dumb_delimited/version"
3
+ require_relative "dumb_delimited/version"
4
4
 
5
5
 
6
6
  module DumbDelimited
@@ -45,7 +45,7 @@ module DumbDelimited::ClassMethods
45
45
  # @return [Hash]
46
46
  def options
47
47
  @options ||= {
48
- col_sep: ',',
48
+ col_sep: ",",
49
49
  skip_blanks: true,
50
50
  converters: :numeric,
51
51
  }
@@ -92,9 +92,7 @@ module DumbDelimited::ClassMethods
92
92
  #
93
93
  # @example
94
94
  # Point = DumbDelimited[:x, :y, :z]
95
- # p = Point.parse_line("1,2,3")
96
- # p.is_a?(Point) # == true
97
- # p.to_a # == [1, 2, 3]
95
+ # Point.parse_line("1,2,3") # == Point.new(1, 2, 3)
98
96
  #
99
97
  # @param line [String]
100
98
  # @return [self]
@@ -102,6 +100,25 @@ module DumbDelimited::ClassMethods
102
100
  self.new(*CSV.parse_line(line, self.options))
103
101
  end
104
102
 
103
+ # Parses a string into an array of model objects.
104
+ #
105
+ # @example
106
+ # Point = DumbDelimited[:x, :y, :z]
107
+ # Point.parse_text("1,2,3\n4,5,6\n7,8,9\n")
108
+ # # == [
109
+ # # Point.new(1, 2, 3),
110
+ # # Point.new(4, 5, 6),
111
+ # # Point.new(7, 8, 9)
112
+ # # ]
113
+ #
114
+ # @param text [String]
115
+ # @return [Array<self>]
116
+ def parse_text(text)
117
+ # using CSV.new.each instead of CSV.parse to avoid unnecessary mass
118
+ # memory allocation and deallocation
119
+ CSV.new(text, self.options).each.map{|row| self.new(*row) }
120
+ end
121
+
105
122
  # Parses an entire delimited file into an array of model objects.
106
123
  # This will load the entire contents of the file into memory, and may
107
124
  # not be suitable for large files. To iterate over file contents
@@ -114,8 +131,12 @@ module DumbDelimited::ClassMethods
114
131
  # # 7,8,9
115
132
  #
116
133
  # Point = DumbDelimited[:x, :y, :z]
117
- # points = Point.parse_file("points.csv")
118
- # points.map(&:x) # == [1, 4, 7]
134
+ # Point.parse_file("points.csv")
135
+ # # == [
136
+ # # Point.new(1, 2, 3),
137
+ # # Point.new(4, 5, 6),
138
+ # # Point.new(7, 8, 9)
139
+ # # ]
119
140
  #
120
141
  # @param path [String, Pathname]
121
142
  # @return [Array<self>]
@@ -155,4 +176,26 @@ module DumbDelimited::InstanceMethods
155
176
  CSV.generate_line(self, self.class.options).chomp!
156
177
  end
157
178
 
179
+ # Serializes a model object to a delimited string, using the delimiter
180
+ # specified by {ClassMethods.delimiter}, and appends the string plus a
181
+ # row separator to the specified file. Returns the model object.
182
+ # This method is convenient when working with single model objects,
183
+ # for example, appending a single entry to a log file. However, it is
184
+ # not recommended for use with an array of model objects, due to the
185
+ # overhead of opening and closing the file for each append.
186
+ #
187
+ # @example
188
+ # Point = DumbDelimited[:x, :y, :z]
189
+ # Point.new(1, 2, 3).append_to_file("out.txt") # == Point.new(1, 2, 3)
190
+ # File.read("out.txt") # == "1,2,3\n"
191
+ # Point.new(4, 5, 6).append_to_file("out.txt") # == Point.new(4, 5, 6)
192
+ # File.read("out.txt") # == "1,2,3\n4,5,6\n"
193
+ #
194
+ # @param file [String, Pathname]
195
+ # @return [self]
196
+ def append_to_file(file)
197
+ CSV.generate_line(self, self.class.options).append_to_file(file)
198
+ self
199
+ end
200
+
158
201
  end
@@ -1,3 +1,3 @@
1
1
  module DumbDelimited
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dumb_delimited
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Hefner
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-07-02 00:00:00.000000000 Z
11
+ date: 2018-07-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pleasant_path
@@ -89,6 +89,7 @@ extra_rdoc_files: []
89
89
  files:
90
90
  - ".gitignore"
91
91
  - ".travis.yml"
92
+ - CHANGELOG.md
92
93
  - Gemfile
93
94
  - LICENSE.txt
94
95
  - README.md
@@ -116,7 +117,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
116
117
  version: '0'
117
118
  requirements: []
118
119
  rubyforge_project:
119
- rubygems_version: 2.4.8
120
+ rubygems_version: 2.7.6
120
121
  signing_key:
121
122
  specification_version: 4
122
123
  summary: Library for unsophisticated delimited flat file IO