acb 0.1.5 → 0.2.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 70841480cde94d2576aef69df161eb518f54408da050458d1078674aa02b2812
4
- data.tar.gz: f10c1ee92974a7d97baa779e73bfc90cf7d4d30637587f7b6475c6565f1f1bb9
3
+ metadata.gz: 8a8d54b873e3285ef684d8270c40cfb6af19958adf9c585ec6be198c9a865024
4
+ data.tar.gz: 1a69e9e082921b7a2462474479ec140b2bf43db9e307ab4f040ce6b1726620db
5
5
  SHA512:
6
- metadata.gz: aebf88bf60738a19583b02be227a150a787552c4381736a1ff9e99c0d56d0201ec8e452ea4bc8c8a971640e3b211b1c6fed141a8a3c915f617b64fea15e030f7
7
- data.tar.gz: 65c6fad9dcd3f0c0d516c236ac53e0ffba381592ebf785ad1d3c0a540354232d0779775ff8458911c3ef58407e1c8fffa97c80836c3b2cb79e996848bcc2a6ea
6
+ metadata.gz: 7203b2e35507032d117559c320e35157ced64eaf944bd66d76d75a83cd78a37c291dc3ad178fafdd9e886f99e931c58a9dbb6bab04c81b3ea17bf2131d9ec62c
7
+ data.tar.gz: 2db38718731c3e491dfa37f3205d173238ee8bc2c6e77784871ed635a1f6c71eb8e5465922ee9e72b6156a525e44e7205b4718b0fbf22af13c8eb4b3bb6d7ab9
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/Appraisals CHANGED
@@ -14,3 +14,8 @@ appraise 'rails-7.0-stable' do
14
14
  gem 'activerecord', '~> 7.0.0'
15
15
  gem 'activesupport', '~> 7.0.0'
16
16
  end
17
+
18
+ appraise 'rails-7.1-stable' do
19
+ gem 'activerecord', '~> 7.1.0'
20
+ gem 'activesupport', '~> 7.1.0'
21
+ end
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
@@ -0,0 +1,11 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rake", "~> 13.0"
6
+ gem "rspec", "~> 3.0"
7
+ gem "rubocop", "~> 1.21"
8
+ gem "activerecord", "~> 7.1.0"
9
+ gem "activesupport", "~> 7.1.0"
10
+
11
+ gemspec path: "../"
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.1'
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.1
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-12-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -86,10 +86,14 @@ files:
86
86
  - gemfiles/rails_6.0_stable.gemfile
87
87
  - gemfiles/rails_6.1_stable.gemfile
88
88
  - gemfiles/rails_7.0_stable.gemfile
89
+ - gemfiles/rails_7.1_stable.gemfile
89
90
  - lib/acb.rb
90
91
  - lib/acb/base.rb
91
92
  - lib/acb/column.rb
92
93
  - lib/acb/columns.rb
94
+ - lib/acb/custom.rb
95
+ - lib/acb/master_column.rb
96
+ - lib/acb/registry.rb
93
97
  - lib/acb/version.rb
94
98
  - sig/acb.rbs
95
99
  homepage: https://github.com/kakubin/acb