acb 0.1.0 → 0.1.2
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/.rubocop.yml +16 -0
- data/Appraisals +16 -0
- data/README.md +48 -13
- data/gemfiles/rails_6.0_stable.gemfile +11 -0
- data/gemfiles/rails_6.1_stable.gemfile +11 -0
- data/gemfiles/rails_7.0_stable.gemfile +11 -0
- data/lib/acb/column.rb +46 -0
- data/lib/acb/columns.rb +21 -0
- data/lib/acb/version.rb +1 -1
- data/lib/acb.rb +10 -81
- metadata +51 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f68e2938e80af9df35a5ae1994a7aa479ffb5d2b11208e35944991d82957b8d
|
4
|
+
data.tar.gz: 24f7f96a0635e48002f4c7a743cf112d5bd4067633264688d8a9668b0abe2e90
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 51a8387a18a49aa52e7e55608c5d5bd35267f57f8319a83970d296eb7b64ffdc01918545201650722917d7fc248e7d067f3d5eeef50a2b3814aab5060971f119
|
7
|
+
data.tar.gz: d3b4736088edbebc5d7ecfa372b037af409d3eb3e6a46e0ca01286ed138a5d805893e45526f4161dc8dde2bea7871bf0905fe464d0e5da74bfc220ff3bd3809b
|
data/.rubocop.yml
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
AllCops:
|
2
2
|
TargetRubyVersion: 2.6
|
3
|
+
NewCops: enable
|
4
|
+
SuggestExtensions: false
|
5
|
+
Exclude:
|
6
|
+
- 'gemfiles/*'
|
7
|
+
|
8
|
+
Gemspec/RequireMFA:
|
9
|
+
Enabled: false
|
3
10
|
|
4
11
|
Style/Documentation:
|
5
12
|
Enabled: false
|
@@ -12,5 +19,14 @@ Style/StringLiteralsInInterpolation:
|
|
12
19
|
Enabled: true
|
13
20
|
EnforcedStyle: single_quotes
|
14
21
|
|
22
|
+
Style/WordArray:
|
23
|
+
Enabled: false
|
24
|
+
|
15
25
|
Layout/LineLength:
|
16
26
|
Max: 120
|
27
|
+
Exclude:
|
28
|
+
- 'spec/support/seed.rb'
|
29
|
+
|
30
|
+
Metrics/BlockLength:
|
31
|
+
Exclude:
|
32
|
+
- 'spec/**/*'
|
data/Appraisals
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
appraise 'rails-6.0-stable' do
|
4
|
+
gem 'activerecord', '~> 6.0.0'
|
5
|
+
gem 'activesupport', '~> 6.0.0'
|
6
|
+
end
|
7
|
+
|
8
|
+
appraise 'rails-6.1-stable' do
|
9
|
+
gem 'activerecord', '~> 6.1.0'
|
10
|
+
gem 'activesupport', '~> 6.1.0'
|
11
|
+
end
|
12
|
+
|
13
|
+
appraise 'rails-7.0-stable' do
|
14
|
+
gem 'activerecord', '~> 7.0.0'
|
15
|
+
gem 'activesupport', '~> 7.0.0'
|
16
|
+
end
|
data/README.md
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
# Acb
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
3
|
+
Acb is a gem for formatting and outputting csv data from ActiveRecord data
|
6
4
|
|
7
5
|
## Installation
|
8
6
|
|
@@ -10,24 +8,61 @@ Install the gem and add to the application's Gemfile by executing:
|
|
10
8
|
|
11
9
|
$ bundle add acb
|
12
10
|
|
13
|
-
If bundler is not being used to manage dependencies, install the gem by executing:
|
14
|
-
|
15
|
-
$ gem install acb
|
16
11
|
|
17
12
|
## Usage
|
18
13
|
|
19
|
-
TODO: Write usage instructions here
|
20
14
|
|
21
|
-
|
15
|
+
```ruby
|
16
|
+
ActiveRecord::Schema.define do
|
17
|
+
create_table :users, force: true do |t|
|
18
|
+
t.string :name
|
19
|
+
end
|
20
|
+
|
21
|
+
create_table :posts, force: true do |t|
|
22
|
+
t.integer :user_id
|
23
|
+
t.timestamps
|
24
|
+
end
|
25
|
+
|
26
|
+
create_table :comments, force: true do |t|
|
27
|
+
t.integer :post_id
|
28
|
+
t.string :content
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class User < ActiveRecord::Base
|
33
|
+
has_many :posts
|
34
|
+
end
|
35
|
+
|
36
|
+
class Post < ActiveRecord::Base
|
37
|
+
belongs_to :user
|
38
|
+
has_many :comments
|
39
|
+
end
|
40
|
+
|
41
|
+
class Comment < ActiveRecord::Base
|
42
|
+
belongs_to :post
|
43
|
+
end
|
44
|
+
|
45
|
+
class PostCsvBuilder
|
46
|
+
include Acb
|
22
47
|
|
23
|
-
|
48
|
+
add_column name: 'id'
|
49
|
+
add_column name: 'User Name', index: 'user.name'
|
50
|
+
add_column name: 'created_at', format: '%Y-%m-%d'
|
51
|
+
add_column name: 'Comment Amount', index: 'comments.size'
|
52
|
+
add_column name: 'First Comment', index: ->(post) { post.comments.first&.content }
|
24
53
|
|
25
|
-
|
54
|
+
def initialize(user_id)
|
55
|
+
@data = Post.where(user_id: user_id)
|
56
|
+
end
|
26
57
|
|
27
|
-
|
58
|
+
def relations
|
59
|
+
[:user, :comments]
|
60
|
+
end
|
61
|
+
end
|
28
62
|
|
29
|
-
|
63
|
+
PostCsvBuilder.new(user_id).content_string
|
64
|
+
```
|
30
65
|
|
31
66
|
## Code of Conduct
|
32
67
|
|
33
|
-
Everyone interacting in the Acb project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/
|
68
|
+
Everyone interacting in the Acb project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/kakubin/acb/blob/main/CODE_OF_CONDUCT.md).
|
data/lib/acb/column.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Acb
|
4
|
+
class Column
|
5
|
+
attr_reader :name
|
6
|
+
|
7
|
+
def initialize(name, **options)
|
8
|
+
@name = name
|
9
|
+
@index = case options[:index]
|
10
|
+
when Proc
|
11
|
+
options[:index]
|
12
|
+
when String
|
13
|
+
options[:index].split('.')
|
14
|
+
else
|
15
|
+
[name]
|
16
|
+
end
|
17
|
+
@format = options[:format]
|
18
|
+
end
|
19
|
+
|
20
|
+
def digest(row)
|
21
|
+
data = _digest(row)
|
22
|
+
@format && data ? format(data) : data
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def _digest(row)
|
28
|
+
if @index.is_a?(Array)
|
29
|
+
@index.reduce(row) do |acc, mthd|
|
30
|
+
acc.send(mthd)
|
31
|
+
end
|
32
|
+
else
|
33
|
+
@index.call(row)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def format(data)
|
38
|
+
case data
|
39
|
+
when Date, Time
|
40
|
+
data.strftime(@format)
|
41
|
+
else
|
42
|
+
@format % data
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/acb/columns.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Acb
|
4
|
+
class Columns
|
5
|
+
def initialize
|
6
|
+
@columns = []
|
7
|
+
end
|
8
|
+
|
9
|
+
def push(name, **options)
|
10
|
+
@columns.push(Column.new(name, **options))
|
11
|
+
end
|
12
|
+
|
13
|
+
def header
|
14
|
+
@columns.map(&:name)
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_data(row)
|
18
|
+
@columns.map { |column| column.digest(row) }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/acb/version.rb
CHANGED
data/lib/acb.rb
CHANGED
@@ -2,108 +2,37 @@
|
|
2
2
|
|
3
3
|
require_relative 'acb/version'
|
4
4
|
require 'active_support'
|
5
|
-
require '
|
5
|
+
require 'csv'
|
6
6
|
|
7
7
|
module Acb
|
8
8
|
extend ActiveSupport::Concern
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
include Enumerable
|
13
|
-
|
14
|
-
attr_accessor :columns
|
15
|
-
|
16
|
-
def_delegator :@columns, :each
|
17
|
-
|
18
|
-
def initialize
|
19
|
-
@columns = []
|
20
|
-
end
|
21
|
-
|
22
|
-
def push(name, **options)
|
23
|
-
@columns.push(Column.new(name, **options))
|
24
|
-
end
|
25
|
-
|
26
|
-
def keys
|
27
|
-
@columns.map(&:name)
|
28
|
-
end
|
29
|
-
|
30
|
-
def get_data(row)
|
31
|
-
@columns.map { _1.digest(row) }
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
class Column
|
36
|
-
attr_reader :name
|
37
|
-
|
38
|
-
def initialize(name, **options)
|
39
|
-
@name = name
|
40
|
-
@index = case options[:index]
|
41
|
-
when Proc
|
42
|
-
options[:index]
|
43
|
-
when String
|
44
|
-
options[:index].split('.')
|
45
|
-
else
|
46
|
-
[name]
|
47
|
-
end
|
48
|
-
@format = options[:format]
|
49
|
-
end
|
50
|
-
|
51
|
-
def digest(row)
|
52
|
-
data = _digest(row)
|
53
|
-
@format && data ? format(data) : data
|
54
|
-
end
|
55
|
-
|
56
|
-
def _digest(row)
|
57
|
-
if @index.is_a?(Array)
|
58
|
-
@index.reduce(row) do |acc, set|
|
59
|
-
acc.send(set)
|
60
|
-
end
|
61
|
-
else
|
62
|
-
@index.call(row)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def format(data)
|
67
|
-
case data
|
68
|
-
when Date, Time
|
69
|
-
data.strftime(@format)
|
70
|
-
else
|
71
|
-
@format % data
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
10
|
+
autoload :Column, 'acb/column'
|
11
|
+
autoload :Columns, 'acb/columns'
|
75
12
|
|
76
13
|
class_methods do
|
77
|
-
def
|
78
|
-
@
|
14
|
+
def columns
|
15
|
+
@columns ||= Columns.new
|
79
16
|
end
|
80
17
|
|
81
18
|
def add_column(name:, **options)
|
82
|
-
|
19
|
+
columns.push(name, **options)
|
83
20
|
end
|
84
21
|
end
|
85
22
|
|
86
|
-
def initialize(options = {})
|
87
|
-
@options = options
|
88
|
-
end
|
89
|
-
|
90
23
|
def data
|
91
24
|
@data = @data.preload(relations) if respond_to?(:relations)
|
92
25
|
@data.find_each
|
93
26
|
end
|
94
27
|
|
95
|
-
def header
|
96
|
-
self.class.header.keys
|
97
|
-
end
|
98
|
-
|
99
28
|
def get_data_from(row)
|
100
|
-
self.class.
|
29
|
+
self.class.columns.get_data(row)
|
101
30
|
end
|
102
31
|
|
103
|
-
def content_string
|
104
|
-
header_content = header.join(',')
|
32
|
+
def content_string(**options)
|
33
|
+
header_content = self.class.columns.header.join(',')
|
105
34
|
|
106
|
-
CSV.generate(header_content,
|
35
|
+
CSV.generate(header_content, **options) do |csv|
|
107
36
|
data.each do |row|
|
108
37
|
csv << get_data_from(row)
|
109
38
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Akito Hikasa
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-12-
|
11
|
+
date: 2022-12-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -16,9 +16,51 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 6.0.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 6.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activerecord
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 6.0.0
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 6.0.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: appraisal
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: sqlite3
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
22
64
|
version_requirements: !ruby/object:Gem::Requirement
|
23
65
|
requirements:
|
24
66
|
- - ">="
|
@@ -33,13 +75,19 @@ extra_rdoc_files: []
|
|
33
75
|
files:
|
34
76
|
- ".rspec"
|
35
77
|
- ".rubocop.yml"
|
78
|
+
- Appraisals
|
36
79
|
- CHANGELOG.md
|
37
80
|
- CODE_OF_CONDUCT.md
|
38
81
|
- Gemfile
|
39
82
|
- LICENSE
|
40
83
|
- README.md
|
41
84
|
- Rakefile
|
85
|
+
- gemfiles/rails_6.0_stable.gemfile
|
86
|
+
- gemfiles/rails_6.1_stable.gemfile
|
87
|
+
- gemfiles/rails_7.0_stable.gemfile
|
42
88
|
- lib/acb.rb
|
89
|
+
- lib/acb/column.rb
|
90
|
+
- lib/acb/columns.rb
|
43
91
|
- lib/acb/version.rb
|
44
92
|
- sig/acb.rbs
|
45
93
|
homepage: https://github.com/kakubin/acb
|