workarea-core 3.5.0 → 3.5.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|