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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9e3c77997c9ede024d51be4db16615292e55b6014482f31f7688d7a9762acb3d
4
- data.tar.gz: 88b9d179edbc54240d77b4625f1386f519284c8fa07a98b024e0be4dd1790c12
3
+ metadata.gz: 4f0a4f449bc6b7884f180b1dc1c863b5d5d7dba9636570db7be46d99f28d7e4f
4
+ data.tar.gz: 20889f756838c11b412c3bf4083a4f6f2b518fc9dd025ef1a2b590fa1cc4d849
5
5
  SHA512:
6
- metadata.gz: 246cf3749a975639a8086ac4d7e96f3f3e1545e8ef3ade4caa853952e9310c89f90cf0b2bdff4da888814d836e344e3e89727a32d190b2c62457bc513aec68cb
7
- data.tar.gz: 7c3eda99c5133d3367fd4f19bf36b8d68a8788175074d3eedf88cdfad65df3c2c7a0a8dcf137c204bf4330f2c6f403b78a668062aae8983c75e6487b9521b03c
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).content_string
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
- 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.4'
4
+ VERSION = '0.2.0'
5
5
  end
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
- class_methods do
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.1.4
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-03-29 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
@@ -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.3.7
119
+ rubygems_version: 3.4.10
115
120
  signing_key:
116
121
  specification_version: 4
117
122
  summary: ActiveRecord CSV Builder