workarea-core 3.5.23 → 3.5.25
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 +4 -4
- data/app/models/workarea/configuration/params.rb +3 -1
- data/app/models/workarea/release.rb +2 -3
- data/app/models/workarea/release/changeset.rb +23 -0
- data/app/models/workarea/search/admin.rb +6 -2
- data/app/models/workarea/search/admin/releasable.rb +3 -1
- data/app/models/workarea/search/admin/search_customization.rb +25 -0
- data/app/workers/workarea/build_release_undo_changesets.rb +23 -0
- data/app/workers/workarea/index_admin_search.rb +6 -1
- data/config/initializers/00_configuration.rb +1 -0
- data/lib/workarea/configuration/administrable/field.rb +1 -1
- data/lib/workarea/configuration/localized_active_fields.rb +1 -1
- data/lib/workarea/version.rb +1 -1
- data/test/lib/workarea/configuration/administrable/field_test.rb +8 -0
- data/test/models/workarea/configuration/params_test.rb +3 -0
- data/test/models/workarea/releasable_active_test.rb +16 -8
- data/test/models/workarea/release/changeset_test.rb +17 -0
- data/test/models/workarea/search/admin/releasable_test.rb +14 -0
- data/test/workers/workarea/build_release_undo_changesets_test.rb +26 -0
- data/test/workers/workarea/index_admin_search_test.rb +21 -0
- metadata +12 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 88212eb8a949643dc6ba03f9d582b127390dd73f189cb2b6a2a01feadf838707
|
4
|
+
data.tar.gz: 19616ff30e34060cd50bb9cec01d3ccf34259f29e35e52fcb2874978895ab080
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd774a3170e5ebadb6793a048dfc84a364d9fa5136797c93c1149bef4c781c8dafda9afa84419a850cc2a5f7c464001ce5eb1b498b17bce202e8d1ed24478947
|
7
|
+
data.tar.gz: 5d7484222e6ff50c289a5ca130c6aa7ae5fd72e683877b6a0fe09e18cdbc7f4cd0a7fd8806c1dd550667ae9bfbfd5aaf71b090c2d93e687eed86daa1f376a438
|
@@ -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
|
-
|
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 =
|
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
|
@@ -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: -> {
|
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
|
@@ -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)
|
data/lib/workarea/version.rb
CHANGED
@@ -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
|
59
|
+
assert(active?(model.changesets.first.changeset))
|
52
60
|
assert_equal(1, model.changesets.first.original.size)
|
53
|
-
refute(model.changesets.first.original
|
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
|
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
|
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
|
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
|
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
|
115
|
+
assert(active?(embedded.changesets.first.changeset))
|
108
116
|
assert_equal(1, embedded.changesets.first.original.size)
|
109
|
-
refute(embedded.changesets.first.original
|
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.
|
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
|
+
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.
|
2753
|
+
rubygems_version: 3.2.3
|
2751
2754
|
signing_key:
|
2752
2755
|
specification_version: 4
|
2753
2756
|
summary: Core of the Workarea Commerce Platform
|