acb 0.1.4 → 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.
- checksums.yaml +4 -4
- data/.rubocop.yml +6 -0
- data/README.md +18 -1
- data/acb.gemspec +38 -0
- data/lib/acb/base.rb +36 -0
- data/lib/acb/columns.rb +9 -8
- data/lib/acb/custom.rb +30 -0
- data/lib/acb/master_column.rb +16 -0
- data/lib/acb/registry.rb +19 -0
- data/lib/acb/version.rb +1 -1
- data/lib/acb.rb +5 -27
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4f0a4f449bc6b7884f180b1dc1c863b5d5d7dba9636570db7be46d99f28d7e4f
|
4
|
+
data.tar.gz: 20889f756838c11b412c3bf4083a4f6f2b518fc9dd025ef1a2b590fa1cc4d849
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e26032a44ad895d6314f13ab83f6fd7a01d5b122976da2a36ad544e548f33feedecbd5741012d65b537f355cde0468a78927f7cac376cd9088288f16ffe6935
|
7
|
+
data.tar.gz: ddd21a6ca44b268aabd2c8f37d62a1d74e809cba29c1ea7f763a18f6889348e2167494bd175b49c31b88e2312853c0e98e291137657694a1bf2e2aa4f0a1162a
|
data/.rubocop.yml
CHANGED
@@ -5,6 +5,9 @@ AllCops:
|
|
5
5
|
Exclude:
|
6
6
|
- 'gemfiles/*'
|
7
7
|
|
8
|
+
Gemspec/DevelopmentDependencies:
|
9
|
+
EnforcedStyle: gemspec
|
10
|
+
|
8
11
|
Gemspec/RequireMFA:
|
9
12
|
Enabled: false
|
10
13
|
|
@@ -30,3 +33,6 @@ Layout/LineLength:
|
|
30
33
|
Metrics/BlockLength:
|
31
34
|
Exclude:
|
32
35
|
- 'spec/**/*'
|
36
|
+
|
37
|
+
Naming/MemoizedInstanceVariableName:
|
38
|
+
Enabled: false
|
data/README.md
CHANGED
@@ -60,7 +60,24 @@ class PostCsvBuilder
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
-
PostCsvBuilder.new(user_id).
|
63
|
+
PostCsvBuilder.new(user_id).to_csv
|
64
|
+
|
65
|
+
# or
|
66
|
+
|
67
|
+
class PostCsvBuilder
|
68
|
+
include Acb
|
69
|
+
|
70
|
+
add_column name: 'id'
|
71
|
+
add_column name: 'User Name', index: 'user.name'
|
72
|
+
add_column name: 'created_at', format: '%Y-%m-%d'
|
73
|
+
add_column name: 'Comment Amount', index: 'comments.size'
|
74
|
+
add_column name: 'First Comment', index: ->(post) { post.comments.first&.content }
|
75
|
+
end
|
76
|
+
|
77
|
+
builder = PostCsvBuilder.new
|
78
|
+
relations = Post.where(user_id: user_id).preload(:user, :comments)
|
79
|
+
builder.load_from(relations)
|
80
|
+
builder.to_csv
|
64
81
|
```
|
65
82
|
|
66
83
|
## Code of Conduct
|
data/acb.gemspec
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'lib/acb/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'acb'
|
7
|
+
spec.version = Acb::VERSION
|
8
|
+
spec.authors = ['Akito Hikasa']
|
9
|
+
spec.email = ['wetsand.wfs@gmail.com']
|
10
|
+
|
11
|
+
spec.summary = %(ActiveRecord CSV Builder)
|
12
|
+
spec.description = %(ActiveRecord CSV Builder)
|
13
|
+
spec.homepage = 'https://github.com/kakubin/acb'
|
14
|
+
spec.required_ruby_version = '>= 2.6.0'
|
15
|
+
|
16
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
17
|
+
|
18
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
19
|
+
spec.metadata['source_code_uri'] = spec.homepage
|
20
|
+
# spec.metadata["changelog_uri"] = 'TODO: Put your gem's CHANGELOG.md URL here.'
|
21
|
+
|
22
|
+
# Specify which files should be added to the gem when it is released.
|
23
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
24
|
+
spec.files = Dir.chdir(__dir__) do
|
25
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
26
|
+
(f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
|
27
|
+
end
|
28
|
+
end
|
29
|
+
spec.bindir = 'exe'
|
30
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
31
|
+
spec.require_paths = ['lib']
|
32
|
+
|
33
|
+
spec.add_dependency 'activesupport', '>= 6.0.0'
|
34
|
+
|
35
|
+
spec.add_development_dependency 'activerecord', '>= 6.0.0'
|
36
|
+
spec.add_development_dependency 'appraisal'
|
37
|
+
spec.add_development_dependency 'sqlite3'
|
38
|
+
end
|
data/lib/acb/base.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Acb
|
4
|
+
module Base
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
include Columns
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_csv(**options)
|
12
|
+
CSV.generate(**options) do |csv|
|
13
|
+
csv << self.class.header
|
14
|
+
data.each do |row|
|
15
|
+
csv << summarize(row)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
alias content_string to_csv
|
20
|
+
|
21
|
+
def load_from(relations)
|
22
|
+
@data = relations
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def data
|
28
|
+
@data = @data.preload(relations) if respond_to?(:relations)
|
29
|
+
@data.find_each
|
30
|
+
end
|
31
|
+
|
32
|
+
def summarize(row)
|
33
|
+
self.class.summarize(row)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/acb/columns.rb
CHANGED
@@ -1,21 +1,22 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Acb
|
4
|
-
|
5
|
-
def
|
6
|
-
@
|
4
|
+
module Columns
|
5
|
+
def columns
|
6
|
+
@_columns ||= []
|
7
7
|
end
|
8
8
|
|
9
|
-
def
|
10
|
-
|
9
|
+
def add_column(column = nil, name: nil, **options)
|
10
|
+
column ||= Column.new(name, **options)
|
11
|
+
columns.push(column)
|
11
12
|
end
|
12
13
|
|
13
14
|
def header
|
14
|
-
|
15
|
+
columns.map(&:name)
|
15
16
|
end
|
16
17
|
|
17
|
-
def
|
18
|
-
|
18
|
+
def summarize(data)
|
19
|
+
columns.map { |column| column.digest(data) }
|
19
20
|
end
|
20
21
|
end
|
21
22
|
end
|
data/lib/acb/custom.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Acb
|
4
|
+
module Custom
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
class_attribute :registry, instance_accessor: false, instance_predicate: false, default: Registry.new
|
9
|
+
end
|
10
|
+
|
11
|
+
module ClassMethods
|
12
|
+
def add_master_column(key:, **options)
|
13
|
+
registry.push(MasterColumn.new(key, **options))
|
14
|
+
end
|
15
|
+
|
16
|
+
def use(columns)
|
17
|
+
klass = Class.new do
|
18
|
+
include Acb::Base
|
19
|
+
end
|
20
|
+
|
21
|
+
columns.each do |column|
|
22
|
+
master_column = registry.lookup(column[:key])
|
23
|
+
klass.add_column(master_column.to_column(column[:name]))
|
24
|
+
end
|
25
|
+
|
26
|
+
klass
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/acb/registry.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Acb
|
4
|
+
class Registry
|
5
|
+
class ColumnNotFound < StandardError; end
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@registrations = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def push(master_column)
|
12
|
+
@registrations.push(master_column)
|
13
|
+
end
|
14
|
+
|
15
|
+
def lookup(key)
|
16
|
+
@registrations.find { |registration| registration.key == key } or raise ColumnNotFound
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/acb/version.rb
CHANGED
data/lib/acb.rb
CHANGED
@@ -7,34 +7,12 @@ require 'csv'
|
|
7
7
|
module Acb
|
8
8
|
extend ActiveSupport::Concern
|
9
9
|
|
10
|
+
autoload :Base, 'acb/base'
|
10
11
|
autoload :Column, 'acb/column'
|
11
12
|
autoload :Columns, 'acb/columns'
|
13
|
+
autoload :Custom, 'acb/custom'
|
14
|
+
autoload :MasterColumn, 'acb/master_column'
|
15
|
+
autoload :Registry, 'acb/registry'
|
12
16
|
|
13
|
-
|
14
|
-
def columns
|
15
|
-
@columns ||= Columns.new
|
16
|
-
end
|
17
|
-
|
18
|
-
def add_column(name:, **options)
|
19
|
-
columns.push(name, **options)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def data
|
24
|
-
@data = @data.preload(relations) if respond_to?(:relations)
|
25
|
-
@data.find_each
|
26
|
-
end
|
27
|
-
|
28
|
-
def get_data_from(row)
|
29
|
-
self.class.columns.get_data(row)
|
30
|
-
end
|
31
|
-
|
32
|
-
def content_string(**options)
|
33
|
-
CSV.generate(**options) do |csv|
|
34
|
-
csv << self.class.columns.header
|
35
|
-
data.each do |row|
|
36
|
-
csv << get_data_from(row)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
17
|
+
include Base
|
40
18
|
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.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Akito Hikasa
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-10-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -82,12 +82,17 @@ files:
|
|
82
82
|
- LICENSE
|
83
83
|
- README.md
|
84
84
|
- Rakefile
|
85
|
+
- acb.gemspec
|
85
86
|
- gemfiles/rails_6.0_stable.gemfile
|
86
87
|
- gemfiles/rails_6.1_stable.gemfile
|
87
88
|
- gemfiles/rails_7.0_stable.gemfile
|
88
89
|
- lib/acb.rb
|
90
|
+
- lib/acb/base.rb
|
89
91
|
- lib/acb/column.rb
|
90
92
|
- lib/acb/columns.rb
|
93
|
+
- lib/acb/custom.rb
|
94
|
+
- lib/acb/master_column.rb
|
95
|
+
- lib/acb/registry.rb
|
91
96
|
- lib/acb/version.rb
|
92
97
|
- sig/acb.rbs
|
93
98
|
homepage: https://github.com/kakubin/acb
|
@@ -111,7 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
111
116
|
- !ruby/object:Gem::Version
|
112
117
|
version: '0'
|
113
118
|
requirements: []
|
114
|
-
rubygems_version: 3.
|
119
|
+
rubygems_version: 3.4.10
|
115
120
|
signing_key:
|
116
121
|
specification_version: 4
|
117
122
|
summary: ActiveRecord CSV Builder
|