auctify 1.1.3 → 1.1.5

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: 14832525cab9835407bccb94056500037fe39da17a9ea311f7053ce4adf48255
4
- data.tar.gz: 522647a33fa236dd02c2980ecde719508bd83f21db2c0ffa38d1d77ce104d002
3
+ metadata.gz: 7e40c33ab5508a5874d200e861cebe30e1c7b9b99dd0d6a24376998f7eca011c
4
+ data.tar.gz: 026de4ef6565e73d83e0e9e433cca5872a6be4a4a92aa1e5b85b2ec64a44ad99
5
5
  SHA512:
6
- metadata.gz: 803112a2c554cb95f1eb818911ea4a92d4377306ba936ac5190101f8463a5378d225a5c260a50e01e8cc0f379ddd87b1d57902d186a8469c7baa34dee991f23a
7
- data.tar.gz: ee8f293dbba3adc69a730d208b4973ebf7d9609d326bca03eda616ca668edfb792b2d4d9b09bef211a5c08db221da2befcd507d9d3f0844c5d8de1e774db46d8
6
+ metadata.gz: 3f1c2cce869ea2fd00ca4a8a078d4f5febb15b0ce328682847a47cbdc5b2410fd120e55c5d54ee79ea5f38388ef87157232d2b0fc133f81931f1b4f4dc77246f
7
+ data.tar.gz: c07420c8fa9d289d99f947e4debcb653cc0a34c2c24500878d8317482fd39201054aec71d36b83d7b80994ad77b9b53d85b5648fe44fae3e5f777202aa4e11cb
data/README.md CHANGED
@@ -221,7 +221,19 @@ end
221
221
 
222
222
  To protect accidential deletions, many associations are binded with `dependent: restrict_with_error`. Correct order ofdeletion is `bids` => `sales` => `sales_packs`.
223
223
 
224
-
224
+ ## Monitor it
225
+ Auctify should add some metrics for Prometheus (using Yabeda gem). Exposing them on `/metrics` path.
226
+ ```
227
+ group :auctify do
228
+ counter :bids_count, comment: "A counter of applied bids"
229
+ gauge :diff_in_closing_time_seconds,
230
+ comment: "Difference between auction.currently_ends_at and actual sale end time by job"
231
+ gauge :time_between_bids, comment: "Time period between last two bids", tags: [:auction_slug]
232
+ end
233
+ ```
234
+ See `lib/yabeda_config.rb` for current setup.
235
+ Note: `diff_in_closing_time_seconds` is fill in `auction.close_bidding!`. At normal setup this is done in background job, so value is maintained in BJ process not rails app.
236
+ Eg. if You use sidekiq for backgoud jobs, You will need `yabeda-sidekiq` gem and then value vwill be displayed at port 9394 (`your.app:9394/metrics`).
225
237
 
226
238
  ## Contributing
227
239
  Contribution directions go here.
data/Rakefile CHANGED
@@ -23,12 +23,11 @@ load "rails/tasks/statistics.rake"
23
23
 
24
24
  require "bundler/gem_tasks"
25
25
 
26
- require "rake/testtask"
27
-
28
- Rake::TestTask.new(:test) do |t|
29
- t.libs << "test"
30
- t.pattern = "test/**/*_test.rb"
31
- t.verbose = false
32
- end
33
-
34
- task default: :test
26
+ ## use `rails test` instead
27
+ # require "rake/testtask"
28
+ # Rake::TestTask.new(:test) do |t|
29
+ # t.libs << "test"
30
+ # t.pattern = "test/**/*_test.rb"
31
+ # t.verbose = false
32
+ # end
33
+ # task default: :test
@@ -15,15 +15,15 @@ module Auctify
15
15
  end
16
16
 
17
17
  def bids
18
- if params[:confirmation] == "1"
18
+ if params[:terms_confirmation] == "1"
19
19
  if @auction.bid!(new_bid)
20
20
  @auction.reload
21
21
 
22
- store_dont_confirm_bids
22
+ store_confirmations_checkboxes
23
23
 
24
24
  render_record @auction, success: true, overbid_by_limit: overbid_by_limit?(new_bid)
25
25
  else
26
- store_dont_confirm_bids
26
+ store_confirmations_checkboxes
27
27
 
28
28
  render_record @auction, bid: new_bid, status: 400
29
29
  end
@@ -63,11 +63,18 @@ module Auctify
63
63
  }, status: status
64
64
  end
65
65
 
66
- def store_dont_confirm_bids
67
- if params[:dont_confirm_bids] == "1"
68
- # use SQL update in case of some obscure invalid attributes
69
- bidder_regs = current_user.bidder_registrations.where(auction: @auction)
70
- bidder_regs.update_all(dont_confirm_bids: true) if bidder_regs.present?
66
+ def store_confirmations_checkboxes
67
+ bidder_regs = current_user.bidder_registrations.where(auction: @auction)
68
+ if bidder_regs.present?
69
+ atts = { dont_confirm_bids: params[:dont_confirm_bids] == "1",
70
+ confirmed_sales_pack_terms: params[:terms_confirmation] == "1" }
71
+ bidder_regs.update_all(atts)
72
+
73
+ if atts[:confirmed_sales_pack_terms]
74
+ current_user.bidder_registrations.for_pack(bidder_regs.last.auction.pack)
75
+ .where(confirmed_sales_pack_terms: false)
76
+ .update_all(confirmed_sales_pack_terms: true)
77
+ end
71
78
  end
72
79
  end
73
80
 
@@ -2,5 +2,9 @@
2
2
 
3
3
  module Auctify
4
4
  class ApplicationJob < ActiveJob::Base
5
+ private
6
+ def auction_label(auction)
7
+ "[#{auction.try(:slug)}##{auction.id}; currently_ends_at: #{auction.currently_ends_at}]"
8
+ end
5
9
  end
6
10
  end
@@ -12,11 +12,14 @@ module Auctify
12
12
  return
13
13
  end
14
14
 
15
- return if Time.current < auction.currently_ends_at
16
-
17
- Auctify::Sale::Auction.with_advisory_lock("closing_auction_#{auction_id}") do
18
- # can wait unitl other BCJob release lock and than continue!
19
- auction.close_bidding! if auction.reload.in_sale?
15
+ if Time.current < auction.currently_ends_at
16
+ Rails.logger.info("Too soon for closing of auction #{auction_label(auction)}.")
17
+ else
18
+ Rails.logger.info("Closing auction #{auction_label(auction)} NOW!")
19
+ Auctify::Sale::Auction.with_advisory_lock("closing_auction_#{auction_id}") do
20
+ # can wait unitl other BCJob release lock and than continue!
21
+ auction.close_bidding! if auction.reload.in_sale?
22
+ end
20
23
  end
21
24
  end
22
25
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Auctify
4
- class EnsureAuctionsClosingJob < ApplicationJob
4
+ class EnsureAuctionsClosingJob < Auctify::ApplicationJob
5
5
  queue_as :critical
6
6
 
7
7
  def perform
@@ -9,8 +9,10 @@ module Auctify
9
9
  .where("currently_ends_at <= ?", Time.current + checking_period_to_future)
10
10
  auctions.each do |auction|
11
11
  if auction.currently_ends_at <= Time.current
12
+ Rails.logger.info("Queueing auction #{auction_label(auction)} for immediate close.")
12
13
  Auctify::BiddingCloserJob.perform_later(auction_id: auction.id)
13
14
  else
15
+ Rails.logger.info("Delaying close of auction #{auction_label(auction)}.")
14
16
  Auctify::BiddingCloserJob.set(wait_until: auction.currently_ends_at).perform_later(auction_id: auction.id)
15
17
  end
16
18
  end
@@ -8,6 +8,7 @@ module Auctify
8
8
  scope :applied, -> { where(cancelled: false) }
9
9
  scope :canceled, -> { where(cancelled: true) }
10
10
  scope :with_limit, -> { where.not(max_price: nil) }
11
+ scope :manual, -> { where(autobid: false) }
11
12
 
12
13
  validate :price_is_not_bigger_then_max_price
13
14
  validate :price_is_rounded
@@ -17,6 +17,8 @@ module Auctify
17
17
  inverse_of: :registration,
18
18
  dependent: :restrict_with_error # destroy them manually first
19
19
 
20
+ scope :for_pack, ->(pack) { where(auction: pack.sales) }
21
+
20
22
  aasm do
21
23
  state :pending, initial: true, color: "gray"
22
24
  state :approved, color: "green"
@@ -81,15 +83,16 @@ end
81
83
  #
82
84
  # Table name: auctify_bidder_registrations
83
85
  #
84
- # id :bigint(8) not null, primary key
85
- # bidder_type :string not null
86
- # bidder_id :integer not null
87
- # auction_id :integer not null
88
- # aasm_state :string default("pending"), not null
89
- # handled_at :datetime
90
- # created_at :datetime not null
91
- # updated_at :datetime not null
92
- # dont_confirm_bids :boolean default(FALSE)
86
+ # id :bigint(8) not null, primary key
87
+ # bidder_type :string not null
88
+ # bidder_id :bigint(8) not null
89
+ # auction_id :bigint(8) not null
90
+ # aasm_state :string default("pending"), not null
91
+ # handled_at :datetime
92
+ # created_at :datetime not null
93
+ # updated_at :datetime not null
94
+ # dont_confirm_bids :boolean default(FALSE)
95
+ # confirmed_sales_pack_terms :boolean default(FALSE)
93
96
  #
94
97
  # Indexes
95
98
  #
@@ -69,7 +69,9 @@ module Auctify
69
69
 
70
70
  after do
71
71
  self.winner = current_winner
72
+
72
73
  now = Time.current
74
+ Yabeda.auctify.diff_in_closing_time_seconds.set({}, (now - self.currently_ends_at).round)
73
75
  self.currently_ends_at = now if now < currently_ends_at
74
76
 
75
77
  after_close_bidding
@@ -162,6 +164,7 @@ module Auctify
162
164
  bap = Auctify::BidsAppender.call(auction: self, bid: bid)
163
165
 
164
166
  bap.success? ? after_bid_appended(bap) : after_bid_not_appended(bap)
167
+
165
168
  bap.success?
166
169
  end
167
170
  end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddConfirmedSalesPackTermsToBidderRegistrations < ActiveRecord::Migration[6.1]
4
+ def change
5
+ add_column :auctify_bidder_registrations, :confirmed_sales_pack_terms, :boolean, default: false
6
+
7
+ execute "UPDATE auctify_bidder_registrations SET confirmed_sales_pack_terms = true WHERE dont_confirm_bids = true;"
8
+ end
9
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Auctify
4
+ class Railtie < Rails::Railtie
5
+ # I did not found way, how to chec for presence of Yabeda::Prometheus::Exporter in middleware
6
+ if require "yabeda/prometheus"
7
+ initializer "auctify.railtie_initialization" do |main_app|
8
+ main_app.middleware.use ::Yabeda::Prometheus::Exporter
9
+ end
10
+ end
11
+ end
12
+ end
13
+
14
+ require "yabeda_config.rb"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Auctify
4
- VERSION = "1.1.3"
4
+ VERSION = "1.1.5"
5
5
  end
data/lib/auctify.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "auctify/railtie" if defined?(Rails::Railtie)
4
+
3
5
  require "auctify/engine"
4
6
  require "auctify/configuration"
5
7
 
@@ -0,0 +1,8 @@
1
+ namespace :test do
2
+ Rake::TestTask.new(:dummy) do |t|
3
+ t.libs << "test"
4
+ t.pattern = 'test/dummy/test/**/*_test.rb'
5
+ t.verbose = true
6
+ end
7
+ end
8
+ # Rake::Task[:test].enhance ["test:dummy"]
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ Yabeda.configure do
4
+ group :auctify do
5
+ gauge :bids_count,
6
+ comment: "A count of all applied bids"
7
+ # counter :bids_count, comment: "A count of all applied bids"
8
+ gauge :time_between_last_bids_seconds,
9
+ comment: "Time period between last two manual bids"
10
+ gauge :current_max_delay_in_closing_auction_seconds,
11
+ comment: "Delay from oldest `currently_ends_at` of auction in sale (that should be already closed)."
12
+
13
+
14
+ # this is done when auction.close_bidding! is run
15
+ gauge :diff_in_closing_time_seconds,
16
+ comment: "Difference between auction.currently_ends_at and actual sale end time by job"
17
+ end
18
+
19
+ # to fetch correct data independently on process/container
20
+ # we collect them at request for /metrics, not at "trigger" time
21
+ collect do # when /metrics is displayed
22
+ auctify.bids_count.set({}, Auctify::Bid.count)
23
+
24
+ last_bid_times = Auctify::Bid.applied.manual.order(created_at: :desc).limit(2).pluck(:created_at)
25
+ auctify.time_between_last_bids_seconds.set({}, last_bid_times.size == 2 ? (last_bid_times.first - last_bid_times.last).round : 0)
26
+
27
+ auction = Auctify::Sale::Auction.in_sale.order(currently_ends_at: :asc).first
28
+ if auction.blank?
29
+ auctify.current_max_delay_in_closing_auction_seconds.set({}, -1)
30
+ else
31
+ delay = [0, (Time.current - auction.currently_ends_at)].max # only positive number
32
+ auctify.current_max_delay_in_closing_auction_seconds.set({}, delay.round)
33
+ end
34
+ end
35
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: auctify
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
4
+ version: 1.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - foton
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-19 00:00:00.000000000 Z
11
+ date: 2023-09-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: yabeda-prometheus
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: pg
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -425,16 +439,20 @@ files:
425
439
  - db/migrate/20210917082313_add_auction_prolonging_limit_to_sales_packs.rb
426
440
  - db/migrate/20211022133253_add_autobid_to_auctify_bids.rb
427
441
  - db/migrate/20211203064934_update_sales_featurable.rb
442
+ - db/migrate/20230905114142_add_confirmed_sales_pack_terms_to_bidder_registrations.rb
428
443
  - lib/auctify.rb
429
444
  - lib/auctify/configuration.rb
430
445
  - lib/auctify/engine.rb
446
+ - lib/auctify/railtie.rb
431
447
  - lib/auctify/version.rb
432
448
  - lib/tasks/auctify_tasks.rake
449
+ - lib/tasks/test_tasks.rake
450
+ - lib/yabeda_config.rb
433
451
  homepage: https://github.com/sinfin/auctify
434
452
  licenses:
435
453
  - MIT
436
454
  metadata: {}
437
- post_install_message:
455
+ post_install_message:
438
456
  rdoc_options: []
439
457
  require_paths:
440
458
  - lib
@@ -449,8 +467,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
449
467
  - !ruby/object:Gem::Version
450
468
  version: '0'
451
469
  requirements: []
452
- rubygems_version: 3.2.28
453
- signing_key:
470
+ rubygems_version: 3.0.3
471
+ signing_key:
454
472
  specification_version: 4
455
473
  summary: Gem for adding auction behavior to models.
456
474
  test_files: []