google_drive_maintained 3.0.8 → 3.0.11

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: 053ec12cbcb796741fed97379aef78d54f814e7e5523a8cf211e76e38e3ecc47
4
- data.tar.gz: b78c0f974f0aa64a7e374be74af0edf24d29a5661ba3bd7949f2649be16db64f
3
+ metadata.gz: 3bc8471dadbc68ec2f2b2d4a27e44676fea447970d445b7e4554dd31183ec7a9
4
+ data.tar.gz: 6923ff6cda79e893cd884fa0271ca9617b0cfafae82d0117333f521b2551e86a
5
5
  SHA512:
6
- metadata.gz: 52729ed042007b2a3855b8bcb8a8c037835e290cf12c2029bd4599e87ff7f1145aecba9416ee9b44ee3324c454bc86c3773f572cadefee97fab6d71774f5c14f
7
- data.tar.gz: e87ae8f3694dec1a7e0502f81a32b9b2425bfaa84aa11e1a564fccd5d0425f0b899b383e003acd8eaa0f99a7bc9fcbcfec3ac28c6685bc0a10370e87ce0474e0
6
+ metadata.gz: 6f61fb3b709779d9c9530b4a55fa33f6c962f094605f0188efff6dce304e728ea923d9b9d1f5147d7290daf8e7ed9b3a6adfe5f3f885635abd637e10b375d411
7
+ data.tar.gz: 625b06e7bc2c79e164aaaed1f1f4c48440e87a2f7a86edd89beacbeeef3445f4fc2dfeef69817c807b74b8934e6b3a2e51571ca0c54c4156b3037c4602ff6b8c
data/README.md CHANGED
@@ -1,9 +1,34 @@
1
- # google-drive-ruby [![Build Status](https://travis-ci.org/gimite/google-drive-ruby.svg?branch=master)](https://travis-ci.org/gimite/google-drive-ruby)
1
+ # google-drive-ruby
2
+
3
+ [![Gem](https://img.shields.io/gem/v/google_drive_maintained.svg)](https://rubygems.org/gems/google_drive_maintained)
4
+ [![GitHub Actions Workflow Status](https://github.com/y-bonfire/google-drive-ruby-maintained/actions/workflows/ci.yml/badge.svg)](https://github.com/y-bonfire/google-drive-ruby-maintained/actions/workflows/ci.yml)
2
5
 
3
6
  This is a Ruby library to read/write files/spreadsheets in Google Drive/Docs.
4
7
 
5
8
  NOTE: This is NOT a library to create Google Drive App.
6
- NOTE: This is an unofficial maintained fork of google-drive-ruby, originally created by Hiroshi Ichikawa.
9
+
10
+ ## Introduction
11
+ ⚠️This is an unofficial maintained fork of [gimite/google-drive-ruby](https://github.com/gimite/google-drive-ruby), originally created by Hiroshi Ichikawa.
12
+
13
+ We focus on preserving compatibility and fixing bugs, with minimal disruptive changes.
14
+ New features may be added carefully when justified, but the core behavior will remain stable.
15
+
16
+ See [this issue](https://github.com/y-bonfire/google-drive-ruby-maintained/issues/7) for background and intent.
17
+
18
+ ## Contributing
19
+
20
+ We are actively working on improving the library, updating dependencies, and refining the development workflow.
21
+ If you'd like to contribute, please check [CONTRIBUTING.md](./CONTRIBUTING.md) for up-to-date contribution guidelines and technical notes (CI, testing, gem build, etc.).
22
+
23
+
24
+ ✅ GitHub Actions Integration
25
+ We've started testing this library with GitHub Actions:
26
+ 👉 [CI Workflow Link](https://github.com/y-bonfire/google-drive-ruby-maintained/actions)
27
+
28
+ This enables automated testing on every push and pull request, helping ensure long-term reliability.
29
+ We welcome feedback and contributions to improve the CI process or test coverage. 🤗
30
+
31
+ ## table of contents
7
32
 
8
33
  * [Migration from ver. 2.x.x or before](#migration)
9
34
  * [How to install](#install)
@@ -19,7 +44,7 @@ NOTE: This is an unofficial maintained fork of google-drive-ruby, originally cre
19
44
  ## <a name="migration">Migration from ver. 2.x.x or before</a>
20
45
 
21
46
  There are some incompatible API changes. See
22
- [MIGRATING.md](https://github.com/gimite/google-drive-ruby/blob/master/MIGRATING.md).
47
+ [MIGRATING.md](MIGRATING.md).
23
48
 
24
49
 
25
50
  ## <a name="install">How to install</a>
@@ -27,7 +52,7 @@ There are some incompatible API changes. See
27
52
  Add this line to your application's Gemfile:
28
53
 
29
54
  ```ruby
30
- gem 'google_drive'
55
+ gem 'google_drive_maintained'
31
56
  ```
32
57
 
33
58
  And then execute:
@@ -39,20 +64,20 @@ $ bundle
39
64
  Or install it yourself as:
40
65
 
41
66
  ```
42
- $ gem install google_drive
67
+ $ gem install google_drive_maintained
43
68
  ```
44
69
 
45
70
  If you need system wide installation, execute below:
46
71
 
47
72
  ```
48
- $ sudo gem install google_drive
73
+ $ sudo gem install google_drive_maintained
49
74
  ```
50
75
 
51
76
  ## <a name="use">How to use</a>
52
77
 
53
78
  ### Authorization
54
79
 
55
- Follow one of the options in [Authorization](https://github.com/gimite/google-drive-ruby/blob/master/doc/authorization.md) to construct a session object. The example code below assumes "On behalf of you" option.
80
+ Follow one of the options in [Authorization](doc/authorization.md) to construct a session object. The example code below assumes "On behalf of you" option.
56
81
 
57
82
  ### Example to read/write files in Google Drive
58
83
 
@@ -128,7 +153,7 @@ New BSD Licence.
128
153
 
129
154
  ## <a name="environments">Supported environments</a>
130
155
 
131
- Ruby 3.0.0 or later. Checked with Ruby 3.3.0.
156
+ Ruby 3.2.0 or later. Checked with Ruby 3.3.0.
132
157
 
133
158
 
134
159
  ## <a name="author">Author</a>
@@ -0,0 +1,53 @@
1
+ require 'forwardable'
2
+
3
+ module GoogleDrive
4
+
5
+ class Cell
6
+ attr_reader :row, :col, :value
7
+
8
+ # @!attribute [r] properties
9
+ # @return [Hash] properties
10
+ attr_reader :properties
11
+
12
+ # @!attribute [rw] worksheet
13
+ # @return [Worksheet] worksheet
14
+ attr_accessor :worksheet
15
+
16
+ def initialize(worksheet, row, col, value, properties = {})
17
+ @worksheet = worksheet
18
+ @row = row
19
+ @col = col
20
+ @value = value
21
+ @properties = properties || {}
22
+ end
23
+
24
+ def ==(other)
25
+ case other
26
+ when GoogleDrive::Cell
27
+ @value == other.value
28
+ else
29
+ @value == other
30
+ end
31
+ end
32
+
33
+ def to_s
34
+ @value.to_s
35
+ end
36
+
37
+ def encoding
38
+ @value.respond_to?(:encoding) ? value.encoding : nil
39
+ end
40
+
41
+ def background_color=(color)
42
+ @worksheet.set_background_color(@row, @col, 1, 1, color)
43
+ end
44
+
45
+ def set_hyperlink_rich(text, hyperlink)
46
+ @worksheet.set_hyperlink_rich(@row, @col, 1, 1, text, hyperlink)
47
+ end
48
+
49
+ def hyperlink
50
+ @properties[:hyperlink]
51
+ end
52
+ end
53
+ end
@@ -96,7 +96,7 @@ module GoogleDrive
96
96
  def download_to_file(path, params = {})
97
97
  @session.drive_service.get_file(
98
98
  id,
99
- { download_dest: path, supports_all_drives: true }.merge(params)
99
+ **{ download_dest: path, supports_all_drives: true }.merge(params)
100
100
  )
101
101
  end
102
102
 
@@ -77,6 +77,7 @@ module GoogleDrive
77
77
  # As with from_config, you can configure Google API client behavior with
78
78
  # +client_options+ and +request_options+. Unlike in from_config, these
79
79
  # are passed as positional arguments.
80
+ # @return [GoogleDrive::Session]
80
81
  def self.from_service_account_key(
81
82
  json_key_path_or_io, scope = DEFAULT_SCOPE, client_options = nil,
82
83
  request_options = nil
@@ -270,6 +271,19 @@ module GoogleDrive
270
271
  # If given an Array, traverses folders by title. e.g.:
271
272
  # session.file_by_title(
272
273
  # ["myfolder", "mysubfolder/even/w/slash", "myfile"])
274
+ # root
275
+ # └── myfolder
276
+ # └── mysubfolder/even/w/slash
277
+ # └── myfile
278
+ # In Google Drive,
279
+ #
280
+ # "mysubfolder/even/w/slash"
281
+ #
282
+ # is a folder with a single name that includes a slash.
283
+ # For example, you can create a folder named mysubfolder/even/w/slash directly
284
+ # This is not a UNIX-style "path."
285
+ #
286
+ # @return [GoogleDrive::File]
273
287
  def file_by_title(title)
274
288
  if title.is_a?(Array)
275
289
  root_collection.file_by_title(title)
@@ -329,6 +343,7 @@ module GoogleDrive
329
343
  # # https://docs.google.com/spreadsheets/d/1L3-kvwJblyW_TvjYD-7pE-AXxw5_bkb6S_MljuIPVL0/edit
330
344
  # session.spreadsheet_by_key(
331
345
  # "1L3-kvwJblyW_TvjYD-7pE-AXxw5_bkb6S_MljuIPVL0")
346
+ # @return [GoogleDrive::Spreadsheet]
332
347
  def spreadsheet_by_key(key)
333
348
  file = file_by_id(key)
334
349
  unless file.is_a?(Spreadsheet)
@@ -48,6 +48,7 @@ module GoogleDrive
48
48
  end
49
49
 
50
50
  # Returns worksheets of the spreadsheet as array of GoogleDrive::Worksheet.
51
+ # @return [Array<GoogleDrive::Worksheet>]
51
52
  def worksheets
52
53
  api_spreadsheet = @session.sheets_service.get_spreadsheet(id, fields: 'sheets.properties')
53
54
  api_spreadsheet.sheets.map{ |s| Worksheet.new(@session, self, s.properties) }
@@ -27,6 +27,7 @@ module GoogleDrive
27
27
  '.htm' => 'text/html',
28
28
  '.html' => 'text/html',
29
29
  '.zip' => 'application/zip',
30
+ '.epub' => 'application/epub+zip',
30
31
  '.swf' => 'application/x-shockwave-flash'
31
32
  }.freeze
32
33
 
@@ -5,10 +5,10 @@ require 'cgi'
5
5
  require 'set'
6
6
  require 'uri'
7
7
 
8
- require 'google_drive/util'
9
- require 'google_drive/error'
10
- require 'google_drive/list'
11
- require_relative "worksheet_formatting"
8
+ require_relative 'util'
9
+ require_relative 'error'
10
+ require_relative 'list'
11
+ require_relative "cell"
12
12
 
13
13
  module GoogleDrive
14
14
  # A worksheet (i.e. a tab) in a spreadsheet.
@@ -16,7 +16,6 @@ module GoogleDrive
16
16
  # object.
17
17
  class Worksheet
18
18
  include(Util)
19
- include(WorksheetFormatting)
20
19
 
21
20
  # A few default color instances that match the colors from the Google Sheets web UI.
22
21
  #
@@ -63,6 +62,7 @@ module GoogleDrive
63
62
  @cells = nil
64
63
  @input_values = nil
65
64
  @numeric_values = nil
65
+ @cell_properties = nil
66
66
  @modified = Set.new
67
67
  @list = nil
68
68
  @v4_requests = []
@@ -171,7 +171,7 @@ module GoogleDrive
171
171
  def [](*args)
172
172
  (row, col) = parse_cell_args(args)
173
173
  value = cells[[row, col]] || ''
174
- Cell.new(self, row, col, value)
174
+ Cell.new(self, row, col, value, @cell_properties[[row, col]])
175
175
  end
176
176
 
177
177
  # Updates content of the cell.
@@ -192,6 +192,7 @@ module GoogleDrive
192
192
  @cells[[row, col]] = value
193
193
  @input_values[[row, col]] = value
194
194
  @numeric_values[[row, col]] = nil
195
+ @cell_properties[[row, col]] = nil
195
196
  @modified.add([row, col])
196
197
  self.max_rows = row if row > @max_rows
197
198
  self.max_cols = col if col > @max_cols
@@ -391,7 +392,7 @@ module GoogleDrive
391
392
  ranges: "'%s'" % @title,
392
393
  fields:
393
394
  'sheets(properties,data.rowData.values' \
394
- '(formattedValue,userEnteredValue,effectiveValue))'
395
+ '(formattedValue,userEnteredValue,effectiveValue,hyperlink))'
395
396
  )
396
397
  api_sheet = api_spreadsheet.sheets[0]
397
398
  set_properties(api_sheet.properties)
@@ -419,7 +420,7 @@ module GoogleDrive
419
420
  })
420
421
  end
421
422
 
422
- if !@v4_requests.empty?
423
+ unless @v4_requests.empty?
423
424
  self.spreadsheet.batch_update(@v4_requests)
424
425
  @v4_requests = []
425
426
  sent = true
@@ -588,6 +589,28 @@ module GoogleDrive
588
589
  format_cells(top_row, left_col, num_rows, num_cols, format, fields)
589
590
  end
590
591
 
592
+ def set_hyperlink_rich(top_row, left_col, num_rows, num_cols, text, uri)
593
+ cell = Google::Apis::SheetsV4::CellData.new(
594
+ user_entered_value: Google::Apis::SheetsV4::ExtendedValue.new(string_value: text),
595
+ text_format_runs: [
596
+ Google::Apis::SheetsV4::TextFormatRun.new(
597
+ start_index: 0,
598
+ format: Google::Apis::SheetsV4::TextFormat.new(
599
+ link: Google::Apis::SheetsV4::Link.new(uri: uri)
600
+ )
601
+ )
602
+ ]
603
+ )
604
+
605
+ add_request(
606
+ repeat_cell: Google::Apis::SheetsV4::RepeatCellRequest.new(
607
+ range: v4_range_object(top_row, left_col, num_rows, num_cols),
608
+ cell: cell,
609
+ fields: 'userEnteredValue,textFormatRuns'
610
+ )
611
+ )
612
+ end
613
+
591
614
  # Changes the background color on a range of cells. e.g.:
592
615
  # worksheet.set_background_color(1, 1, 1, 1, GoogleDrive::Worksheet::Colors::DARK_YELLOW_1)
593
616
  #
@@ -635,7 +658,7 @@ module GoogleDrive
635
658
  # {bottom: Google::Apis::SheetsV4::Border.new(
636
659
  # style: "DOUBLE", color: GoogleDrive::Worksheet::Colors::BLACK)})
637
660
  def update_borders(top_row, left_col, num_rows, num_cols, borders)
638
- request = Google::Apis::SheetsV4::UpdateBordersRequest.new(borders)
661
+ request = Google::Apis::SheetsV4::UpdateBordersRequest.new(**borders)
639
662
  request.range = v4_range_object(top_row, left_col, num_rows, num_cols)
640
663
  add_request({update_borders: request})
641
664
  end
@@ -685,7 +708,7 @@ module GoogleDrive
685
708
  @session.sheets_service.get_spreadsheet(
686
709
  spreadsheet.id,
687
710
  ranges: "'%s'" % @remote_title,
688
- fields: 'sheets.data.rowData.values(formattedValue,userEnteredValue,effectiveValue)'
711
+ fields: 'sheets.data.rowData.values(formattedValue,userEnteredValue,effectiveValue,hyperlink)'
689
712
  )
690
713
  update_cells_from_api_sheet(response.sheets[0])
691
714
  end
@@ -698,17 +721,19 @@ module GoogleDrive
698
721
  @cells = {}
699
722
  @input_values = {}
700
723
  @numeric_values = {}
724
+ @cell_properties = {}
701
725
 
702
726
  rows_data.each_with_index do |row_data, r|
703
- next if !row_data.values
727
+ next unless row_data.values
704
728
  @num_cols = row_data.values.size if row_data.values.size > @num_cols
705
729
  row_data.values.each_with_index do |cell_data, c|
706
730
  k = [r + 1, c + 1]
707
731
  @cells[k] = cell_data.formatted_value || ''
708
732
  @input_values[k] = extended_value_to_str(cell_data.user_entered_value)
709
733
  @numeric_values[k] =
710
- cell_data.effective_value && cell_data.effective_value.number_value ?
734
+ cell_data.effective_value&.number_value ?
711
735
  cell_data.effective_value.number_value.to_f : nil
736
+ @cell_properties[k] = { hyperlink: cell_data.hyperlink }
712
737
  end
713
738
  end
714
739
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: google_drive_maintained
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.8
4
+ version: 3.0.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hiroshi Ichikawa
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-07-25 00:00:00.000000000 Z
11
+ date: 2025-08-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -16,7 +16,7 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 1.5.3
19
+ version: '1.18'
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
22
  version: 2.0.0
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: 1.5.3
29
+ version: '1.18'
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
32
  version: 2.0.0
@@ -34,62 +34,44 @@ dependencies:
34
34
  name: google-apis-drive_v3
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - "~>"
38
- - !ruby/object:Gem::Version
39
- version: '0.5'
40
37
  - - ">="
41
38
  - !ruby/object:Gem::Version
42
- version: 0.5.0
39
+ version: 0.63.0
43
40
  type: :runtime
44
41
  prerelease: false
45
42
  version_requirements: !ruby/object:Gem::Requirement
46
43
  requirements:
47
- - - "~>"
48
- - !ruby/object:Gem::Version
49
- version: '0.5'
50
44
  - - ">="
51
45
  - !ruby/object:Gem::Version
52
- version: 0.5.0
46
+ version: 0.63.0
53
47
  - !ruby/object:Gem::Dependency
54
48
  name: google-apis-sheets_v4
55
49
  requirement: !ruby/object:Gem::Requirement
56
50
  requirements:
57
- - - "~>"
58
- - !ruby/object:Gem::Version
59
- version: '0.4'
60
51
  - - ">="
61
52
  - !ruby/object:Gem::Version
62
- version: 0.4.0
53
+ version: 0.42.0
63
54
  type: :runtime
64
55
  prerelease: false
65
56
  version_requirements: !ruby/object:Gem::Requirement
66
57
  requirements:
67
- - - "~>"
68
- - !ruby/object:Gem::Version
69
- version: '0.4'
70
58
  - - ">="
71
59
  - !ruby/object:Gem::Version
72
- version: 0.4.0
60
+ version: 0.42.0
73
61
  - !ruby/object:Gem::Dependency
74
62
  name: googleauth
75
63
  requirement: !ruby/object:Gem::Requirement
76
64
  requirements:
77
- - - "~>"
78
- - !ruby/object:Gem::Version
79
- version: '0.5'
80
65
  - - ">="
81
66
  - !ruby/object:Gem::Version
82
- version: 0.5.0
67
+ version: '1.14'
83
68
  type: :runtime
84
69
  prerelease: false
85
70
  version_requirements: !ruby/object:Gem::Requirement
86
71
  requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '0.5'
90
72
  - - ">="
91
73
  - !ruby/object:Gem::Version
92
- version: 0.5.0
74
+ version: '1.14'
93
75
  - !ruby/object:Gem::Dependency
94
76
  name: test-unit
95
77
  requirement: !ruby/object:Gem::Requirement
@@ -114,22 +96,16 @@ dependencies:
114
96
  name: rake
115
97
  requirement: !ruby/object:Gem::Requirement
116
98
  requirements:
117
- - - "~>"
118
- - !ruby/object:Gem::Version
119
- version: '0.8'
120
99
  - - ">="
121
100
  - !ruby/object:Gem::Version
122
- version: 0.8.0
101
+ version: 13.0.3
123
102
  type: :development
124
103
  prerelease: false
125
104
  version_requirements: !ruby/object:Gem::Requirement
126
105
  requirements:
127
- - - "~>"
128
- - !ruby/object:Gem::Version
129
- version: '0.8'
130
106
  - - ">="
131
107
  - !ruby/object:Gem::Version
132
- version: 0.8.0
108
+ version: 13.0.3
133
109
  - !ruby/object:Gem::Dependency
134
110
  name: rspec-mocks
135
111
  requirement: !ruby/object:Gem::Requirement
@@ -167,6 +143,7 @@ files:
167
143
  - lib/google_drive/acl_entry.rb
168
144
  - lib/google_drive/api_client_fetcher.rb
169
145
  - lib/google_drive/authentication_error.rb
146
+ - lib/google_drive/cell.rb
170
147
  - lib/google_drive/collection.rb
171
148
  - lib/google_drive/config.rb
172
149
  - lib/google_drive/error.rb
@@ -178,11 +155,15 @@ files:
178
155
  - lib/google_drive/spreadsheet.rb
179
156
  - lib/google_drive/util.rb
180
157
  - lib/google_drive/worksheet.rb
181
- - lib/google_drive/worksheet_formatting.rb
182
158
  homepage: https://github.com/y-bonfire/google-drive-ruby-maintained
183
159
  licenses:
184
160
  - BSD-3-Clause
185
- metadata: {}
161
+ metadata:
162
+ homepage_uri: https://github.com/y-bonfire/google-drive-ruby-maintained
163
+ source_code_uri: https://github.com/y-bonfire/google-drive-ruby-maintained
164
+ changelog_uri: https://github.com/y-bonfire/google-drive-ruby-maintained/blob/main/CHANGELOG.md
165
+ bug_tracker_uri: https://github.com/y-bonfire/google-drive-ruby-maintained/issues
166
+ documentation_uri: https://rubydoc.info/gems/google_drive_ruby_maintained
186
167
  post_install_message:
187
168
  rdoc_options: []
188
169
  require_paths:
@@ -191,7 +172,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
191
172
  requirements:
192
173
  - - ">="
193
174
  - !ruby/object:Gem::Version
194
- version: 3.0.0
175
+ version: '3.1'
195
176
  required_rubygems_version: !ruby/object:Gem::Requirement
196
177
  requirements:
197
178
  - - ">="
@@ -1,53 +0,0 @@
1
- require 'forwardable'
2
-
3
- module GoogleDrive
4
-
5
- class Cell
6
- attr_reader :row, :col, :value
7
-
8
- def initialize(worksheet, row, col, value)
9
- @worksheet = worksheet
10
- @row = row
11
- @col = col
12
- @value = value
13
- end
14
-
15
- #
16
- # === 等価性
17
- #
18
- def ==(other)
19
- case other
20
- when GoogleDrive::Cell
21
- @value == other.value
22
- else
23
- @value == other
24
- end
25
- end
26
-
27
- def to_s
28
- value.to_s
29
- end
30
-
31
- def encoding
32
- value.respond_to?(:encoding) ? value.encoding : nil
33
- end
34
-
35
- def background_color=(color)
36
- @worksheet.set_background_color(@row, @col, 1, 1, color)
37
- end
38
-
39
- end
40
-
41
- module WorksheetFormatting
42
-
43
- def set_background_color_at(row, col, color)
44
- set_background_color(row, col, 1, 1, color)
45
- end
46
-
47
- def set_bold(row, col, enable = true)
48
- # 太字設定
49
- end
50
-
51
- # ... 他にも text_color, font_size など拡張しやすい
52
- end
53
- end