unit4-checkout 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: daaa49e8775ebbc94ab1fcd91ebc047772dcf21a129487c1a7661ee4137071ff
4
- data.tar.gz: 64c3fcd3083a1d907505c05df723ae6b380968ebdf99f7e3b59a87a8b7e4a46e
3
+ metadata.gz: 3539766a2698101358c85167d1f34d563461cdc23b24098439e1948c2e815fba
4
+ data.tar.gz: 40bc469e6c776039f1d2d424b73d9904e08546181af2f95a117fbd9b4e39d553
5
5
  SHA512:
6
- metadata.gz: ea07d980c46d2cb90f2d8b2e3db5049438472b70d6562246a59d457548d8066b42b0b0566f768372a44c89cc18540185e8b70763cb68d36483bb805136b4993e
7
- data.tar.gz: fc7d39fe9a7b4b383d1b8d77f4f96f1a46f6b279f1d501302f00bac20f7575c246c1534134d50c238549e1656dcbaceaffbac965de79aee4b1ddde8ed18d2041
6
+ metadata.gz: 7abf3c6c31eeaff5105c9f966d8751e14e94aeb585c31a7a6c3e42321797429ce6ae1e6a7fcd083e30801df9b4795144be22967bb5d759c81ca94af447ce146d
7
+ data.tar.gz: d5c3abb4a0ce0c7599fc5193d44d73560b7de229b1bdb8c9a1607ee71ab2dd569a860292487a9b05fac605082f950a0e6d001fc20a9e119940b03490c6e4a073
data/Gemfile CHANGED
@@ -14,5 +14,3 @@ gem "rubocop", "~> 1.21"
14
14
  gem "activerecord"
15
15
 
16
16
  gem "erb"
17
-
18
- gem "sqlite3"
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- unit4-checkout (0.1.3)
4
+ unit4-checkout (0.2.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -57,7 +57,6 @@ GEM
57
57
  rubocop-ast (1.15.2)
58
58
  parser (>= 3.0.1.1)
59
59
  ruby-progressbar (1.11.0)
60
- sqlite3 (1.4.4)
61
60
  tzinfo (2.0.5)
62
61
  concurrent-ruby (~> 1.0)
63
62
  unicode-display_width (2.1.0)
@@ -71,7 +70,6 @@ DEPENDENCIES
71
70
  rake (~> 13.0)
72
71
  rspec (~> 3.0)
73
72
  rubocop (~> 1.21)
74
- sqlite3
75
73
  unit4-checkout!
76
74
 
77
75
  BUNDLED WITH
@@ -1,25 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "active_record"
4
- require "erb"
5
-
6
3
  class Checkout
7
- attr_reader :promotional_rules, :total, :basket, :total_price_discount_applied_flag, :result
4
+ attr_reader :total
8
5
 
9
6
  def initialize(promotional_rules = {})
10
- raise TypeError, "expected a Hash, got #{promotional_rules.class.name}" unless promotional_rules.is_a? Hash
11
- raise KeyError, "expected Hash with optional keys 'product_discounts' and 'total_price_discount" unless correct_keys?(promotional_rules)
7
+ raise PromotionalRulesTypeError, promotional_rules.class.name unless promotional_rules.is_a? Hash
8
+ raise PromotionalRulesForbiddenKeys unless correct_keys?(promotional_rules)
12
9
 
13
10
  @promotional_rules = promotional_rules
14
11
  @total = 0
15
12
  @basket = Basket.new
16
- establish_connection
13
+ create_db_connection
17
14
  end
18
15
 
19
16
  def correct_keys?(promotional_rules)
20
17
  (promotional_rules.keys - %i[product_discounts total_price_discount]).empty?
21
18
  end
22
19
 
20
+ def create_db_connection
21
+ Connection.new
22
+ end
23
+
23
24
  # maybe facilitate scanning multiple items at once
24
25
  # no structure for item given, assumed id
25
26
  def scan(item)
@@ -27,7 +28,6 @@ class Checkout
27
28
  add_to_basket(item)
28
29
  calculate_total(item)
29
30
  puts "Item with ID '#{item}' has been added to the basket successfully!"
30
- @total
31
31
  end
32
32
 
33
33
  def calculate_total(item)
@@ -38,18 +38,12 @@ class Checkout
38
38
  item_discounted?(item) ? apply_item_discount(item, item_price) : @total += item_price
39
39
  apply_total_discount if total_price_discounted?
40
40
  end
41
- @total = @total.ceil(2)
41
+ @total = @total.round(2)
42
42
  end
43
43
 
44
44
  def item_price(item)
45
- # TODO: check if user has supplied price
46
45
  # TODO: facilitate DB name different from products, i.e. ask gem user for db name???
47
- find_price_sql(item)
48
- end
49
-
50
- def prepare_sql_statement(item)
51
- # TODO: keep seen items in cache or variable !!!!!!!!!
52
- ActiveRecord::Base.sanitize_sql_array(["SELECT 'products'.'price' FROM 'products' WHERE 'products'.'id' = ?", item])
46
+ PriceQuery.new(item).find_price
53
47
  end
54
48
 
55
49
  def apply_item_and_total_discount(item, item_price)
@@ -106,32 +100,6 @@ class Checkout
106
100
  @total_price_discount_applied_flag = true
107
101
  end
108
102
 
109
- def find_price_sql(item)
110
- sanitized_query = prepare_sql_statement(item)
111
- results = ActiveRecord::Base.connection.exec_query(sanitized_query)
112
- results.rows.first.first if results.present?
113
- end
114
-
115
- def establish_connection
116
- db_config = setup_db_config
117
- ActiveRecord::Base.establish_connection(adapter: db_config["adapter"], database: db_config["database"])
118
- end
119
-
120
- def setup_db_config
121
- defined?(Rails) && defined?(Rails.env) ? rails_db_config : non_rails_db_config
122
- end
123
-
124
- def rails_db_config
125
- Rails.application.config.database_configuration[Rails.env]
126
- end
127
-
128
- def non_rails_db_config
129
- # TODO: use current database instead of development
130
- YAML.safe_load(ERB.new(File.read("./config/database.yml")).result, aliases: true)["development"]
131
- end
132
-
133
- # maybe add remove item function
134
-
135
103
  def add_to_basket(item)
136
104
  @basket.items[item] ? @basket.items[item] += 1 : @basket.items[item] = 1
137
105
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+ require "erb"
5
+
6
+ class Connection
7
+ def initialize
8
+ db_config = setup_db_config
9
+ ActiveRecord::Base.establish_connection(adapter: db_config["adapter"], database: db_config["database"])
10
+ end
11
+
12
+ def setup_db_config
13
+ defined?(Rails) && defined?(Rails.env) ? rails_db_config : non_rails_db_config
14
+ end
15
+
16
+ def rails_db_config
17
+ Rails.application.config.database_configuration[Rails.env]
18
+ end
19
+
20
+ def non_rails_db_config
21
+ # TODO: use current database instead of development
22
+ YAML.safe_load(ERB.new(File.read("./config/database.yml")).result, aliases: true)["development"]
23
+ end
24
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ class PromotionalRulesTypeError < TypeError
4
+ def initialize(class_name, msg = "expected a Hash, got ", exception_type = "custom")
5
+ msg += class_name
6
+ @exception_type = exception_type
7
+ super(msg)
8
+ end
9
+ end
10
+
11
+ class PromotionalRulesForbiddenKeys < TypeError
12
+ def initialize(msg = "expected Hash with optional keys 'product_discounts' and 'total_price_discount", exception_type = "custom")
13
+ @exception_type = exception_type
14
+ super(msg)
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ class PriceQuery
2
+
3
+ def initialize(item)
4
+ @sanitized_query = prepare_sql_statement(item)
5
+ end
6
+
7
+ def prepare_sql_statement(item)
8
+ # TODO: keep seen items in cache or variable !!!!!!!!!
9
+ ActiveRecord::Base.sanitize_sql_array(["SELECT 'products'.'price' FROM 'products' WHERE 'products'.'id' = ?", item])
10
+ end
11
+
12
+ def find_price
13
+ results = ActiveRecord::Base.connection.exec_query(@sanitized_query)
14
+ results.rows.first.first if results.present?
15
+ end
16
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Unit4
4
4
  module Checkout
5
- VERSION = "0.2.0"
5
+ VERSION = "0.2.1"
6
6
  end
7
7
  end
@@ -3,6 +3,9 @@
3
3
  require_relative "checkout/version"
4
4
  require_relative "checkout/checkout"
5
5
  require_relative "checkout/basket"
6
+ require_relative "checkout/connection"
7
+ require_relative "checkout/price_query"
8
+ require_relative "checkout/exceptions"
6
9
 
7
10
  module Unit4
8
11
  module Checkout
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unit4-checkout
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Boyan Georgiev
@@ -10,7 +10,8 @@ bindir: exe
10
10
  cert_chain: []
11
11
  date: 2022-07-22 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: Initial commit
13
+ description: A Ruby gem that helps the user implement a checkout system by supplying
14
+ only the promotional rules
14
15
  email:
15
16
  - bbgeorgiev96@gmail.com
16
17
  executables: []
@@ -26,10 +27,14 @@ files:
26
27
  - lib/unit4/checkout.rb
27
28
  - lib/unit4/checkout/basket.rb
28
29
  - lib/unit4/checkout/checkout.rb
30
+ - lib/unit4/checkout/connection.rb
31
+ - lib/unit4/checkout/exceptions.rb
32
+ - lib/unit4/checkout/price_query.rb
29
33
  - lib/unit4/checkout/version.rb
30
34
  - sig/unit4/checkout.rbs
31
35
  homepage: https://github.com/BoyanGeorgiev96/unit4-checkout
32
- licenses: []
36
+ licenses:
37
+ - MIT
33
38
  metadata:
34
39
  allowed_push_host: https://rubygems.org/
35
40
  homepage_uri: https://github.com/BoyanGeorgiev96/unit4-checkout
@@ -52,5 +57,5 @@ requirements: []
52
57
  rubygems_version: 3.3.3
53
58
  signing_key:
54
59
  specification_version: 4
55
- summary: Initial commit
60
+ summary: Checkout gem for Unit4 technical task
56
61
  test_files: []