workarea-core 3.4.40 → 3.4.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 645f331b3405886c0d82f57d7de6da260a505fd827354b7725d21e618b4b7758
4
- data.tar.gz: 42bb34aaa339295bd0312eb23b33b00e247bde4d57e86958aadb23125c49033f
3
+ metadata.gz: fa0ecabb9a16f7c58840b3d50dc6486c2f064c3d613c744607997105f26102fc
4
+ data.tar.gz: 4ec03996dd8e2bced8818056b06e3128c3b8fa6b079907e2b018e0504641e75b
5
5
  SHA512:
6
- metadata.gz: 50e7704ee466d04fb2b24c36a8f85229d22fd5833fa6bd1a472f6a5a874a7272f4fe5863cff1bdc4dd594e9078d9afc351ba152e403711759c7a7511d7b4729b
7
- data.tar.gz: 4deaaf2b72591659f834f0d105a94ad4f7f69abc31041817ec467beb5d0d2e3f961ca344a0ff780478e448122525a0819eab4029533b6927b4903b279d328a08
6
+ metadata.gz: bee72675acacaffba697db529d9d9a0897603d9327e0d29044825f71c8f114617d056714ab8e83d40b03844d912d065e629a6de2227c4afcea486a1433b99b48
7
+ data.tar.gz: 49ad054e62f63e717f553ad1f75d28f6cb54d9a8e911989513eb4b2d63d7013e5d46e8762040696a20937f8082a570b394b729755f77a73c2d6584f12871ea0b
@@ -9,6 +9,7 @@ module Workarea
9
9
  @current_referrer ||= TrafficReferrer.new(
10
10
  RefererParser::Parser.new.parse(referrer).slice(:source, :medium, :uri)
11
11
  )
12
+ rescue RefererParser::InvalidUriError
12
13
  end
13
14
  end
14
15
  end
@@ -123,6 +123,31 @@ module Workarea
123
123
  return nil if orders.zero?
124
124
  revenue / orders.to_f
125
125
  end
126
+
127
+ def merge!(other)
128
+ # To recalculate average_order_value
129
+ self.orders += other.orders
130
+ self.revenue += other.revenue
131
+
132
+ update = {
133
+ '$set' => {
134
+ average_order_value: average_order_value,
135
+ updated_at: Time.current.utc
136
+ },
137
+ '$inc' => {
138
+ orders: other.orders,
139
+ revenue: other.revenue,
140
+ discounts: other.discounts
141
+ }
142
+ }
143
+
144
+ update['$min'] = { first_order_at: other.first_order_at.utc } if other.first_order_at.present?
145
+ update['$max'] = { last_order_at: other.last_order_at.utc } if other.last_order_at.present?
146
+
147
+ self.class.collection.update_one({ _id: id }, update, upsert: true)
148
+ other.delete
149
+ reload
150
+ end
126
151
  end
127
152
  end
128
153
  end
@@ -11,7 +11,10 @@ module Workarea
11
11
  belongs_to :release, class_name: 'Workarea::Release', index: true
12
12
  belongs_to :releasable, polymorphic: true, index: true, optional: true
13
13
 
14
- index({ 'document_path.type' => 1, 'document_path.document_id' => 1})
14
+ index(
15
+ { 'document_path.type' => 1, 'document_path.document_id' => 1 },
16
+ { name: 'document_path' }
17
+ )
15
18
 
16
19
  # Whether these value changes to this field should be included when
17
20
  # saving a changeset. Used in building changeset hashes.
@@ -38,7 +38,7 @@ module Workarea
38
38
  aggregation = search(query)['aggregations']['grouped_by_type']['type']
39
39
  aggregation['buckets']
40
40
  .reduce([]) { |m, b| m + b['top']['hits']['hits'] }
41
- .sort_by { |r| [r['_source']['jump_to_position'], r['_score']] }
41
+ .sort_by { |r| [r['_source']['jump_to_position'] || 999, r['_score'] || 0] }
42
42
  .map do |result|
43
43
  {
44
44
  label: result['_source']['jump_to_text'],
@@ -0,0 +1,33 @@
1
+ module Workarea
2
+ class UpdateEmail
3
+ include Sidekiq::Worker
4
+ include Sidekiq::CallbacksWorker
5
+
6
+ sidekiq_options(
7
+ enqueue_on: { User => :update, with: -> { [id, changes] } }
8
+ )
9
+
10
+ def perform(id, changes)
11
+ return unless changes['email'].present? && changes['email'].first.present?
12
+
13
+ old_email, new_email = changes['email']
14
+ update_payment_profile(id, old_email, new_email)
15
+ update_metrics(old_email, new_email)
16
+ end
17
+
18
+ def update_payment_profile(id, old_email, new_email)
19
+ user = User.find(id)
20
+ user.email = old_email # set old email so we lookup by old email value
21
+
22
+ Payment::Profile.update_email(PaymentReference.new(user), new_email)
23
+ end
24
+
25
+ def update_metrics(old_email, new_email)
26
+ old_metrics = Metrics::User.find(old_email) rescue nil
27
+ return if old_metrics.blank?
28
+
29
+ new_metrics = Metrics::User.find_or_initialize_by(id: new_email)
30
+ new_metrics.merge!(old_metrics)
31
+ end
32
+ end
33
+ end
@@ -38,7 +38,7 @@ namespace :workarea do
38
38
  author: author
39
39
  }
40
40
 
41
- if subject.start_with?('Revert')
41
+ if subject.start_with?('Revert "')
42
42
  reverts << body.match(/[a-f0-9]{40}/)
43
43
  reverts << sha
44
44
  end
@@ -140,6 +140,7 @@ require 'workarea/ext/mongoid/find_ordered'
140
140
  require 'workarea/ext/sprockets/ruby_processor'
141
141
  require 'workarea/ext/jbuilder/jbuilder_append_partials'
142
142
  require 'workarea/ext/jbuilder/jbuilder_cache'
143
+ require 'workarea/ext/referer_parser/parser.decorator'
143
144
 
144
145
  if Rails.env.development?
145
146
  require 'workarea/ext/freedom_patches/routes_reloader'
@@ -0,0 +1,43 @@
1
+ module RefererParser
2
+ # This code is actually in `master` branch of
3
+ # https://github.com/snowplow-referer-parser/ruby-referer-parser but
4
+ # has not yet been released. It's used to allow through android-app://
5
+ # URLs.
6
+ decorate Parser do
7
+ # Given a string or URI, return a hash of data
8
+ def parse(obj)
9
+ url = obj.is_a?(URI) ? obj : URI.parse(obj.to_s)
10
+
11
+ unless ['android-app', 'http', 'https'].include?(url.scheme)
12
+ raise InvalidUriError, "Only Android-App, HTTP, and HTTPS schemes are supported -- #{url.scheme}"
13
+ end
14
+
15
+ data = { known: false, uri: url.to_s }
16
+
17
+ domain, name_key = domain_and_name_key_for(url)
18
+ if domain && name_key
19
+ referer_data = @name_hash[name_key]
20
+ data[:known] = true
21
+ data[:source] = referer_data[:source]
22
+ data[:medium] = referer_data[:medium]
23
+ data[:domain] = domain
24
+
25
+ # Parse parameters if the referer uses them
26
+ if url.query && referer_data[:parameters]
27
+ query_params = CGI.parse(url.query)
28
+ referer_data[:parameters].each do |param|
29
+ # If there is a matching parameter, get the first non-blank value
30
+ unless (values = query_params[param]).empty?
31
+ data[:term] = values.reject { |v| v.strip == '' }.first
32
+ break if data[:term]
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ data
39
+ rescue URI::InvalidURIError
40
+ raise InvalidUriError.new("Unable to parse URI, not a URI? -- #{obj.inspect}", $ERROR_INFO)
41
+ end
42
+ end
43
+ end
@@ -2,7 +2,7 @@ module Workarea
2
2
  module VERSION
3
3
  MAJOR = 3
4
4
  MINOR = 4
5
- PATCH = 40
5
+ PATCH = 45
6
6
  PRE = nil
7
7
 
8
8
  STRING = [MAJOR, MINOR, PATCH, PRE].compact.join('.')
@@ -0,0 +1,20 @@
1
+ require 'test_helper'
2
+
3
+ module RefererParser
4
+ class ParserTest < Workarea::TestCase
5
+ def test_parse_android_app_referrers
6
+ referrers = [
7
+ 'android-app://com.linkedin.android',
8
+ 'android-app://org.telegram.plus',
9
+ 'android-app://com.twitter.android'
10
+ ]
11
+
12
+ referrers.each do |uri|
13
+ referrer = Parser.new.parse(uri)
14
+
15
+ refute(referrer[:known])
16
+ assert_equal(uri, referrer[:uri])
17
+ end
18
+ end
19
+ end
20
+ end
@@ -74,6 +74,57 @@ module Workarea
74
74
  assert_equal(50, two.revenue_percentile)
75
75
  assert_equal(50, two.average_order_value_percentile)
76
76
  end
77
+
78
+ def test_merging_metrics
79
+ freeze_time
80
+
81
+ first = User.create!(
82
+ first_order_at: 2.weeks.ago,
83
+ last_order_at: 1.day.ago,
84
+ orders: 2,
85
+ revenue: 100,
86
+ discounts: -10,
87
+ average_order_value: 50,
88
+ )
89
+
90
+ first.merge!(User.new)
91
+ first.reload
92
+ assert_equal(1, Metrics::User.count)
93
+ assert_equal(2.weeks.ago, first.first_order_at)
94
+ assert_equal(1.day.ago, first.last_order_at)
95
+ assert_equal(2, first.orders)
96
+ assert_equal(100, first.revenue)
97
+ assert_equal(-10, first.discounts)
98
+ assert_equal(50, first.average_order_value)
99
+
100
+ second = User.create!(id: 'foo').tap { |u| u.merge!(first) }
101
+ second.reload
102
+ assert_equal(1, Metrics::User.count)
103
+ assert_equal(2.weeks.ago, second.first_order_at)
104
+ assert_equal(1.day.ago, second.last_order_at)
105
+ assert_equal(2, second.orders)
106
+ assert_equal(100, second.revenue)
107
+ assert_equal(-10, second.discounts)
108
+ assert_equal(50, second.average_order_value)
109
+
110
+ third = User.create!(
111
+ first_order_at: 3.weeks.ago,
112
+ last_order_at: 3.weeks.ago,
113
+ orders: 2,
114
+ revenue: 120,
115
+ average_order_value: 60,
116
+ )
117
+
118
+ third.merge!(second)
119
+ third.reload
120
+ assert_equal(1, Metrics::User.count)
121
+ assert_equal(3.weeks.ago, third.first_order_at)
122
+ assert_equal(1.day.ago, third.last_order_at)
123
+ assert_equal(4, third.orders)
124
+ assert_equal(220, third.revenue)
125
+ assert_equal(-10, third.discounts)
126
+ assert_equal(55, third.average_order_value)
127
+ end
77
128
  end
78
129
  end
79
130
  end
@@ -0,0 +1,39 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ class UpdateEmailTest < TestCase
5
+ def test_updating_payment_profile
6
+ user = create_user(email: 'user@workarea.com')
7
+ profile = Payment::Profile.lookup(PaymentReference.new(user))
8
+
9
+ UpdateEmail.new.perform(user.id.to_s, 'email' => [nil, 'user@workarea.com'])
10
+ assert_equal(profile.reload.email, 'user@workarea.com')
11
+
12
+ UpdateEmail.new.perform(
13
+ user.id.to_s,
14
+ 'email' => ['user@workarea.com', 'test@workarea.com']
15
+ )
16
+ assert_equal(profile.reload.email, 'test@workarea.com')
17
+ end
18
+
19
+ def test_updating_metrics
20
+ user = create_user(email: 'user@workarea.com')
21
+ old_metrics = Metrics::User.find_or_initialize_by(id: 'user@workarea.com')
22
+ old_metrics.update!(orders: 3)
23
+
24
+ UpdateEmail.new.perform(user.id.to_s, 'email' => [nil, 'user@workarea.com'])
25
+ assert_equal(1, Metrics::User.count)
26
+ assert_equal(3, old_metrics.reload.orders)
27
+
28
+ new_metrics = Metrics::User.create!(id: 'test@workarea.com', orders: 1)
29
+
30
+ UpdateEmail.new.perform(
31
+ user.id.to_s,
32
+ 'email' => ['user@workarea.com', 'test@workarea.com']
33
+ )
34
+ assert_equal(1, Metrics::User.count)
35
+ assert_raises(Mongoid::Errors::DocumentNotFound) { old_metrics.reload }
36
+ assert_equal(4, new_metrics.reload.orders)
37
+ end
38
+ end
39
+ end
@@ -58,7 +58,7 @@ Gem::Specification.new do |s|
58
58
  s.add_dependency 'i18n-js', '~> 3.2.1'
59
59
  s.add_dependency 'local_time', '~> 1.0.3'
60
60
  s.add_dependency 'lodash-rails', '~> 4.17.4'
61
- s.add_dependency 'jquery-rails', '~> 4.3.1'
61
+ s.add_dependency 'jquery-rails', '~> 4.4.0'
62
62
  s.add_dependency 'jquery-ui-rails', '~> 6.0.1'
63
63
  s.add_dependency 'tooltipster-rails', '~> 4.1.2'
64
64
  s.add_dependency 'chart-js-rails', '~> 0.0.9' # TODO remove v4
@@ -67,7 +67,7 @@ Gem::Specification.new do |s|
67
67
  s.add_dependency 'wysihtml-rails', '~> 0.6.0.beta2'
68
68
  s.add_dependency 'rack-attack', '~> 6.3.1'
69
69
  s.add_dependency 'jquery-livetype-rails', '~> 0.1.0' # TODO remove v4
70
- s.add_dependency 'redcarpet', '~> 3.4.0'
70
+ s.add_dependency 'redcarpet', '~> 3.5.1', '>= 3.5.1'
71
71
  s.add_dependency 'jquery-unique-clone-rails', '~> 1.0.0'
72
72
  s.add_dependency 'avalanche-rails', '~> 1.2.0'
73
73
  s.add_dependency 'inline_svg', '~> 1.3.0'
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.4.40
4
+ version: 3.4.45
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-09-16 00:00:00.000000000 Z
11
+ date: 2021-01-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -632,14 +632,14 @@ dependencies:
632
632
  requirements:
633
633
  - - "~>"
634
634
  - !ruby/object:Gem::Version
635
- version: 4.3.1
635
+ version: 4.4.0
636
636
  type: :runtime
637
637
  prerelease: false
638
638
  version_requirements: !ruby/object:Gem::Requirement
639
639
  requirements:
640
640
  - - "~>"
641
641
  - !ruby/object:Gem::Version
642
- version: 4.3.1
642
+ version: 4.4.0
643
643
  - !ruby/object:Gem::Dependency
644
644
  name: jquery-ui-rails
645
645
  requirement: !ruby/object:Gem::Requirement
@@ -758,14 +758,20 @@ dependencies:
758
758
  requirements:
759
759
  - - "~>"
760
760
  - !ruby/object:Gem::Version
761
- version: 3.4.0
761
+ version: 3.5.1
762
+ - - ">="
763
+ - !ruby/object:Gem::Version
764
+ version: 3.5.1
762
765
  type: :runtime
763
766
  prerelease: false
764
767
  version_requirements: !ruby/object:Gem::Requirement
765
768
  requirements:
766
769
  - - "~>"
767
770
  - !ruby/object:Gem::Version
768
- version: 3.4.0
771
+ version: 3.5.1
772
+ - - ">="
773
+ - !ruby/object:Gem::Version
774
+ version: 3.5.1
769
775
  - !ruby/object:Gem::Dependency
770
776
  name: jquery-unique-clone-rails
771
777
  requirement: !ruby/object:Gem::Requirement
@@ -882,22 +888,22 @@ dependencies:
882
888
  name: minitest
883
889
  requirement: !ruby/object:Gem::Requirement
884
890
  requirements:
885
- - - ">="
886
- - !ruby/object:Gem::Version
887
- version: 5.10.1
888
891
  - - "~>"
889
892
  - !ruby/object:Gem::Version
890
893
  version: 5.10.3
894
+ - - ">="
895
+ - !ruby/object:Gem::Version
896
+ version: 5.10.1
891
897
  type: :runtime
892
898
  prerelease: false
893
899
  version_requirements: !ruby/object:Gem::Requirement
894
900
  requirements:
895
- - - ">="
896
- - !ruby/object:Gem::Version
897
- version: 5.10.1
898
901
  - - "~>"
899
902
  - !ruby/object:Gem::Version
900
903
  version: 5.10.3
904
+ - - ">="
905
+ - !ruby/object:Gem::Version
906
+ version: 5.10.1
901
907
  - !ruby/object:Gem::Dependency
902
908
  name: countries
903
909
  requirement: !ruby/object:Gem::Requirement
@@ -1711,7 +1717,7 @@ files:
1711
1717
  - app/workers/workarea/status_reporter.rb
1712
1718
  - app/workers/workarea/undo_release.rb
1713
1719
  - app/workers/workarea/update_elasticsearch_settings.rb
1714
- - app/workers/workarea/update_payment_profile_email.rb
1720
+ - app/workers/workarea/update_email.rb
1715
1721
  - app/workers/workarea/verify_scheduled_releases.rb
1716
1722
  - bin/rails
1717
1723
  - config/i18n-js.yml
@@ -1873,6 +1879,7 @@ files:
1873
1879
  - lib/workarea/ext/mongoid/list_field.rb
1874
1880
  - lib/workarea/ext/mongoid/moped_bson.rb
1875
1881
  - lib/workarea/ext/mongoid/timestamps_timeless.rb
1882
+ - lib/workarea/ext/referer_parser/parser.decorator
1876
1883
  - lib/workarea/ext/sprockets/ruby_processor.rb
1877
1884
  - lib/workarea/ext/sprockets/task.rb
1878
1885
  - lib/workarea/geolocation.rb
@@ -2017,6 +2024,7 @@ files:
2017
2024
  - test/lib/workarea/ext/mongoid/except_test.rb
2018
2025
  - test/lib/workarea/ext/mongoid/find_ordered_test.rb
2019
2026
  - test/lib/workarea/ext/mongoid/list_field_test.rb
2027
+ - test/lib/workarea/ext/referer_parser/parser_test.rb
2020
2028
  - test/lib/workarea/geolocation_test.rb
2021
2029
  - test/lib/workarea/lint/inconsistent_details_test.rb
2022
2030
  - test/lib/workarea/lint/products_missing_images_test.rb
@@ -2366,7 +2374,7 @@ files:
2366
2374
  - test/workers/workarea/send_refund_email_test.rb
2367
2375
  - test/workers/workarea/status_reporter_test.rb
2368
2376
  - test/workers/workarea/undo_release_test.rb
2369
- - test/workers/workarea/update_payment_profile_email_test.rb
2377
+ - test/workers/workarea/update_email_test.rb
2370
2378
  - test/workers/workarea/verify_scheduled_releases_test.rb
2371
2379
  - vendor/active_shipping/.gitignore
2372
2380
  - vendor/active_shipping/.travis.yml
@@ -2614,7 +2622,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
2614
2622
  - !ruby/object:Gem::Version
2615
2623
  version: '0'
2616
2624
  requirements: []
2617
- rubygems_version: 3.0.3
2625
+ rubygems_version: 3.2.3
2618
2626
  signing_key:
2619
2627
  specification_version: 4
2620
2628
  summary: Core of the Workarea Commerce Platform
@@ -1,22 +0,0 @@
1
- module Workarea
2
- class UpdatePaymentProfileEmail
3
- include Sidekiq::Worker
4
- include Sidekiq::CallbacksWorker
5
-
6
- sidekiq_options(
7
- enqueue_on: { User => :update, with: -> { [id, changes] } }
8
- )
9
-
10
- def perform(id, changes)
11
- if changes['email'].present? && changes['email'].first.present?
12
- old_email = changes['email'].first
13
- new_email = changes['email'].last
14
-
15
- user = User.find(id)
16
- user.email = old_email # set old email so we lookup by old email value
17
-
18
- Payment::Profile.update_email(PaymentReference.new(user), new_email)
19
- end
20
- end
21
- end
22
- end
@@ -1,27 +0,0 @@
1
- require 'test_helper'
2
-
3
- module Workarea
4
- class UpdatePaymentProfileEmailTest < Workarea::TestCase
5
- setup do
6
- @user = create_user(email: 'user@workarea.com')
7
- @profile = Payment::Profile.lookup(PaymentReference.new(@user))
8
- @worker = UpdatePaymentProfileEmail.new
9
- end
10
-
11
- def test_updating_payment_profile_email_address
12
- @worker.perform(
13
- @user.id.to_s,
14
- 'email' => ['user@workarea.com', 'test@workarea.com']
15
- )
16
-
17
- @profile.reload
18
- assert_equal(@profile.email, 'test@workarea.com')
19
- end
20
-
21
- def test_skipping_update_if_email_change_is_nil
22
- @worker.perform(@user.id.to_s, 'email' => [nil, 'user@workarea.com'])
23
- @profile.reload
24
- assert_equal(@profile.email, 'user@workarea.com')
25
- end
26
- end
27
- end