csv_serializer 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: d8bba76706d52efc7cce1caa94b6553eda5a272c6573c74c629b5d4f20b0fb07
4
+ data.tar.gz: 5b7285367e093d88dc1a6fc93dfc10ddf157b47c8747412db481a06d28558b1a
5
+ SHA512:
6
+ metadata.gz: 1402ccb3fb4b465bd71d24b415e2c36e7810633e9130ff89c55a569e2d3bd21101cb1a843679a836f085661be3c6a8e091c0db925095bbad9205623354c7724e
7
+ data.tar.gz: 60a3dceccb1c5442683c754d355cba4d57cfab597181d9cc2b505cf160294b7f60e9e05a112c1cb8fcb0bb69b1af073a637f173fe62f050b73438b7e7412a6df
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2021 Yudai Tanaka
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,90 @@
1
+ # CsvSerializer
2
+ Adds easy CSV generation functionality to `ActiveRecord`.
3
+
4
+ ## Usage
5
+ Suppose Person model is defined.
6
+ ```ruby
7
+ class Person < ApplicationRecord
8
+ # In schema.rb, columns are defined as below definition.
9
+ # create_table "people", force: :cascade do |t|
10
+ # t.string "name"
11
+ # t.integer "age"
12
+ # t.integer "tall"
13
+ # t.integer "weight"
14
+ # t.datetime "created_at", precision: 6, null: false
15
+ # t.datetime "updated_at", precision: 6, null: false
16
+ # end
17
+ end
18
+ ```
19
+
20
+ `to_csv` returns csv as string.
21
+
22
+ ```ruby
23
+ Person.to_csv
24
+ # => id,name,age,tall,weight,created_at,updated_at
25
+ # 1,sample1,1,128,34,2020-01-01 10:02:39 UTC,2020-01-01 11:02:39 UTC
26
+ # 2,sample2,2,130,32,2020-01-01 12:02:39 UTC,2020-01-01 14:02:39 UTC
27
+ ````
28
+
29
+ If attribute names is passed, CSV string only contains the specified attributes will be returned.
30
+ ```ruby
31
+ Person.to_csv(:id, :name)
32
+ # => id,name
33
+ # 1,sample1
34
+ # 2,sample2
35
+ ```
36
+
37
+ Containing the value gained by processing the record is supported.
38
+ ```ruby
39
+ Person.to_csv(
40
+ "long name": ->(user) { user.name * 2 },
41
+ "short name": ->(user) { user.name[-2..] }
42
+ )
43
+ # => long name,short name
44
+ # sample1sample1,e1
45
+ # sample2sample2,e2
46
+ ```
47
+
48
+ Same named columns can be specified with arrays of a column name and a producer function.
49
+ ```ruby
50
+ Person.all.to_csv(
51
+ ["long name", ->(user) { user.name * 2 }],
52
+ ["long name", ->(user) { user.name * 3 }]
53
+ )
54
+ # => Long name,Long name
55
+ # sample1sample1,sample1sample1sample1
56
+ ```
57
+
58
+ ### Output to files
59
+ ```ruby
60
+ io = Tempfile.new
61
+ Person.all.to_csv_stream(io)
62
+ # Below lines are written to tempfile.
63
+ # id,name,age,tall,weight,created_at,updated_at
64
+ # 1,sample1,1,128,34,2020-01-01 10:02:39 UTC,2020-01-01 11:02:39 UTC
65
+ # 2,sample2,2,130,32,2020-01-01 12:02:39 UTC,2020-01-01 14:02:39 UTC
66
+
67
+ ```
68
+
69
+ ## Installation
70
+ Add this line to your application's Gemfile:
71
+
72
+ ```ruby
73
+ gem 'csv_serializer'
74
+ ```
75
+
76
+ And then execute:
77
+ ```bash
78
+ $ bundle
79
+ ```
80
+
81
+ Or install it yourself as:
82
+ ```bash
83
+ $ gem install csv_serializer
84
+ ```
85
+
86
+ ## Contributing
87
+ Contribution directions go here.
88
+
89
+ ## License
90
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,13 @@
1
+ require "bundler/setup"
2
+
3
+ require "bundler/gem_tasks"
4
+
5
+ require "rake/testtask"
6
+
7
+ Rake::TestTask.new(:test) do |t|
8
+ t.libs << "test"
9
+ t.pattern = "test/**/*_test.rb"
10
+ t.verbose = false
11
+ end
12
+
13
+ task default: :test
@@ -0,0 +1,15 @@
1
+ require "csv_serializer/version"
2
+ require "csv_serializer/railtie"
3
+ require "csv_serializer/methods"
4
+ require "csv_serializer/serializer"
5
+ require "csv_serializer/definition"
6
+ require "csv_serializer/definition/all_column"
7
+ require "csv_serializer/definition/function_array"
8
+ require "csv_serializer/definition/symbol_array"
9
+ require "csv_serializer/definition/function_hash"
10
+
11
+ module CsvSerializer; end
12
+
13
+ ActiveSupport.on_load(:active_record) do
14
+ include CsvSerializer::Methods
15
+ end
@@ -0,0 +1,39 @@
1
+ module CsvSerializer
2
+ # Represents definition of csv columns.
3
+ class Definition
4
+ attr_reader :records
5
+
6
+ def self.build(array, hash, records)
7
+ if array.blank? && hash.blank?
8
+ AllColumn.new(records)
9
+ elsif array.blank?
10
+ FunctionHash.new(records, hash)
11
+ elsif array.all?(Symbol)
12
+ SymbolArray.new(records, array)
13
+ else
14
+ FunctionArray.new(records, array)
15
+ end
16
+ end
17
+
18
+ def initialize(records, array_or_hash = nil)
19
+ @records = records
20
+ @array_or_hash = array_or_hash
21
+ end
22
+
23
+ def definitions
24
+ @array_or_hash
25
+ end
26
+
27
+ def serializer
28
+ Serializer.new(self)
29
+ end
30
+
31
+ def target_records
32
+ records.all
33
+ end
34
+
35
+ def header
36
+ column_names.map { records.human_attribute_name(_1) }
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,21 @@
1
+ module CsvSerializer
2
+ class Definition
3
+ class AllColumn < CsvSerializer::Definition
4
+ def column_names
5
+ records.attribute_names
6
+ end
7
+
8
+ def target_records
9
+ records.pluck(*column_names)
10
+ end
11
+
12
+ def producers
13
+ definitions.map(&:last)
14
+ end
15
+
16
+ def process(record)
17
+ record
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,17 @@
1
+ module CsvSerializer
2
+ class Definition::FunctionArray < CsvSerializer::Definition
3
+ def column_names
4
+ definitions.map(&:first)
5
+ end
6
+
7
+ def process(record)
8
+ producers.map do |func|
9
+ func.call record
10
+ end
11
+ end
12
+
13
+ def producers
14
+ definitions.map(&:last)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,15 @@
1
+ class CsvSerializer::Definition::FunctionHash < CsvSerializer::Definition
2
+ def column_names
3
+ definitions.keys
4
+ end
5
+
6
+ def process(record)
7
+ producers.map do |func|
8
+ func.call record
9
+ end
10
+ end
11
+
12
+ def producers
13
+ definitions.values
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ class CsvSerializer::Definition::SymbolArray < CsvSerializer::Definition
2
+ def column_names
3
+ definitions
4
+ end
5
+
6
+ def process(record)
7
+ if definitions.size <= 1
8
+ [record]
9
+ else
10
+ record
11
+ end
12
+ end
13
+
14
+ def producers
15
+ definitions
16
+ end
17
+
18
+ def target_records
19
+ records.pluck(*column_names)
20
+ end
21
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CsvSerializer
4
+ # Provides methods available on ActiveRecords.
5
+ module Methods
6
+ extend ActiveSupport::Concern
7
+
8
+ class_methods do
9
+ def to_csv(*array, **hash)
10
+ serializer = Definition.build(array, hash, self).serializer
11
+ serializer.serialize
12
+ end
13
+
14
+ def to_csv_stream(io, *array, **hash)
15
+ serializer = Definition.build(array, hash, self).serializer
16
+ Thread.new do
17
+ serializer.serialize_to(io)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,4 @@
1
+ module CsvSerializer
2
+ class Railtie < ::Rails::Railtie
3
+ end
4
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+ require "csv"
3
+
4
+ module CsvSerializer
5
+ # Provides functions to generate csv string and file from column definition object.
6
+ class Serializer
7
+ attr_reader :definitions, :records
8
+
9
+ def initialize(definitions)
10
+ @definitions = definitions
11
+ end
12
+
13
+ def serialize
14
+ CSV.generate do |csv|
15
+ csv << definitions.header
16
+ definitions.target_records.each do |record|
17
+ csv << definitions.process(record)
18
+ end
19
+ end
20
+ end
21
+
22
+ def serialize_to(io)
23
+ io << CSV.generate_line(definitions.header)
24
+ definitions.target_records.each do |record|
25
+ io << CSV.generate_line(definitions.process(record))
26
+ end
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,3 @@
1
+ module CsvSerializer
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :csv_serializer do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,72 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: csv_serializer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Yudai Tanaka
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-05-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 6.1.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 6.1.1
27
+ description: Description of CsvSerializer.
28
+ email:
29
+ - ytnk531@gmail.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - MIT-LICENSE
35
+ - README.md
36
+ - Rakefile
37
+ - lib/csv_serializer.rb
38
+ - lib/csv_serializer/definition.rb
39
+ - lib/csv_serializer/definition/all_column.rb
40
+ - lib/csv_serializer/definition/function_array.rb
41
+ - lib/csv_serializer/definition/function_hash.rb
42
+ - lib/csv_serializer/definition/symbol_array.rb
43
+ - lib/csv_serializer/methods.rb
44
+ - lib/csv_serializer/railtie.rb
45
+ - lib/csv_serializer/serializer.rb
46
+ - lib/csv_serializer/version.rb
47
+ - lib/tasks/csv_serializer_tasks.rake
48
+ homepage: https://ytana.work/
49
+ licenses:
50
+ - MIT
51
+ metadata:
52
+ homepage_uri: https://ytana.work/
53
+ post_install_message:
54
+ rdoc_options: []
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ required_rubygems_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ requirements: []
68
+ rubygems_version: 3.2.3
69
+ signing_key:
70
+ specification_version: 4
71
+ summary: Summary of CsvSerializer.
72
+ test_files: []