spree_admin 5.0.4 → 5.0.5

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: 896d26ce5c5cefb448bf77753fbb39af32b548d26aad748b20eae32ac51f1972
4
- data.tar.gz: c51934c9b3763132ad0978789d770645819016286aa505a065e0257a1bbb517d
3
+ metadata.gz: 274d9668ae1ea544815eb385842f5556570acb9c999fe65ab07a6b639bb42b06
4
+ data.tar.gz: 706699d5694ae8d8e2ea3df88b4b1a27c7196474efdf9928ebbbb27fba3b1828
5
5
  SHA512:
6
- metadata.gz: 3e4045b8196f7e9d3464942a40d5d8875ee37b0511df0e41a91876f83f052ea84ac94623ead5f91eff08fb1be514cb268894af96cd1b678045fb2f21ab6d26b6
7
- data.tar.gz: 2845718bc86d3007d26c8482fe14b566d72a51b5b0159557969ce53c42cc2ddba9abd853da9458ee3914901cdce1341212babe1010e7b8dab81109d6cc0cf090
6
+ metadata.gz: 227638a7b026550f3cdfb9b0549798c91ae1a4feeefe7b97c7984d4005c74b1fc1a1d180707ebe2037af02d90b912bd7508d74fd291b5c29c520cbfe62f28691
7
+ data.tar.gz: f1ef07a89426530a25d0db9a50bed68eebd9af552a9d639f0b5bc138201deca3ae626d01032fa147f167bc82ebb714a71c470dadabbccac66dfe9eb02dff2716
@@ -70,7 +70,7 @@ module Spree
70
70
  @payments = @order.payments.includes(:payment_method, :source).order(:created_at)
71
71
  @refunds = @order.refunds
72
72
 
73
- @return_authorizations = @order.return_authorizations
73
+ @return_authorizations = @order.return_authorizations.includes(:return_items)
74
74
  @customer_returns = @order.customer_returns.distinct
75
75
  end
76
76
 
@@ -151,7 +151,7 @@ module Spree
151
151
  protected
152
152
 
153
153
  def find_resource
154
- current_store.products.accessible_by(current_ability, :manage).with_deleted.friendly.find(params[:id])
154
+ current_store.products.accessible_by(current_ability, :manage).friendly.find(params[:id])
155
155
  end
156
156
 
157
157
  def load_data
@@ -179,10 +179,10 @@ module Spree
179
179
  @product_options[option_type.id.to_s] = {
180
180
  name: option_type.presentation,
181
181
  position: index + 1,
182
- values: option_values.pluck(:presentation).uniq
182
+ values: option_values.pluck(:name, :presentation).uniq.map { |name, presentation| { value: name, text: presentation } }
183
183
  }
184
184
 
185
- @product_available_options[option_type.id.to_s] = option_type.option_values.to_tom_select_json
185
+ @product_available_options[option_type.id.to_s] = option_type.option_values.pluck(:name, :presentation).uniq.map { |name, presentation| { id: name, name: presentation } }
186
186
  end
187
187
 
188
188
  @product_stock = {}
@@ -273,7 +273,7 @@ module Spree
273
273
  for_ordering_with_translations(model_class, :name).
274
274
  includes(product_includes).
275
275
  page(params[:page]).
276
- per(params[:per_page] || ENV.fetch('ADMIN_PRODUCTS_PER_PAGE', 25))
276
+ per(params[:per_page] || Spree::Admin::RuntimeConfig.admin_products_per_page)
277
277
 
278
278
  @collection
279
279
  end
@@ -57,7 +57,7 @@ module Spree
57
57
  # lazy loading other models here (via includes) may result in an invalid query
58
58
  # e.g. SELECT DISTINCT DISTINCT "spree_orders".id, "spree_orders"."created_at" AS alias_0 FROM "spree_orders"
59
59
  # see https://github.com/spree/spree/pull/3919
60
- @orders = @search.result(distinct: true).page(params[:page]).per(params[:per_page])
60
+ @orders = @search.result(distinct: true).page(params[:page]).per(params[:per_page] || Spree::Admin::RuntimeConfig.admin_orders_per_page)
61
61
  end
62
62
 
63
63
  def load_user
@@ -11,11 +11,6 @@ module Spree
11
11
  end
12
12
  end
13
13
 
14
- def payment_method_icon_tag(payment_method, opts = {})
15
- image_tag "payment_icons/#{payment_method}.svg", opts
16
- rescue Sprockets::Rails::Helper::AssetNotFound
17
- end
18
-
19
14
  def available_payment_methods
20
15
  @available_payment_methods ||= Spree::PaymentMethod.providers.map { |provider| provider.name.constantize.new }.delete_if { |payment_method| !payment_method.show_in_admin? || current_store.payment_methods.pluck(:type).include?(payment_method.type) }.sort_by(&:name)
21
16
  end
@@ -29,7 +29,8 @@ export default class extends Controller {
29
29
  })
30
30
 
31
31
  this.uppy.use(ActiveStorageUpload, {
32
- directUploadUrl: document.querySelector("meta[name='direct-upload-url']").getAttribute('content')
32
+ directUploadUrl: document.querySelector("meta[name='direct-upload-url']").getAttribute('content'),
33
+ crop: this.cropValue
33
34
  })
34
35
 
35
36
  let dashboardOptions = {}
@@ -55,16 +56,6 @@ export default class extends Controller {
55
56
 
56
57
  this.uppy.on('file-editor:complete', (updatedFile) => {
57
58
  console.log('File editing complete:', updatedFile)
58
- // Remove the old file from Uppy's file list
59
- this.uppy.removeFile(updatedFile.id)
60
- // Add the updated file to Uppy
61
- this.uppy.addFile({
62
- name: updatedFile.name,
63
- type: updatedFile.type,
64
- data: updatedFile.data,
65
- source: 'local',
66
- isRemote: false
67
- })
68
59
 
69
60
  this.handleUI(updatedFile)
70
61
 
@@ -26,8 +26,9 @@ export default class extends Controller {
26
26
  values() {
27
27
  return this.selectTargets
28
28
  .map((selectTarget) => selectTarget.querySelector('select'))
29
- .map((select) => select.options[select.selectedIndex].text)
30
- .filter((text) => text?.length > 0)
29
+ .map((select) => select.options[select.selectedIndex])
30
+ .filter((option) => option.value.length > 0)
31
+ .map((option) => ({ text: option.text, value: option.value}))
31
32
  }
32
33
 
33
34
  setValues() {
@@ -129,7 +129,7 @@ export default class extends CheckboxSelectAll {
129
129
  const nestingLevel = internalName.split('/').length
130
130
  if (nestingLevel === 1) {
131
131
  const firstOptionKey = Object.keys(this.optionsValue)[0]
132
- const newOptionValues = this.optionsValue[firstOptionKey].values.filter((value) => value !== internalName)
132
+ const newOptionValues = this.optionsValue[firstOptionKey].values.filter((value) => value.text !== internalName)
133
133
  if (newOptionValues.length === 0) {
134
134
  const newOptionsValue = this.optionsValue
135
135
  delete newOptionsValue[firstOptionKey]
@@ -265,12 +265,12 @@ export default class extends CheckboxSelectAll {
265
265
  let name = ''
266
266
  let internalName = name
267
267
  if (i === 0) {
268
- name = variant[keys[i]]
268
+ name = variant[keys[i]].text
269
269
  internalName = name
270
270
  } else {
271
- const namesPath = keys.slice(1, keys.length).map((key) => variant[key])
271
+ const namesPath = keys.slice(1, keys.length).map((key) => variant[key].text)
272
272
  name = namesPath.join(' / ')
273
- internalName = `${variant[keys[0]]}/${namesPath.join('/')}`
273
+ internalName = `${variant[keys[0]].text}/${namesPath.join('/')}`
274
274
  }
275
275
 
276
276
  return { name, internalName }
@@ -572,12 +572,12 @@ export default class extends CheckboxSelectAll {
572
572
  refreshParentInputs() {
573
573
  const firstOption = Object.values(this.optionsValue)[0]
574
574
  if (firstOption) {
575
- firstOption.values.forEach((name) => {
575
+ firstOption.values.forEach((option) => {
576
576
  this.currenciesValue.forEach((currency) => {
577
- this.updateParentPriceRange(name, currency)
577
+ this.updateParentPriceRange(option.text, currency)
578
578
  })
579
579
  this.stockLocationsValue.forEach((stockLocationId) => {
580
- this.updateParentStockSum(name, stockLocationId)
580
+ this.updateParentStockSum(option.text, stockLocationId)
581
581
  })
582
582
  this.updateShopLocationCountOnHand()
583
583
  })
@@ -615,11 +615,17 @@ export default class extends CheckboxSelectAll {
615
615
  .find((option) => option.name === key).position
616
616
  inputs.push(positionInput)
617
617
 
618
- const valueInput = document.createElement('input')
619
- valueInput.type = 'hidden'
620
- valueInput.name = `product[variants_attributes][${i}][options][][value]`
621
- valueInput.value = variant[key]
622
- inputs.push(valueInput)
618
+ const optionNameInput = document.createElement('input')
619
+ optionNameInput.type = 'hidden'
620
+ optionNameInput.name = `product[variants_attributes][${i}][options][][option_value_name]`
621
+ optionNameInput.value = variant[key].value
622
+ inputs.push(optionNameInput)
623
+
624
+ const optionIdInput = document.createElement('input')
625
+ optionIdInput.type = 'hidden'
626
+ optionIdInput.name = `product[variants_attributes][${i}][options][][option_value_presentation]`
627
+ optionIdInput.value = variant[key].text
628
+ inputs.push(optionIdInput)
623
629
  })
624
630
 
625
631
  return inputs
@@ -924,8 +930,8 @@ export default class extends CheckboxSelectAll {
924
930
  const optionValuesSelectContainer = template.querySelector('[data-slot="optionValuesSelectContainer"]')
925
931
  const tomSelectOptionValues = optionValues.map((optionValue) => {
926
932
  return {
927
- id: availableOptions.find((availableOption) => availableOption.name === optionValue)?.id,
928
- name: optionValue
933
+ id: optionValue.value,
934
+ name: optionValue.text,
929
935
  }
930
936
  })
931
937
 
@@ -948,8 +954,8 @@ export default class extends CheckboxSelectAll {
948
954
  values.forEach((value) => {
949
955
  const template = this.optionValueTemplateTarget.content.cloneNode(true)
950
956
  const optionValueNameEl = template.querySelector('[data-slot="optionValueName"]')
951
- optionValueNameEl.textContent = value
952
- optionValueNameEl.dataset.name = value
957
+ optionValueNameEl.textContent = value.text
958
+ optionValueNameEl.dataset.name = value.text
953
959
 
954
960
  templates.push(template)
955
961
  })
@@ -20,7 +20,8 @@ export default class ActiveStorageUpload extends BasePlugin {
20
20
  limit: 0,
21
21
  timeout: 30 * 1000,
22
22
  directUploadUrl: null,
23
- headers: {}
23
+ headers: {},
24
+ crop: false
24
25
  }
25
26
 
26
27
  this.opts = Object.assign({}, defaultOptions, opts)
@@ -37,10 +38,19 @@ export default class ActiveStorageUpload extends BasePlugin {
37
38
 
38
39
  install() {
39
40
  this.uppy.addUploader(this.handleUpload)
41
+ this.uppy.on('file-editor:complete', this.onEditorComplete)
40
42
  }
41
43
 
42
44
  uninstall() {
43
45
  this.uppy.removeUploader(this.handleUpload)
46
+ this.uppy.off('file-editor:complete', this.onEditorComplete)
47
+ }
48
+
49
+ onEditorComplete = (updatedFile) => {
50
+ this.handleUpload([updatedFile.id])
51
+
52
+ // call directly upload method after editing image
53
+ return this.uploadFiles([updatedFile])
44
54
  }
45
55
 
46
56
  handleUpload(fileIDs) {
@@ -48,6 +58,10 @@ export default class ActiveStorageUpload extends BasePlugin {
48
58
  this.uppy.log("[ActiveStorage] No files to upload!")
49
59
  return Promise.resolve()
50
60
  }
61
+ // do not upload before editing is done
62
+ if (this.opts.crop) {
63
+ return Promise.resolve()
64
+ }
51
65
 
52
66
  this.uppy.log("[ActiveStorage] Uploading...")
53
67
  const files = fileIDs.map(fileID => this.uppy.getFile(fileID))
@@ -115,8 +129,6 @@ export default class ActiveStorageUpload extends BasePlugin {
115
129
  directUploadSignedId: blob.signed_id,
116
130
  }
117
131
 
118
- this.uppy.setFileState(file.id, { response })
119
-
120
132
  this.uppy.emit("upload-success", file, blob)
121
133
 
122
134
  return resolve(file)
@@ -2,7 +2,7 @@
2
2
  <% height ||= 300 %>
3
3
  <% crop ||= false unless defined?(crop) %>
4
4
  <% auto_submit ||= false %>
5
- <% can_delete ||= true unless defined?(can_delete) %>
5
+ <% show_delete_button = defined?(can_delete) ? can_delete : true %>
6
6
  <% css ||= '' %>
7
7
 
8
8
  <% if field_name && form %>
@@ -48,7 +48,7 @@
48
48
  <%= Spree.t('actions.select_file') %>
49
49
  </button>
50
50
 
51
- <% if can_delete %>
51
+ <% if show_delete_button %>
52
52
  <button type="button" class="btn btn-danger ml-auto" data-action="active-storage-upload#remove" data-turbo-confirm="<%= Spree.t(:are_you_sure) %>">
53
53
  <%= icon('trash') %>
54
54
 
@@ -17,7 +17,9 @@
17
17
  </tr>
18
18
  </thead>
19
19
  <tbody>
20
- <%= render partial: 'spree/admin/orders/return_authorizations/return_authorization', collection: @return_authorizations, cached: spree_base_cache_scope %>
20
+ <%= render partial: "spree/admin/orders/return_authorizations/return_authorization",
21
+ collection: @return_authorizations,
22
+ cached: ->(r) { [spree_base_cache_key, r.cache_key_with_version, r.return_items.maximum(:updated_at)] } %>
21
23
  </tbody>
22
24
  </table>
23
25
  </div>
@@ -21,11 +21,6 @@
21
21
  <%= f.select :preferred_description_alignment, options_for_select([ ["Left", "left"], ["Center", "center"], ["Right", "right"] ], @page_section.preferred_description_alignment ), {}, data: { action: 'auto-submit#submit' }, class: "custom-select" %>
22
22
  </div>
23
23
 
24
- <div class="form-group">
25
- <%= f.label :preferred_posts_to_show, Spree.t('admin.page_builder.posts_to_show') %>
26
- <%= f.select :preferred_posts_to_show, options_for_select([["Newest", "newest"], ["Most popular", "most_popular"]], @page_section.preferred_posts_to_show), {}, data: { action: 'auto-submit#submit' }, class: "custom-select" %>
27
- </div>
28
-
29
24
  <div class="form-group">
30
25
  <div data-controller="better-slider">
31
26
  <label><%= Spree.t('admin.page_builder.maximum_posts_to_show') %>: <span data-better-slider-target="currentValueLabel"></span></label>
@@ -44,7 +44,7 @@
44
44
 
45
45
  <div class="form-group col-6">
46
46
  <%= label_tag "card_expiry#{payment_method.id}", raw(Spree.t(:expiration) + required_span_tag) %><br>
47
- <%= text_field_tag "#{param_prefix}[expiry]", '', id: "card_expiry#{payment_method.id}", class: "required cardExpiry form-control", placeholder: "MM/YYYY" %>
47
+ <%= text_field_tag "#{param_prefix}[expiry]", '', id: "card_expiry#{payment_method.id}", class: "required cardExpiry form-control", placeholder: Spree.t(:card_expiration_placeholder) %>
48
48
  </div>
49
49
 
50
50
  <div class="form-group col-6">
@@ -3,7 +3,7 @@
3
3
  <div data-replace-target="from">
4
4
  <div readonly class="form-control d-flex align-items-center justify-content-between pr-1">
5
5
  <span class="text-muted">
6
- ...<%= form.object.send(field).last(4) %>
6
+ ...<%= form.object.send(field)&.last(4) %>
7
7
  </span>
8
8
  <button class="btn btn-sm btn-light" type="button" data-action="click->replace#replace">
9
9
  <%= icon 'edit', class: 'mr-2' %>
@@ -23,4 +23,4 @@
23
23
  <% else %>
24
24
  <%= form.password_field(field, preference_field_options(options)) %>
25
25
  <% end %>
26
- </div>
26
+ </div>
@@ -7,13 +7,14 @@
7
7
  <% end unless @product.has_variants? %>
8
8
  <%= render 'spree/admin/products/form/variants', f: f %>
9
9
  <%= render 'spree/admin/products/form/inventory', f: f unless @product.has_variants? %>
10
- <%= render 'spree/admin/products/form/shipping', f: f %>
11
10
  <%= render 'spree/admin/products/form/properties', f: f %>
12
11
  <%= render_admin_partials(:product_form_partials, f: f, product: @product) %>
13
12
  </div>
14
13
  <div class="col-md-4">
15
14
  <%= render 'spree/admin/products/form/status', f: f %>
16
15
  <%= render 'spree/admin/products/form/categorization', f: f %>
16
+ <%= render 'spree/admin/products/form/shipping', f: f %>
17
+ <%= render 'spree/admin/products/form/tax', f: f %>
17
18
  <%= render 'spree/admin/products/form/stores', f: f if available_stores.count > 1 %>
18
19
  <%= render_admin_partials(:product_form_sidebar_partials, f: f, product: @product) %>
19
20
 
@@ -0,0 +1,12 @@
1
+ <div class="card mb-4">
2
+ <div class="card-header">
3
+ <h5 class="card-title"><%= Spree.t(:tax) %></h5>
4
+ </div>
5
+ <div class="card-body">
6
+ <div class="form-group">
7
+ <%= f.label :tax_category_id, Spree.t(:tax_category) %>
8
+ <%= f.select(:tax_category_id, @tax_categories.pluck(:name, :id), { include_blank: false }, { class: 'custom-select' }) %>
9
+ <%= f.error_message_on :tax_category %>
10
+ </div>
11
+ </div>
12
+ </div>
@@ -18,7 +18,7 @@
18
18
  <thead class="text-muted">
19
19
  <tr>
20
20
  <th scope="col" class="text-center"><%= Spree.t(:field) %></th>
21
- <th scope="col" class="text-center" style="width: 40%;"><%= Spree.t('i18n.this_file_language', locale: :en) %> (<%= Spree.t(:default) %>)</th>
21
+ <th scope="col" class="text-center" style="width: 40%;"><%= Spree.t('i18n.this_file_language', locale: @default_locale) %> (<%= Spree.t(:default) %>)</th>
22
22
  <th scope="col" class="text-center"><%= Spree.t('i18n.this_file_language', locale: @selected_translation_locale) %></th>
23
23
  </tr>
24
24
  </thead>
@@ -1,12 +1,12 @@
1
1
  <% cache variant do %>
2
- <% if variant.is_master? %>
2
+ <% if variant.is_master? || variant.product.deleted? %>
3
3
  <% variant_url = spree.edit_admin_product_path(variant.product) %>
4
4
  <% else %>
5
5
  <% variant_url = spree.edit_admin_product_variant_path(variant.product, variant) %>
6
6
  <% end %>
7
7
 
8
8
  <%= link_to variant_url, id: spree_dom_id(variant), data: { turbo_permanent: true, turbo_frame: :_top }, class: 'd-flex align-items-center justify-content-start text-decoration-none' do %>
9
- <%= render 'spree/admin/shared/product_image', object: variant %>
9
+ <%= render "spree/admin/shared/product_image", object: variant %>
10
10
  <div class="ml-3">
11
11
  <strong><%= variant.name %></strong>
12
12
  <% if variant.options_text.present? %>
@@ -5,22 +5,22 @@
5
5
  </h5>
6
6
  </div>
7
7
  <div class="card-body">
8
- <div class="form-group" data-hook="sku">
8
+ <div class="form-group">
9
9
  <%= f.label :sku, Spree.t(:sku) %>
10
10
  <%= f.text_field :sku, class: 'form-control' %>
11
11
  </div>
12
12
 
13
- <div class="form-group" data-hook="sku">
13
+ <div class="form-group">
14
14
  <%= f.label :barcode, Spree.t(:barcode) %>
15
15
  <%= f.text_field :barcode, class: 'form-control' %>
16
16
  </div>
17
17
 
18
- <div class="form-group" data-hook="tax_category">
18
+ <div class="form-group">
19
19
  <%= f.label :tax_category_id, Spree.t(:tax_category) %>
20
20
  <%= f.collection_select(:tax_category_id, @tax_categories, :id, :name, { include_blank: Spree.t('match_choices.none') }, { data: { controller: 'autocomplete-select' } }) %>
21
21
  </div>
22
22
 
23
- <div class="form-group" data-hook="discontinue_on">
23
+ <div class="form-group">
24
24
  <%= f.label :discontinue_on, Spree.t(:discontinue_on) %>
25
25
  <%= f.error_message_on :discontinue_on %>
26
26
  <%= f.date_field :discontinue_on, class: 'form-control' %>
@@ -138,7 +138,6 @@ en:
138
138
  maximum_products_to_show: Maximum products to show
139
139
  nav_centered: Nav centered
140
140
  not_set: Not set
141
- posts_to_show: Posts to show
142
141
  separated: Separated
143
142
  show_more_button: Show explore category button
144
143
  show_taxon_image: Show taxon image
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_admin
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.4
4
+ version: 5.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vendo Connect Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-05-22 00:00:00.000000000 Z
11
+ date: 2025-06-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: spree_core
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 5.0.4
19
+ version: 5.0.5
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 5.0.4
26
+ version: 5.0.5
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: spree_api
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 5.0.4
33
+ version: 5.0.5
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 5.0.4
40
+ version: 5.0.5
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: active_link_to
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -746,6 +746,7 @@ files:
746
746
  - app/views/spree/admin/products/form/_shipping.html.erb
747
747
  - app/views/spree/admin/products/form/_status.html.erb
748
748
  - app/views/spree/admin/products/form/_stores.html.erb
749
+ - app/views/spree/admin/products/form/_tax.html.erb
749
750
  - app/views/spree/admin/products/form/_variants.html.erb
750
751
  - app/views/spree/admin/products/form/variants/_option_template.html.erb
751
752
  - app/views/spree/admin/products/form/variants/_variant_template.html.erb
@@ -1058,9 +1059,9 @@ licenses:
1058
1059
  - AGPL-3.0-or-later
1059
1060
  metadata:
1060
1061
  bug_tracker_uri: https://github.com/spree/spree/issues
1061
- changelog_uri: https://github.com/spree/spree/releases/tag/v5.0.4
1062
+ changelog_uri: https://github.com/spree/spree/releases/tag/v5.0.5
1062
1063
  documentation_uri: https://docs.spreecommerce.org/
1063
- source_code_uri: https://github.com/spree/spree/tree/v5.0.4
1064
+ source_code_uri: https://github.com/spree/spree/tree/v5.0.5
1064
1065
  post_install_message:
1065
1066
  rdoc_options: []
1066
1067
  require_paths: