workarea-core 3.5.23 → 3.5.25

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: edc99891d1b58bf06d070ed152b77852db6ebb0bd9e3b023faafaf93079c1626
4
- data.tar.gz: b7095d6fecc6996d72eb680c6a4a7baa8d10769aad48204c0afe7080cd425c14
3
+ metadata.gz: 88212eb8a949643dc6ba03f9d582b127390dd73f189cb2b6a2a01feadf838707
4
+ data.tar.gz: 19616ff30e34060cd50bb9cec01d3ccf34259f29e35e52fcb2874978895ab080
5
5
  SHA512:
6
- metadata.gz: 4d6fc54dbd4f849840c8cfeff3c97061539e99e124898df794e2ea7ac8ef36bc532c92209e99acbfb669dcfff70932dd3bf49b8cbdf70cce88eebda9f8ca45a1
7
- data.tar.gz: 1bb8092da0dfb2fb9c8f774b90a9be3a352d55e4261550471dffb0dd761d2d75e713544bfd96cd8836b448cbee382bfc7234e5a724bd5dc8ae9cbdb2adfb5702
6
+ metadata.gz: dd774a3170e5ebadb6793a048dfc84a364d9fa5136797c93c1149bef4c781c8dafda9afa84419a850cc2a5f7c464001ce5eb1b498b17bce202e8d1ed24478947
7
+ data.tar.gz: 5d7484222e6ff50c289a5ca130c6aa7ae5fd72e683877b6a0fe09e18cdbc7f4cd0a7fd8806c1dd550667ae9bfbfd5aaf71b090c2d93e687eed86daa1f376a438
@@ -27,7 +27,9 @@ module Workarea
27
27
  end
28
28
 
29
29
  def array(field, value)
30
- Array.wrap(CSV.parse(value).first).map(&:strip)
30
+ Array.wrap(CSV.parse(value).first)
31
+ .map(&:strip)
32
+ .map { |v| field.values_type_class.mongoize(v) }
31
33
  end
32
34
 
33
35
  def hash(field, value)
@@ -13,7 +13,7 @@ module Workarea
13
13
  field :undo_job_id, type: String # TODO deprecated, remove in v3.6
14
14
 
15
15
  has_many :changesets, class_name: 'Workarea::Release::Changeset'
16
- has_one :undo, class_name: 'Workarea::Release', inverse_of: :undoes
16
+ has_many :undos, class_name: 'Workarea::Release', inverse_of: :undoes
17
17
  belongs_to :undoes, class_name: 'Workarea::Release', inverse_of: :undo, optional: true
18
18
 
19
19
  index({ publish_at: 1 })
@@ -180,11 +180,10 @@ module Workarea
180
180
  end
181
181
 
182
182
  def build_undo(attributes = {})
183
- result = undo || Release.new(attributes)
183
+ result = undos.build(attributes)
184
184
 
185
185
  result.name ||= I18n.t('workarea.release.undo', name: name)
186
186
  result.tags = %w(undo) if result.tags.blank?
187
- self.undo = result
188
187
 
189
188
  result
190
189
  end
@@ -22,6 +22,29 @@ module Workarea
22
22
  index('changeset.product_ids' => 1)
23
23
  index('original.product_ids' => 1)
24
24
  index('releasable_type' => 1, 'releasable_id' => 1)
25
+ index(updated_at: 1)
26
+
27
+ def self.latest(limit = Workarea.config.per_page)
28
+ order(updated_at: :desc).limit(limit)
29
+ end
30
+
31
+ def self.summary(release_id)
32
+ collection.aggregate([
33
+ { '$match' => { 'release_id' => release_id } },
34
+ {
35
+ '$addFields' => {
36
+ 'root' => { '$arrayElemAt' => ['$document_path', 0] }
37
+ }
38
+ },
39
+ {
40
+ '$group' => {
41
+ '_id' => '$root.type',
42
+ 'count' => { '$sum' => 1 }
43
+ }
44
+ },
45
+ { '$sort' => { '_id' => 1 } }
46
+ ]).to_a
47
+ end
25
48
 
26
49
  # Finds changeset by whether the passed document is in the document
27
50
  # path of the changeset. Useful for showing embedded changes in the
@@ -51,10 +51,14 @@ module Workarea
51
51
  end
52
52
 
53
53
  def self.for(model)
54
+ find_for_model(model)
55
+ rescue NameError
56
+ find_for_model(model._root) rescue nil
57
+ end
58
+
59
+ def self.find_for_model(model)
54
60
  subclass = model.model_name.singular_route_key.camelize
55
61
  "Workarea::Search::Admin::#{subclass}".constantize.new(model)
56
- rescue NameError
57
- nil
58
62
  end
59
63
 
60
64
  # Allows subclass instances to specify whether they should be included in
@@ -24,7 +24,9 @@ module Workarea
24
24
  end
25
25
 
26
26
  def model_changesets
27
- model.changesets.any_in(release_id: upcoming_release_ids)
27
+ Workarea::Release::Changeset
28
+ .by_document_path(model)
29
+ .any_in(release_id: upcoming_release_ids)
28
30
  end
29
31
 
30
32
  def content_changesets
@@ -0,0 +1,25 @@
1
+ module Workarea
2
+ module Search
3
+ class Admin
4
+ class SearchCustomization < Search::Admin
5
+ include Admin::Releasable
6
+
7
+ def type
8
+ 'search_customization'
9
+ end
10
+
11
+ def search_text
12
+ model.name
13
+ end
14
+
15
+ def jump_to_text
16
+ "#{model.id} - #{model.name}"
17
+ end
18
+
19
+ def jump_to_position
20
+ 99
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,23 @@
1
+ module Workarea
2
+ class BuildReleaseUndoChangesets
3
+ include Sidekiq::Worker
4
+
5
+ def perform(undo_release_id, release_id)
6
+ release = Release.find(release_id)
7
+ undo_release = Release.find(undo_release_id)
8
+
9
+ existing_changesets = undo_release.changesets.to_a
10
+ matching_changeset = ->(changeset, existing_changesets) do
11
+ existing_changesets.any? do |cs|
12
+ changeset.releasable_type == cs.releasable_type &&
13
+ changeset.releasable_id == cs.releasable_id
14
+ end
15
+ end
16
+
17
+ release.changesets.each_by(500) do |changeset|
18
+ next if matching_changeset.call(changeset, existing_changesets)
19
+ changeset.build_undo(release: undo_release).save!
20
+ end
21
+ end
22
+ end
23
+ end
@@ -9,7 +9,7 @@ module Workarea
9
9
  query_cache: true,
10
10
  enqueue_on: {
11
11
  ApplicationDocument => [:save, :touch, :destroy],
12
- with: -> { [self.class.name, id] },
12
+ with: -> { IndexAdminSearch.job_arguments(self) },
13
13
  ignore_if: -> { !IndexAdminSearch.should_enqueue?(self) }
14
14
  }
15
15
  )
@@ -19,6 +19,11 @@ module Workarea
19
19
  search_model.present? && search_model.should_be_indexed?
20
20
  end
21
21
 
22
+ def self.job_arguments(model)
23
+ search_model = Search::Admin.for(model)
24
+ [search_model.model.class.name, search_model.model.id]
25
+ end
26
+
22
27
  def self.perform(model)
23
28
  search_model = Search::Admin.for(model)
24
29
  return false if search_model.blank?
@@ -60,6 +60,7 @@ Workarea::Configuration.define_fields do
60
60
  field 'Shipping Dimensions',
61
61
  type: :array,
62
62
  default: [1, 1, 1],
63
+ values_type: :integer,
63
64
  description: %(
64
65
  Default package dimensions to use for calculating shipping costs.
65
66
  It's recommended to set these to your average or standard box size when
@@ -32,7 +32,7 @@ module Workarea
32
32
  end
33
33
 
34
34
  def values_type_class
35
- return unless type == :hash
35
+ return unless type.in?(%i(hash array))
36
36
 
37
37
  values_type = options.values_type || :string
38
38
  Workarea.config.configurable_field_types[values_type]&.constantize
@@ -14,7 +14,7 @@ module Workarea
14
14
  return if Workarea.config.localized_active_fields
15
15
 
16
16
  ::Mongoid.models.each do |klass|
17
- if klass < Releasable
17
+ if klass < Releasable && klass.localized_fields['active'].present?
18
18
  klass.localized_fields.delete('active')
19
19
  klass.field(:active, type: Boolean, default: true, localize: false)
20
20
  klass.index(active: 1)
@@ -2,7 +2,7 @@ module Workarea
2
2
  module VERSION
3
3
  MAJOR = 3
4
4
  MINOR = 5
5
- PATCH = 23
5
+ PATCH = 25
6
6
  PRE = nil
7
7
  STRING = [MAJOR, MINOR, PATCH, PRE].compact.join('.')
8
8
 
@@ -68,6 +68,14 @@ module Workarea
68
68
  )
69
69
 
70
70
  assert_equal(Integer, field.values_type_class)
71
+
72
+ field = Field.new(
73
+ 'Bar',
74
+ type: :array,
75
+ values_type: :integer
76
+ )
77
+
78
+ assert_equal(Integer, field.values_type_class)
71
79
  end
72
80
 
73
81
  def test_overridden?
@@ -11,6 +11,7 @@ module Workarea
11
11
  field 'baz', type: :string, allow_blank: true
12
12
 
13
13
  field 'foo_hash', type: :hash, values_type: :integer
14
+ field 'foo_array', type: :array, values_type: :integer
14
15
  field 'bar_array', type: :array
15
16
  field 'baz_duration', type: :duration
16
17
  end
@@ -20,6 +21,7 @@ module Workarea
20
21
  bar: nil,
21
22
  baz: '',
22
23
  foo_hash: ['one', '1', 'two', '', '', ''],
24
+ foo_array: '1,2,3',
23
25
  bar_array: 'one, two, three',
24
26
  baz_duration: %w(20 minutes)
25
27
  }
@@ -29,6 +31,7 @@ module Workarea
29
31
  assert_equal('test', result[:bar])
30
32
  assert_equal('', result[:baz])
31
33
  assert_equal({ 'one' => 1 }, result[:foo_hash])
34
+ assert_equal([1, 2, 3], result[:foo_array])
32
35
  assert_equal(%w(one two three), result[:bar_array])
33
36
  assert_equal(20.minutes, result[:baz_duration])
34
37
  end
@@ -35,6 +35,14 @@ module Workarea
35
35
  @release = create_release
36
36
  end
37
37
 
38
+ def active?(changeset)
39
+ if Workarea.config.localized_active_fields
40
+ changeset['active'][I18n.locale.to_s]
41
+ else
42
+ changeset['active']
43
+ end
44
+ end
45
+
38
46
  def test_save_can_schedule_activation
39
47
  model = Foo.create!(
40
48
  name: 'Test',
@@ -48,9 +56,9 @@ module Workarea
48
56
  assert_equal(1, model.changesets.length)
49
57
  assert_equal(@release.id, model.changesets.first.release_id)
50
58
  assert_equal(1, model.changesets.first.changeset.size)
51
- assert(model.changesets.first.changeset['active'][I18n.locale.to_s])
59
+ assert(active?(model.changesets.first.changeset))
52
60
  assert_equal(1, model.changesets.first.original.size)
53
- refute(model.changesets.first.original['active'][I18n.locale.to_s])
61
+ refute(active?(model.changesets.first.original))
54
62
  end
55
63
 
56
64
  def test_save_can_schedule_activation_for_an_embedded_document
@@ -74,17 +82,17 @@ module Workarea
74
82
  assert_equal(1, embedded_1.changesets.length)
75
83
  assert_equal(@release.id, embedded_1.changesets.first.release_id)
76
84
  assert_equal(1, embedded_1.changesets.first.changeset.size)
77
- assert(embedded_1.changesets.first.changeset['active'][I18n.locale.to_s])
85
+ assert(active?(embedded_1.changesets.first.changeset))
78
86
  assert_equal(1, embedded_1.changesets.first.original.size)
79
- refute(embedded_1.changesets.first.original['active'][I18n.locale.to_s])
87
+ refute(active?(embedded_1.changesets.first.original))
80
88
 
81
89
  refute(embedded_2.active)
82
90
  assert_equal(1, embedded_2.changesets.length)
83
91
  assert_equal(@release.id, embedded_2.changesets.first.release_id)
84
92
  assert_equal(1, embedded_2.changesets.first.changeset.size)
85
- assert(embedded_2.changesets.first.changeset['active'][I18n.locale.to_s])
93
+ assert(active?(embedded_2.changesets.first.changeset))
86
94
  assert_equal(1, embedded_2.changesets.first.original.size)
87
- refute(embedded_2.changesets.first.original['active'][I18n.locale.to_s])
95
+ refute(active?(embedded_2.changesets.first.original))
88
96
  end
89
97
 
90
98
  def test_creating_and_activating_embedded
@@ -104,9 +112,9 @@ module Workarea
104
112
  assert_equal(1, embedded.changesets.length)
105
113
  assert_equal(@release.id, embedded.changesets.first.release_id)
106
114
  assert_equal(1, embedded.changesets.first.changeset.size)
107
- assert(embedded.changesets.first.changeset['active'][I18n.locale.to_s])
115
+ assert(active?(embedded.changesets.first.changeset))
108
116
  assert_equal(1, embedded.changesets.first.original.size)
109
- refute(embedded.changesets.first.original['active'][I18n.locale.to_s])
117
+ refute(active?(embedded.changesets.first.original))
110
118
  assert(embedded.changesets.first.document_path.present?)
111
119
  end
112
120
  end
@@ -3,6 +3,23 @@ require 'test_helper'
3
3
  module Workarea
4
4
  class Release
5
5
  class ChangesetTest < TestCase
6
+ def test_summary
7
+ release = create_release
8
+ product_one = create_product(id: 'PROD1')
9
+ product_two = create_product(id: 'PROD2')
10
+ page = create_page
11
+
12
+ release.as_current do
13
+ product_one.variants.first.update!(details: { 'Color' => 'Orange' })
14
+ product_two.update!(name: 'Test Product Changed')
15
+ page.update!(name: 'Test Page Changed')
16
+ end
17
+
18
+ summary = Changeset.summary(release.id)
19
+ assert_includes(summary, { '_id' => 'Workarea::Catalog::Product', 'count' => 2 })
20
+ assert_includes(summary, { '_id' => 'Workarea::Content::Page', 'count' => 1 })
21
+ end
22
+
6
23
  def test_build_undo
7
24
  releasable = create_page(name: 'Foo')
8
25
  release = create_release
@@ -28,6 +28,20 @@ module Workarea
28
28
  assert_includes(search_model.facets[:upcoming_changes], release_two.id)
29
29
  refute_includes(search_model.facets[:upcoming_changes], release_three.id)
30
30
  end
31
+
32
+ def test_upcoming_changes
33
+ release_one = create_release
34
+ release_two = create_release
35
+
36
+ product = create_product
37
+
38
+ release_one.as_current { product.update!(name: 'Changed Name') }
39
+ release_two.as_current { product.variants.first.update!(name: 'Changed Name') }
40
+
41
+ search_model = Foo.new(product)
42
+ assert_includes(search_model.facets[:upcoming_changes], release_one.id)
43
+ assert_includes(search_model.facets[:upcoming_changes], release_two.id)
44
+ end
31
45
  end
32
46
  end
33
47
  end
@@ -0,0 +1,26 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ class BuildReleaseUndoChangesetsTest < TestCase
5
+ def test_perform
6
+ releasable_one = create_page(name: 'Foo')
7
+ releasable_two = create_page(name: 'Bar')
8
+ release = create_release
9
+
10
+ release.as_current do
11
+ releasable_one.update!(name: 'Changed Foo')
12
+ releasable_two.update!(name: 'Changed Bar')
13
+ end
14
+
15
+ undo_release = release.build_undo.tap(&:save!)
16
+ release.changesets.first.build_undo(release: undo_release).save!
17
+
18
+ BuildReleaseUndoChangesets.new.perform(undo_release.id, release.id)
19
+
20
+ undo_release.reload
21
+ assert_equal(2, undo_release.changesets.count)
22
+ assert_includes(undo_release.changesets.map(&:releasable), releasable_one)
23
+ assert_includes(undo_release.changesets.map(&:releasable), releasable_two)
24
+ end
25
+ end
26
+ end
@@ -6,5 +6,26 @@ module Workarea
6
6
  refute(IndexAdminSearch.should_enqueue?(create_order))
7
7
  assert(IndexAdminSearch.should_enqueue?(create_placed_order))
8
8
  end
9
+
10
+ def test_enqueuing_embedded_documents
11
+ content = create_content
12
+
13
+ Sidekiq::Testing.fake!
14
+ IndexAdminSearch.drain
15
+ Sidekiq::Callbacks.async(IndexAdminSearch)
16
+ Sidekiq::Callbacks.enable(IndexAdminSearch)
17
+
18
+ assert_difference 'IndexAdminSearch.jobs.size', 1 do
19
+ content.blocks.create!(type: :html)
20
+ end
21
+
22
+ args = IndexAdminSearch.jobs.first['args']
23
+ assert_equal(Content.name, args.first)
24
+ assert_equal(content.id.to_s, args.second)
25
+
26
+ ensure
27
+ IndexAdminSearch.drain
28
+ Sidekiq::Testing.inline!
29
+ end
9
30
  end
10
31
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: workarea-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.5.23
4
+ version: 3.5.25
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Crouse
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-25 00:00:00.000000000 Z
11
+ date: 2020-12-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -910,22 +910,22 @@ dependencies:
910
910
  name: minitest
911
911
  requirement: !ruby/object:Gem::Requirement
912
912
  requirements:
913
- - - ">="
914
- - !ruby/object:Gem::Version
915
- version: 5.10.1
916
913
  - - "~>"
917
914
  - !ruby/object:Gem::Version
918
915
  version: 5.10.3
916
+ - - ">="
917
+ - !ruby/object:Gem::Version
918
+ version: 5.10.1
919
919
  type: :runtime
920
920
  prerelease: false
921
921
  version_requirements: !ruby/object:Gem::Requirement
922
922
  requirements:
923
- - - ">="
924
- - !ruby/object:Gem::Version
925
- version: 5.10.1
926
923
  - - "~>"
927
924
  - !ruby/object:Gem::Version
928
925
  version: 5.10.3
926
+ - - ">="
927
+ - !ruby/object:Gem::Version
928
+ version: 5.10.1
929
929
  - !ruby/object:Gem::Dependency
930
930
  name: countries
931
931
  requirement: !ruby/object:Gem::Requirement
@@ -1532,6 +1532,7 @@ files:
1532
1532
  - app/models/workarea/search/admin/pricing_sku.rb
1533
1533
  - app/models/workarea/search/admin/releasable.rb
1534
1534
  - app/models/workarea/search/admin/release.rb
1535
+ - app/models/workarea/search/admin/search_customization.rb
1535
1536
  - app/models/workarea/search/admin/segment.rb
1536
1537
  - app/models/workarea/search/admin/user.rb
1537
1538
  - app/models/workarea/search/customization.rb
@@ -1749,6 +1750,7 @@ files:
1749
1750
  - app/view_models/workarea/shipping_carrier_view_model.rb
1750
1751
  - app/workers/sidekiq/callbacks.rb
1751
1752
  - app/workers/sidekiq/callbacks_worker.rb
1753
+ - app/workers/workarea/build_release_undo_changesets.rb
1752
1754
  - app/workers/workarea/bulk_index_admin.rb
1753
1755
  - app/workers/workarea/bulk_index_products.rb
1754
1756
  - app/workers/workarea/bulk_index_searches.rb
@@ -2466,6 +2468,7 @@ files:
2466
2468
  - test/view_models/workarea/shipping_carrier_view_model_test.rb
2467
2469
  - test/workarea_test.rb
2468
2470
  - test/workers/sidekiq/callbacks_test.rb
2471
+ - test/workers/workarea/build_release_undo_changesets_test.rb
2469
2472
  - test/workers/workarea/bulk_index_admin_test.rb
2470
2473
  - test/workers/workarea/bulk_index_products_test.rb
2471
2474
  - test/workers/workarea/bulk_index_searches_test.rb
@@ -2747,7 +2750,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
2747
2750
  - !ruby/object:Gem::Version
2748
2751
  version: '0'
2749
2752
  requirements: []
2750
- rubygems_version: 3.0.3
2753
+ rubygems_version: 3.2.3
2751
2754
  signing_key:
2752
2755
  specification_version: 4
2753
2756
  summary: Core of the Workarea Commerce Platform