acb 0.1.5 → 0.2.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
2
  SHA256:
3
- metadata.gz: 70841480cde94d2576aef69df161eb518f54408da050458d1078674aa02b2812
4
- data.tar.gz: f10c1ee92974a7d97baa779e73bfc90cf7d4d30637587f7b6475c6565f1f1bb9
3
+ metadata.gz: 4f0a4f449bc6b7884f180b1dc1c863b5d5d7dba9636570db7be46d99f28d7e4f
4
+ data.tar.gz: 20889f756838c11b412c3bf4083a4f6f2b518fc9dd025ef1a2b590fa1cc4d849
5
5
  SHA512:
6
- metadata.gz: aebf88bf60738a19583b02be227a150a787552c4381736a1ff9e99c0d56d0201ec8e452ea4bc8c8a971640e3b211b1c6fed141a8a3c915f617b64fea15e030f7
7
- data.tar.gz: 65c6fad9dcd3f0c0d516c236ac53e0ffba381592ebf785ad1d3c0a540354232d0779775ff8458911c3ef58407e1c8fffa97c80836c3b2cb79e996848bcc2a6ea
6
+ metadata.gz: 4e26032a44ad895d6314f13ab83f6fd7a01d5b122976da2a36ad544e548f33feedecbd5741012d65b537f355cde0468a78927f7cac376cd9088288f16ffe6935
7
+ data.tar.gz: ddd21a6ca44b268aabd2c8f37d62a1d74e809cba29c1ea7f763a18f6889348e2167494bd175b49c31b88e2312853c0e98e291137657694a1bf2e2aa4f0a1162a
data/.rubocop.yml CHANGED
@@ -33,3 +33,6 @@ Layout/LineLength:
33
33
  Metrics/BlockLength:
34
34
  Exclude:
35
35
  - 'spec/**/*'
36
+
37
+ Naming/MemoizedInstanceVariableName:
38
+ Enabled: false
data/README.md CHANGED
@@ -61,6 +61,23 @@ class PostCsvBuilder
61
61
  end
62
62
 
63
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/lib/acb/base.rb CHANGED
@@ -4,26 +4,24 @@ module Acb
4
4
  module Base
5
5
  extend ActiveSupport::Concern
6
6
 
7
- class_methods do
8
- def columns
9
- @columns ||= Columns.new
10
- end
11
-
12
- def add_column(name:, **options)
13
- columns.push(name, **options)
14
- end
7
+ module ClassMethods
8
+ include Columns
15
9
  end
16
10
 
17
11
  def to_csv(**options)
18
12
  CSV.generate(**options) do |csv|
19
- csv << self.class.columns.header
13
+ csv << self.class.header
20
14
  data.each do |row|
21
- csv << get_data_from(row)
15
+ csv << summarize(row)
22
16
  end
23
17
  end
24
18
  end
25
19
  alias content_string to_csv
26
20
 
21
+ def load_from(relations)
22
+ @data = relations
23
+ end
24
+
27
25
  private
28
26
 
29
27
  def data
@@ -31,8 +29,8 @@ module Acb
31
29
  @data.find_each
32
30
  end
33
31
 
34
- def get_data_from(row)
35
- self.class.columns.get_data(row)
32
+ def summarize(row)
33
+ self.class.summarize(row)
36
34
  end
37
35
  end
38
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
- class Columns
5
- def initialize
6
- @columns = []
4
+ module Columns
5
+ def columns
6
+ @_columns ||= []
7
7
  end
8
8
 
9
- def push(name, **options)
10
- @columns.push(Column.new(name, **options))
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
- @columns.map(&:name)
15
+ columns.map(&:name)
15
16
  end
16
17
 
17
- def get_data(row)
18
- @columns.map { |column| column.digest(row) }
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
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Acb
4
+ class MasterColumn
5
+ attr_reader :key
6
+
7
+ def initialize(key, **options)
8
+ @key = key
9
+ @options = options
10
+ end
11
+
12
+ def to_column(name)
13
+ Column.new(name, **@options)
14
+ end
15
+ end
16
+ end
@@ -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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Acb
4
- VERSION = '0.1.5'
4
+ VERSION = '0.2.0'
5
5
  end
data/lib/acb.rb CHANGED
@@ -10,6 +10,9 @@ module Acb
10
10
  autoload :Base, 'acb/base'
11
11
  autoload :Column, 'acb/column'
12
12
  autoload :Columns, 'acb/columns'
13
+ autoload :Custom, 'acb/custom'
14
+ autoload :MasterColumn, 'acb/master_column'
15
+ autoload :Registry, 'acb/registry'
13
16
 
14
17
  include Base
15
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.1.5
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-09-10 00:00:00.000000000 Z
11
+ date: 2023-10-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -90,6 +90,9 @@ files:
90
90
  - lib/acb/base.rb
91
91
  - lib/acb/column.rb
92
92
  - lib/acb/columns.rb
93
+ - lib/acb/custom.rb
94
+ - lib/acb/master_column.rb
95
+ - lib/acb/registry.rb
93
96
  - lib/acb/version.rb
94
97
  - sig/acb.rbs
95
98
  homepage: https://github.com/kakubin/acb