workarea-core 3.5.0 → 3.5.1
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/content/block_draft.rb +4 -1
- data/app/models/workarea/data_file/csv.rb +8 -6
- data/app/models/workarea/data_file/json.rb +20 -1
- data/app/models/workarea/insights/customer_acquisition.rb +9 -5
- data/app/models/workarea/insights/trending_products.rb +2 -2
- data/app/models/workarea/insights/trending_searches.rb +2 -2
- data/app/models/workarea/metrics/product_for_last_week.rb +11 -5
- data/app/models/workarea/metrics/search_for_last_week.rb +11 -5
- data/app/models/workarea/metrics/update_user_aggregations.rb +1 -1
- data/app/models/workarea/pricing/discount/redemption.rb +1 -0
- data/app/queries/workarea/reports/average_order_value.rb +1 -1
- data/app/queries/workarea/reports/first_time_vs_returning_sales.rb +1 -1
- data/app/queries/workarea/reports/group_by_time.rb +17 -13
- data/app/queries/workarea/reports/sales_by_category.rb +1 -1
- data/app/queries/workarea/reports/sales_by_country.rb +1 -1
- data/app/queries/workarea/reports/sales_by_discount.rb +1 -1
- data/app/queries/workarea/reports/sales_by_menu.rb +1 -1
- data/app/queries/workarea/reports/sales_by_product.rb +1 -1
- data/app/queries/workarea/reports/sales_by_sku.rb +1 -1
- data/app/queries/workarea/reports/sales_by_traffic_referrer.rb +1 -1
- data/app/queries/workarea/reports/sales_over_time.rb +1 -1
- data/app/queries/workarea/reports/searches.rb +1 -1
- data/app/queries/workarea/reports/searches_over_time.rb +1 -1
- data/app/queries/workarea/reports/searches_without_results_over_time.rb +1 -1
- data/app/queries/workarea/search/product_search.rb +1 -1
- data/config/initializers/00_configuration.rb +0 -5
- data/lib/workarea/configuration.rb +3 -0
- data/lib/workarea/configuration/redis.rb +29 -22
- data/lib/workarea/core.rb +4 -3
- data/lib/workarea/core/engine.rb +0 -1
- data/lib/workarea/version.rb +1 -1
- data/test/lib/workarea/configuration/redis_test.rb +47 -0
- data/test/models/workarea/data_file/csv_test.rb +48 -0
- data/test/models/workarea/data_file/json_test.rb +40 -0
- data/test/queries/workarea/search/product_search_test.rb +7 -5
- data/workarea-core.gemspec +1 -2
- metadata +11 -25
- data/lib/workarea/configuration/logstasher.rb +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8235a2cc74baebc1277b7654671af10c36f634f31e1cf42f66b13acc71bc2422
|
4
|
+
data.tar.gz: 98bad1e8beb51469a28a823f935361517201b9306e7c1191357bd0ab03b8fa9d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae272f2e725c5ea055fee8d5650896f39ecafffb429cb08287a8b698425fdd91252ad9efcf3cb11b2ba8ff9ef2c46d49bf2aa6bebea5672685ffacca2d4baecd
|
7
|
+
data.tar.gz: a1ce00f795b52f99024aac425f38f0ecf81b0945559a272bd31a974c797b9d3ac2312d9bd2226bdf5e07e3da6b09574d30c6d67fafe11776bb463abedbaeb131
|
@@ -2,13 +2,16 @@ module Workarea
|
|
2
2
|
class Content
|
3
3
|
class BlockDraft
|
4
4
|
include ApplicationDocument
|
5
|
-
include Releasable
|
6
5
|
|
7
6
|
field :content_id, type: String
|
8
7
|
Block.fields.except('_id').each do |name, field_instance|
|
9
8
|
field name, field_instance.options.except(:klass)
|
10
9
|
end
|
11
10
|
|
11
|
+
# Added as a field to ensure copying this value to any blocks created
|
12
|
+
# from a draft.
|
13
|
+
field :activate_with, type: String
|
14
|
+
|
12
15
|
index(
|
13
16
|
{ created_at: 1 },
|
14
17
|
{ expire_after_seconds: 1.hour.seconds.to_i }
|
@@ -48,6 +48,8 @@ module Workarea
|
|
48
48
|
|
49
49
|
def assign_attributes(model, attrs)
|
50
50
|
model.fields.each do |name, metadata|
|
51
|
+
next if name == 'updated_at'
|
52
|
+
|
51
53
|
value = CsvFields.deserialize_from(attrs, field: metadata, model: model)
|
52
54
|
model.send("#{name}=", value) if value.present?
|
53
55
|
end
|
@@ -86,17 +88,17 @@ module Workarea
|
|
86
88
|
]
|
87
89
|
|
88
90
|
if unnamespaced_attrs.values.any?(&:present?)
|
91
|
+
klass = attrs["#{name}_type"].constantize if attrs["#{name}_type"].present?
|
92
|
+
klass ||= root.relations[name].class_name.constantize
|
93
|
+
|
89
94
|
if metadata.many?
|
90
95
|
id = attrs["#{name}_id"]
|
91
|
-
instance =
|
92
|
-
|
93
|
-
else
|
94
|
-
root.send(name).build
|
95
|
-
end
|
96
|
+
instance = root.send(name).find_by(id: id) rescue nil
|
97
|
+
instance ||= root.send(name).build({}, klass)
|
96
98
|
|
97
99
|
assign_attributes(instance, unnamespaced_attrs)
|
98
100
|
else
|
99
|
-
instance = root.send(name) || root.send("build_#{name}")
|
101
|
+
instance = root.send(name) || root.send("build_#{name}", {}, klass)
|
100
102
|
assign_attributes(instance, unnamespaced_attrs)
|
101
103
|
end
|
102
104
|
end
|
@@ -45,12 +45,31 @@ module Workarea
|
|
45
45
|
|
46
46
|
if id.present?
|
47
47
|
result = model_class.find_or_initialize_by(id: id)
|
48
|
-
result.attributes = attributes
|
48
|
+
result.attributes = attributes_without_updated_at(attributes)
|
49
49
|
result
|
50
50
|
else
|
51
51
|
model_class.new(attributes)
|
52
52
|
end
|
53
53
|
end
|
54
|
+
|
55
|
+
def attributes_without_updated_at(attrs)
|
56
|
+
return attrs unless attrs.respond_to?(:each_with_object)
|
57
|
+
|
58
|
+
attrs.each_with_object({}) do |(key, value), attributes|
|
59
|
+
next if key.to_s == 'updated_at'
|
60
|
+
|
61
|
+
attributes[key] = case value
|
62
|
+
when Hash
|
63
|
+
attributes_without_updated_at(value)
|
64
|
+
when Array
|
65
|
+
value.map do |item|
|
66
|
+
attributes_without_updated_at(item)
|
67
|
+
end
|
68
|
+
else
|
69
|
+
value
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
54
73
|
end
|
55
74
|
end
|
56
75
|
end
|
@@ -37,8 +37,8 @@ module Workarea
|
|
37
37
|
{
|
38
38
|
'$match' => {
|
39
39
|
'first_order_at' => {
|
40
|
-
'$gte' => beginning_of_last_month,
|
41
|
-
'$lte' => end_of_last_month
|
40
|
+
'$gte' => beginning_of_last_month.utc,
|
41
|
+
'$lte' => end_of_last_month.utc
|
42
42
|
}
|
43
43
|
}
|
44
44
|
}
|
@@ -48,14 +48,18 @@ module Workarea
|
|
48
48
|
{
|
49
49
|
'$group' => {
|
50
50
|
'_id' => {
|
51
|
-
'year' => { '$year' =>
|
52
|
-
'month' => { '$month' =>
|
53
|
-
'day' => { '$dayOfMonth' =>
|
51
|
+
'year' => { '$year' => first_order_at_in_time_zone },
|
52
|
+
'month' => { '$month' => first_order_at_in_time_zone },
|
53
|
+
'day' => { '$dayOfMonth' => first_order_at_in_time_zone }
|
54
54
|
},
|
55
55
|
'new_customers' => { '$sum' => 1 }
|
56
56
|
}
|
57
57
|
}
|
58
58
|
end
|
59
|
+
|
60
|
+
def first_order_at_in_time_zone
|
61
|
+
{ 'date' => '$first_order_at', 'timezone' => Time.zone.tzinfo.name }
|
62
|
+
end
|
59
63
|
end
|
60
64
|
end
|
61
65
|
end
|
@@ -35,8 +35,8 @@ module Workarea
|
|
35
35
|
{
|
36
36
|
'$match' => {
|
37
37
|
'reporting_on' => {
|
38
|
-
'$gte' => Time.current.last_week,
|
39
|
-
'$lte' => Time.current.last_week.end_of_week
|
38
|
+
'$gte' => Time.current.last_week.utc,
|
39
|
+
'$lte' => Time.current.last_week.end_of_week.utc
|
40
40
|
}
|
41
41
|
}
|
42
42
|
}
|
@@ -72,8 +72,8 @@ module Workarea
|
|
72
72
|
'$expr' => {
|
73
73
|
'$and' => [
|
74
74
|
{ '$eq' => ['$product_id', '$$product_id'] },
|
75
|
-
{ '$gte' => ['$reporting_on', Time.current.last_week - 1.week] },
|
76
|
-
{ '$lte' => ['$reporting_on', Time.current.last_week.end_of_week - 1.week] }
|
75
|
+
{ '$gte' => ['$reporting_on', (Time.current.last_week - 1.week).utc] },
|
76
|
+
{ '$lte' => ['$reporting_on', (Time.current.last_week.end_of_week - 1.week).utc] }
|
77
77
|
]
|
78
78
|
}
|
79
79
|
}
|
@@ -146,7 +146,13 @@ module Workarea
|
|
146
146
|
'$addFields' => {
|
147
147
|
'_id' => {
|
148
148
|
'$concat' => [
|
149
|
-
{
|
149
|
+
{
|
150
|
+
'$dateToString' => {
|
151
|
+
'format' => '%Y%m%d',
|
152
|
+
'date' => '$reporting_on',
|
153
|
+
'timezone' => Time.zone.tzinfo.name
|
154
|
+
}
|
155
|
+
},
|
150
156
|
'-',
|
151
157
|
'$product_id'
|
152
158
|
]
|
@@ -36,8 +36,8 @@ module Workarea
|
|
36
36
|
{
|
37
37
|
'$match' => {
|
38
38
|
'reporting_on' => {
|
39
|
-
'$gte' => Time.current.last_week,
|
40
|
-
'$lte' => Time.current.last_week.end_of_week
|
39
|
+
'$gte' => Time.current.last_week.utc,
|
40
|
+
'$lte' => Time.current.last_week.end_of_week.utc
|
41
41
|
}
|
42
42
|
}
|
43
43
|
}
|
@@ -77,8 +77,8 @@ module Workarea
|
|
77
77
|
'$expr' => {
|
78
78
|
'$and' => [
|
79
79
|
{ '$eq' => ['$query_id', '$$query_id'] },
|
80
|
-
{ '$gte' => ['$reporting_on', Time.current.last_week - 1.week] },
|
81
|
-
{ '$lte' => ['$reporting_on', Time.current.last_week.end_of_week - 1.week] }
|
80
|
+
{ '$gte' => ['$reporting_on', (Time.current.last_week - 1.week).utc] },
|
81
|
+
{ '$lte' => ['$reporting_on', (Time.current.last_week.end_of_week - 1.week).utc] }
|
82
82
|
]
|
83
83
|
}
|
84
84
|
}
|
@@ -151,7 +151,13 @@ module Workarea
|
|
151
151
|
'$addFields' => {
|
152
152
|
'_id' => {
|
153
153
|
'$concat' => [
|
154
|
-
{
|
154
|
+
{
|
155
|
+
'$dateToString' => {
|
156
|
+
'format' => '%Y%m%d',
|
157
|
+
'date' => '$reporting_on',
|
158
|
+
'timezone' => Time.zone.tzinfo.name
|
159
|
+
}
|
160
|
+
},
|
155
161
|
'-',
|
156
162
|
'$query_id'
|
157
163
|
]
|
@@ -14,7 +14,7 @@ module Workarea
|
|
14
14
|
def filter_date_range_and_zeroes
|
15
15
|
{
|
16
16
|
'$match' => {
|
17
|
-
'reporting_on' => { '$gte' => starts_at, '$lte' => ends_at },
|
17
|
+
'reporting_on' => { '$gte' => starts_at.utc, '$lte' => ends_at.utc },
|
18
18
|
'orders' => { '$gt' => 0 },
|
19
19
|
'revenue' => { '$gt' => 0 }
|
20
20
|
}
|
@@ -25,46 +25,50 @@ module Workarea
|
|
25
25
|
|
26
26
|
private
|
27
27
|
|
28
|
+
def reporting_on_in_time_zone
|
29
|
+
{ 'date' => '$reporting_on', 'timezone' => Time.zone.tzinfo.name }
|
30
|
+
end
|
31
|
+
|
28
32
|
def day_id
|
29
33
|
{
|
30
|
-
'year' => { '$year' =>
|
31
|
-
'month' => { '$month' =>
|
32
|
-
'day' => { '$dayOfMonth' =>
|
34
|
+
'year' => { '$year' => reporting_on_in_time_zone },
|
35
|
+
'month' => { '$month' => reporting_on_in_time_zone },
|
36
|
+
'day' => { '$dayOfMonth' => reporting_on_in_time_zone }
|
33
37
|
}
|
34
38
|
end
|
35
39
|
|
36
40
|
def week_id
|
37
41
|
{
|
38
|
-
'year' => { '$year' =>
|
39
|
-
'week' => { '$isoWeek' =>
|
42
|
+
'year' => { '$year' => reporting_on_in_time_zone },
|
43
|
+
'week' => { '$isoWeek' => reporting_on_in_time_zone }
|
40
44
|
}
|
41
45
|
end
|
42
46
|
|
43
47
|
def day_of_week_id
|
44
|
-
{ 'day_of_week' => { '$dayOfWeek' =>
|
48
|
+
{ 'day_of_week' => { '$dayOfWeek' => reporting_on_in_time_zone } }
|
45
49
|
end
|
46
50
|
|
47
51
|
def month_id
|
48
52
|
{
|
49
|
-
'year' => { '$year' =>
|
50
|
-
'month' => { '$month' =>
|
53
|
+
'year' => { '$year' => reporting_on_in_time_zone },
|
54
|
+
'month' => { '$month' => reporting_on_in_time_zone }
|
51
55
|
}
|
52
56
|
end
|
53
57
|
|
54
58
|
def quarter_id
|
55
59
|
{
|
56
|
-
'year' => { '$year' =>
|
60
|
+
'year' => { '$year' => reporting_on_in_time_zone },
|
57
61
|
'quarter' => {
|
58
62
|
'$cond' => [
|
59
|
-
{ '$lte' => [{ '$month' =>
|
63
|
+
{ '$lte' => [{ '$month' => reporting_on_in_time_zone }, 3] },
|
60
64
|
1,
|
61
65
|
{
|
62
66
|
'$cond' => [
|
63
|
-
{ '$lte' => [{ '$month' =>
|
67
|
+
{ '$lte' => [{ '$month' => reporting_on_in_time_zone }, 6] },
|
64
68
|
2,
|
65
69
|
{
|
66
70
|
'$cond' => [
|
67
|
-
{ '$lte' => [{ '$month' =>
|
71
|
+
{ '$lte' => [{ '$month' => reporting_on_in_time_zone }, 9] },
|
68
72
|
3,
|
69
73
|
4
|
70
74
|
]
|
@@ -77,7 +81,7 @@ module Workarea
|
|
77
81
|
end
|
78
82
|
|
79
83
|
def year_id
|
80
|
-
{ 'year' => { '$year' =>
|
84
|
+
{ 'year' => { '$year' => reporting_on_in_time_zone } }
|
81
85
|
end
|
82
86
|
end
|
83
87
|
end
|
@@ -13,7 +13,7 @@ module Workarea
|
|
13
13
|
def filter
|
14
14
|
{
|
15
15
|
'$match' => {
|
16
|
-
'reporting_on' => { '$gte' => starts_at, '$lte' => ends_at },
|
16
|
+
'reporting_on' => { '$gte' => starts_at.utc, '$lte' => ends_at.utc },
|
17
17
|
'$or' => [
|
18
18
|
{ 'orders' => { '$gt' => 0 } },
|
19
19
|
{ 'units_sold' => { '$gt' => 0 } },
|
@@ -13,7 +13,7 @@ module Workarea
|
|
13
13
|
def filter
|
14
14
|
{
|
15
15
|
'$match' => {
|
16
|
-
'reporting_on' => { '$gte' => starts_at, '$lte' => ends_at },
|
16
|
+
'reporting_on' => { '$gte' => starts_at.utc, '$lte' => ends_at.utc },
|
17
17
|
'$or' => [
|
18
18
|
{ 'orders' => { '$gt' => 0 } },
|
19
19
|
{ 'units_sold' => { '$gt' => 0 } },
|
@@ -17,7 +17,7 @@ module Workarea
|
|
17
17
|
def filter
|
18
18
|
result = {
|
19
19
|
'$match' => {
|
20
|
-
'reporting_on' => { '$gte' => starts_at, '$lte' => ends_at },
|
20
|
+
'reporting_on' => { '$gte' => starts_at.utc, '$lte' => ends_at.utc },
|
21
21
|
'$or' => [
|
22
22
|
{ 'orders' => { '$gt' => 0 } },
|
23
23
|
{ 'units_sold' => { '$gt' => 0 } },
|
@@ -14,7 +14,7 @@ module Workarea
|
|
14
14
|
def filter
|
15
15
|
{
|
16
16
|
'$match' => {
|
17
|
-
'reporting_on' => { '$gte' => starts_at, '$lte' => ends_at },
|
17
|
+
'reporting_on' => { '$gte' => starts_at.utc, '$lte' => ends_at.utc },
|
18
18
|
'$or' => [
|
19
19
|
{ 'orders' => { '$gt' => 0 } },
|
20
20
|
{ 'cancellations' => { '$gt' => 0 } }
|
@@ -58,7 +58,7 @@ module Workarea
|
|
58
58
|
return @customization if defined?(@customization)
|
59
59
|
|
60
60
|
result = Customization.find_by_query(params[:q])
|
61
|
-
@customization = result.active? ? result :
|
61
|
+
@customization = result.active? ? result : Customization.new
|
62
62
|
end
|
63
63
|
|
64
64
|
def boosts
|
@@ -5,11 +5,6 @@ Workarea::Configuration.define_fields do
|
|
5
5
|
default: 6,
|
6
6
|
description: 'How many failed login attempts before marking the user locked out'
|
7
7
|
|
8
|
-
field 'Password Reset Timeout',
|
9
|
-
type: :duration,
|
10
|
-
default: 2.hours,
|
11
|
-
description: 'How long a password reset URL stays valid'
|
12
|
-
|
13
8
|
field 'Password Strength',
|
14
9
|
type: :symbol,
|
15
10
|
default: :weak,
|
@@ -1273,6 +1273,9 @@ module Workarea
|
|
1273
1273
|
# Max number of non-unique affinity items that will be stored, older items
|
1274
1274
|
# will be evicted first.
|
1275
1275
|
config.max_affinity_items = 50
|
1276
|
+
|
1277
|
+
# How long a password reset URL stays valid
|
1278
|
+
config.password_reset_timeout = 2.hours
|
1276
1279
|
end
|
1277
1280
|
end
|
1278
1281
|
end
|
@@ -34,41 +34,37 @@ module Workarea
|
|
34
34
|
def find_config(name)
|
35
35
|
config_slug = name.to_s.underscore.downcase
|
36
36
|
from_config = Workarea.config[config_slug].presence ||
|
37
|
-
Rails.application.secrets[config_slug]
|
38
|
-
|
39
|
-
return from_config if from_config.present?
|
37
|
+
Rails.application.secrets[config_slug] ||
|
38
|
+
{}
|
40
39
|
|
41
40
|
env_slug = name.to_s.underscore.upcase
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
password: ENV["WORKAREA_#{env_slug}_PASSWORD"].presence,
|
50
|
-
ssl: scheme == 'rediss' ? true : false
|
51
|
-
}
|
41
|
+
from_config.symbolize_keys.reverse_merge(
|
42
|
+
scheme: ENV["WORKAREA_#{env_slug}_SCHEME"],
|
43
|
+
host: ENV["WORKAREA_#{env_slug}_HOST"],
|
44
|
+
port: ENV["WORKAREA_#{env_slug}_PORT"],
|
45
|
+
db: ENV["WORKAREA_#{env_slug}_DB"],
|
46
|
+
password: ENV["WORKAREA_#{env_slug}_PASSWORD"]
|
47
|
+
)
|
52
48
|
end
|
53
49
|
end
|
54
50
|
|
55
51
|
attr_reader :config
|
56
|
-
alias_method :to_h, :config
|
57
52
|
|
58
53
|
def initialize(config)
|
59
54
|
@config = config.to_h.deep_symbolize_keys
|
60
55
|
end
|
61
56
|
|
62
57
|
def scheme
|
63
|
-
@config[:scheme]
|
58
|
+
@config[:scheme].presence || DEFAULT[:scheme]
|
64
59
|
end
|
65
60
|
|
66
|
-
def ssl
|
67
|
-
|
61
|
+
def ssl?
|
62
|
+
scheme == 'rediss'
|
68
63
|
end
|
64
|
+
alias_method :ssl, :ssl?
|
69
65
|
|
70
66
|
def host
|
71
|
-
@config[:host]
|
67
|
+
@config[:host].presence || DEFAULT[:host]
|
72
68
|
end
|
73
69
|
|
74
70
|
def password
|
@@ -76,19 +72,30 @@ module Workarea
|
|
76
72
|
end
|
77
73
|
|
78
74
|
def port
|
79
|
-
@config[:port]
|
75
|
+
@config[:port].presence || DEFAULT[:port]
|
80
76
|
end
|
81
77
|
|
82
78
|
def db
|
83
|
-
@config[:db]
|
79
|
+
@config[:db].presence || DEFAULT[:db]
|
80
|
+
end
|
81
|
+
|
82
|
+
def to_h
|
83
|
+
{
|
84
|
+
scheme: scheme,
|
85
|
+
host: host,
|
86
|
+
port: port,
|
87
|
+
db: db,
|
88
|
+
password: password,
|
89
|
+
ssl: ssl?
|
90
|
+
}
|
84
91
|
end
|
85
92
|
|
86
93
|
def to_url
|
87
94
|
base = "#{scheme}://"
|
88
95
|
base << "admin:#{password}@" if password.present?
|
89
96
|
base << "#{host}"
|
90
|
-
base << ":#{port}"
|
91
|
-
base << "/#{db}"
|
97
|
+
base << ":#{port}"
|
98
|
+
base << "/#{db}"
|
92
99
|
base
|
93
100
|
end
|
94
101
|
end
|
data/lib/workarea/core.rb
CHANGED
@@ -106,7 +106,6 @@ require 'referer-parser'
|
|
106
106
|
require 'dragonfly/s3_data_store'
|
107
107
|
require 'serviceworker-rails'
|
108
108
|
require 'chartkick'
|
109
|
-
require 'logstasher' if ENV['WORKAREA_LOGSTASH'] =~ /true/i
|
110
109
|
require 'mongoid/encrypted'
|
111
110
|
require 'browser'
|
112
111
|
|
@@ -176,7 +175,6 @@ require 'workarea/configuration/asset_host'
|
|
176
175
|
require 'workarea/configuration/s3'
|
177
176
|
require 'workarea/configuration/cache_store'
|
178
177
|
require 'workarea/configuration/action_mailer'
|
179
|
-
require 'workarea/configuration/logstasher'
|
180
178
|
require 'workarea/configuration/error_handling'
|
181
179
|
require 'workarea/configuration/i18n'
|
182
180
|
require 'workarea/configuration/session'
|
@@ -223,11 +221,14 @@ require 'workarea/warnings'
|
|
223
221
|
require 'workarea/latest_version'
|
224
222
|
|
225
223
|
#
|
226
|
-
#
|
224
|
+
# Engines
|
227
225
|
#
|
228
226
|
#
|
229
227
|
require 'workarea/version'
|
230
228
|
require 'workarea/core/engine'
|
229
|
+
require 'workarea/admin/engine'
|
230
|
+
require 'workarea/storefront/engine'
|
231
|
+
require 'workarea/testing/engine' if Rails.env.test?
|
231
232
|
|
232
233
|
#
|
233
234
|
# Testing
|
data/lib/workarea/core/engine.rb
CHANGED
data/lib/workarea/version.rb
CHANGED
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Workarea
|
4
|
+
module Configuration
|
5
|
+
class RedisTest < TestCase
|
6
|
+
def test_find_config
|
7
|
+
ENV['WORKAREA_FOO_REDIS_PORT'] = '1234'
|
8
|
+
Workarea.config.foo_redis = { scheme: 'rediss' }
|
9
|
+
|
10
|
+
result = Redis.find_config(:foo_redis)
|
11
|
+
assert_equal('rediss', result[:scheme])
|
12
|
+
assert_equal('1234', result[:port])
|
13
|
+
|
14
|
+
ensure
|
15
|
+
ENV.delete('WORKAREA_FOO_REDIS_PORT')
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_defaults
|
19
|
+
instance = Redis.new(host: 'foo')
|
20
|
+
assert_equal('redis', instance.scheme)
|
21
|
+
assert_equal('foo', instance.host)
|
22
|
+
assert_equal(6379, instance.port)
|
23
|
+
assert_equal(0, instance.db)
|
24
|
+
refute(instance.ssl?)
|
25
|
+
assert_match(URI::regexp, instance.to_url)
|
26
|
+
|
27
|
+
instance = Redis.new(scheme: 'rediss')
|
28
|
+
assert_equal('rediss', instance.scheme)
|
29
|
+
assert_equal('localhost', instance.host)
|
30
|
+
assert_equal(6379, instance.port)
|
31
|
+
assert_equal(0, instance.db)
|
32
|
+
assert(instance.ssl?)
|
33
|
+
assert_match(URI::regexp, instance.to_url)
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_to_h
|
37
|
+
result = Redis.new(scheme: 'rediss', port: 1234).to_h
|
38
|
+
assert_equal('rediss', result[:scheme])
|
39
|
+
assert_equal('localhost', result[:host])
|
40
|
+
assert_equal(1234, result[:port])
|
41
|
+
assert_equal(0, result[:db])
|
42
|
+
assert_nil(result[:password])
|
43
|
+
assert(result[:ssl])
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -47,6 +47,10 @@ module Workarea
|
|
47
47
|
embedded_in :foo
|
48
48
|
end
|
49
49
|
|
50
|
+
class Qoo < Bar
|
51
|
+
field :qoo, type: String
|
52
|
+
end
|
53
|
+
|
50
54
|
def test_merging_rows_for_embedded
|
51
55
|
model = Foo.create!(
|
52
56
|
bars: [{ name: '1' }, { name: '2' }],
|
@@ -416,6 +420,50 @@ module Workarea
|
|
416
420
|
|
417
421
|
assert_equal('653911', product.id)
|
418
422
|
end
|
423
|
+
|
424
|
+
def test_embedded_subclasses
|
425
|
+
model = Foo.create!(bars: [{ name: '1' }, { _type: Qoo.name, qoo: '2' }])
|
426
|
+
csv = Csv.new.serialize(model)
|
427
|
+
results = CSV.parse(csv, headers: :first_row).map(&:to_h)
|
428
|
+
|
429
|
+
assert_equal(2, results.size)
|
430
|
+
results.each { |r| assert_equal(model.id.to_s, r['_id']) }
|
431
|
+
assert_equal('1', results.first['bars_name'])
|
432
|
+
assert_equal(Qoo.name, results.second['bars_type'])
|
433
|
+
assert_equal('2', results.second['bars_qoo'])
|
434
|
+
|
435
|
+
import = create_import(
|
436
|
+
model_type: Foo.name,
|
437
|
+
file: create_tempfile(csv, extension: 'csv'),
|
438
|
+
file_type: 'csv'
|
439
|
+
)
|
440
|
+
|
441
|
+
model.destroy
|
442
|
+
Csv.new(import).import!
|
443
|
+
|
444
|
+
model = Foo.first
|
445
|
+
assert_equal(2, model.bars.size)
|
446
|
+
assert_equal(Bar, model.bars.first.class)
|
447
|
+
assert_equal('1', model.bars.first.name)
|
448
|
+
assert_equal(Qoo, model.bars.second.class)
|
449
|
+
assert_equal('2', model.bars.second.qoo)
|
450
|
+
end
|
451
|
+
|
452
|
+
def test_exclude_updated_at
|
453
|
+
original_date = 2.days.ago
|
454
|
+
model = Foo.create!(name: '1', updated_at: original_date)
|
455
|
+
model.name = '2'
|
456
|
+
csv = Csv.new.serialize(model)
|
457
|
+
import = create_import(
|
458
|
+
model_type: Foo.name,
|
459
|
+
file: create_tempfile(csv, extension: 'csv'),
|
460
|
+
file_type: 'csv'
|
461
|
+
)
|
462
|
+
|
463
|
+
assert_changes -> { model.reload.updated_at.to_date } do
|
464
|
+
Csv.new(import).import!
|
465
|
+
end
|
466
|
+
end
|
419
467
|
end
|
420
468
|
end
|
421
469
|
end
|
@@ -7,6 +7,16 @@ module Workarea
|
|
7
7
|
include ApplicationDocument
|
8
8
|
field :name, type: String
|
9
9
|
field :ignore, type: Integer
|
10
|
+
|
11
|
+
embeds_many :bars, class_name: Foo.name
|
12
|
+
end
|
13
|
+
|
14
|
+
class Bar
|
15
|
+
include ApplicationDocument
|
16
|
+
|
17
|
+
field :name, type: String
|
18
|
+
|
19
|
+
embedded_in :foo, class_name: Foo.name
|
10
20
|
end
|
11
21
|
|
12
22
|
def test_ignored_fields
|
@@ -73,6 +83,36 @@ module Workarea
|
|
73
83
|
|
74
84
|
assert_equal 'Bar', user.reload.first_name
|
75
85
|
end
|
86
|
+
|
87
|
+
def test_exclude_updated_at
|
88
|
+
model = Foo.create!(name: '1', updated_at: 2.days.ago)
|
89
|
+
json = [model.as_json.merge(name: '2')].to_json
|
90
|
+
import = create_import(
|
91
|
+
model_type: Foo.name,
|
92
|
+
file: create_tempfile(json, extension: 'json'),
|
93
|
+
file_type: 'json'
|
94
|
+
)
|
95
|
+
|
96
|
+
assert_changes -> { model.reload.updated_at.to_date } do
|
97
|
+
Json.new(import).import!
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_exclude_updated_at_when_embedded
|
102
|
+
original_date = 2.days.ago
|
103
|
+
parent = Foo.create!(updated_at: original_date)
|
104
|
+
model = parent.bars.create!(name: '1', updated_at: original_date)
|
105
|
+
json = [model.as_json.merge(name: '2')].to_json
|
106
|
+
import = create_import(
|
107
|
+
model_type: Foo.name,
|
108
|
+
file: create_tempfile(json, extension: 'json'),
|
109
|
+
file_type: 'json'
|
110
|
+
)
|
111
|
+
|
112
|
+
assert_changes -> { model.reload.updated_at.to_date } do
|
113
|
+
Json.new(import).import!
|
114
|
+
end
|
115
|
+
end
|
76
116
|
end
|
77
117
|
end
|
78
118
|
end
|
@@ -277,11 +277,13 @@ module Workarea
|
|
277
277
|
end
|
278
278
|
|
279
279
|
def test_only_finds_active_customizations
|
280
|
-
Search::Customization.find_by_query('
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
280
|
+
customization = Search::Customization.find_by_query('foo')
|
281
|
+
search = ProductSearch.new(q: 'foo')
|
282
|
+
assert_equal(customization, search.customization)
|
283
|
+
|
284
|
+
customization.update!(active: false)
|
285
|
+
search = ProductSearch.new(q: 'foo')
|
286
|
+
refute_equal(customization, search.customization)
|
285
287
|
refute(search.customization.persisted?)
|
286
288
|
end
|
287
289
|
|
data/workarea-core.gemspec
CHANGED
@@ -90,10 +90,9 @@ Gem::Specification.new do |s|
|
|
90
90
|
s.add_dependency 'loofah', '~> 2.3.1'
|
91
91
|
s.add_dependency 'referer-parser', '~> 0.3.0'
|
92
92
|
s.add_dependency 'serviceworker-rails', '~> 0.5.5'
|
93
|
-
s.add_dependency 'logstasher', '~> 1.2.2'
|
94
93
|
s.add_dependency 'chartkick', '~> 3.3.0'
|
95
|
-
s.add_dependency 'puma', '~> 4.0'
|
96
94
|
s.add_dependency 'browser', '~> 2.6.1'
|
95
|
+
s.add_dependency 'puma', '>= 4.3.1'
|
97
96
|
|
98
97
|
# HACK for vendoring active_shipping
|
99
98
|
s.add_dependency 'active_utils', '~> 3.3.1'
|
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.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Crouse
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-12-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -1080,20 +1080,6 @@ dependencies:
|
|
1080
1080
|
- - "~>"
|
1081
1081
|
- !ruby/object:Gem::Version
|
1082
1082
|
version: 0.5.5
|
1083
|
-
- !ruby/object:Gem::Dependency
|
1084
|
-
name: logstasher
|
1085
|
-
requirement: !ruby/object:Gem::Requirement
|
1086
|
-
requirements:
|
1087
|
-
- - "~>"
|
1088
|
-
- !ruby/object:Gem::Version
|
1089
|
-
version: 1.2.2
|
1090
|
-
type: :runtime
|
1091
|
-
prerelease: false
|
1092
|
-
version_requirements: !ruby/object:Gem::Requirement
|
1093
|
-
requirements:
|
1094
|
-
- - "~>"
|
1095
|
-
- !ruby/object:Gem::Version
|
1096
|
-
version: 1.2.2
|
1097
1083
|
- !ruby/object:Gem::Dependency
|
1098
1084
|
name: chartkick
|
1099
1085
|
requirement: !ruby/object:Gem::Requirement
|
@@ -1109,33 +1095,33 @@ dependencies:
|
|
1109
1095
|
- !ruby/object:Gem::Version
|
1110
1096
|
version: 3.3.0
|
1111
1097
|
- !ruby/object:Gem::Dependency
|
1112
|
-
name:
|
1098
|
+
name: browser
|
1113
1099
|
requirement: !ruby/object:Gem::Requirement
|
1114
1100
|
requirements:
|
1115
1101
|
- - "~>"
|
1116
1102
|
- !ruby/object:Gem::Version
|
1117
|
-
version:
|
1103
|
+
version: 2.6.1
|
1118
1104
|
type: :runtime
|
1119
1105
|
prerelease: false
|
1120
1106
|
version_requirements: !ruby/object:Gem::Requirement
|
1121
1107
|
requirements:
|
1122
1108
|
- - "~>"
|
1123
1109
|
- !ruby/object:Gem::Version
|
1124
|
-
version:
|
1110
|
+
version: 2.6.1
|
1125
1111
|
- !ruby/object:Gem::Dependency
|
1126
|
-
name:
|
1112
|
+
name: puma
|
1127
1113
|
requirement: !ruby/object:Gem::Requirement
|
1128
1114
|
requirements:
|
1129
|
-
- - "
|
1115
|
+
- - ">="
|
1130
1116
|
- !ruby/object:Gem::Version
|
1131
|
-
version:
|
1117
|
+
version: 4.3.1
|
1132
1118
|
type: :runtime
|
1133
1119
|
prerelease: false
|
1134
1120
|
version_requirements: !ruby/object:Gem::Requirement
|
1135
1121
|
requirements:
|
1136
|
-
- - "
|
1122
|
+
- - ">="
|
1137
1123
|
- !ruby/object:Gem::Version
|
1138
|
-
version:
|
1124
|
+
version: 4.3.1
|
1139
1125
|
- !ruby/object:Gem::Dependency
|
1140
1126
|
name: active_utils
|
1141
1127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -1893,7 +1879,6 @@ files:
|
|
1893
1879
|
- lib/workarea/configuration/error_handling.rb
|
1894
1880
|
- lib/workarea/configuration/i18n.rb
|
1895
1881
|
- lib/workarea/configuration/localized_active_fields.rb
|
1896
|
-
- lib/workarea/configuration/logstasher.rb
|
1897
1882
|
- lib/workarea/configuration/mongoid.rb
|
1898
1883
|
- lib/workarea/configuration/mongoid_client.rb
|
1899
1884
|
- lib/workarea/configuration/redis.rb
|
@@ -2073,6 +2058,7 @@ files:
|
|
2073
2058
|
- test/lib/workarea/configuration/administrable/field_test.rb
|
2074
2059
|
- test/lib/workarea/configuration/administrable/fieldset_test.rb
|
2075
2060
|
- test/lib/workarea/configuration/configuration_test.rb
|
2061
|
+
- test/lib/workarea/configuration/redis_test.rb
|
2076
2062
|
- test/lib/workarea/constants_test.rb
|
2077
2063
|
- test/lib/workarea/elasticsearch/document_test.rb
|
2078
2064
|
- test/lib/workarea/elasticsearch/query_cache_test.rb
|
@@ -1,16 +0,0 @@
|
|
1
|
-
module Workarea
|
2
|
-
module Configuration
|
3
|
-
module Logstasher
|
4
|
-
extend self
|
5
|
-
|
6
|
-
def load
|
7
|
-
if ENV['WORKAREA_LOGSTASH'] =~ /true/i
|
8
|
-
Rails.application.config.logstasher.enabled = true
|
9
|
-
Rails.application.config.logstasher.controller_enabled = true
|
10
|
-
Rails.application.config.logstasher.suppress_app_log = true
|
11
|
-
Rails.application.config.logstasher.source = `hostname`.strip!.to_s
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|