inci_score 4.6.0 → 4.6.2

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: 7c1ec290c92d1fb34798dbd04ec8f93a6ad1db12fd124ff2f7d0c4a50c108aa7
4
- data.tar.gz: dad169f8a2486aeeac3a22df47097235d965b9435350d4800d662c9022f0a36c
3
+ metadata.gz: 948a01654e32fadaaa2cce158a59e84fc3f904a403d89fabfe18b3529600d0a8
4
+ data.tar.gz: 664c64f7dfb9003fcd1fa795d39c59157f1742d1e42653e504e9be2be47c196e
5
5
  SHA512:
6
- metadata.gz: 34394e8b825952f6ff98696ba899592f23a0acd8e3b95331c1d645903ac9795569dc6e115ff1dca5df0ae4aee551b54aae0e32b91faa302b4338b4e37769d797
7
- data.tar.gz: 1b932c8c80adfc5b0989383a7c31c7b78432890dd3b86c54c887b1d3146f6629332cb7abd16e50b70343113bf3beb76233f4cd0d77fd684e26e7377ca0a8ee7f
6
+ metadata.gz: 7429c7077f89e8054782460772db0ed3f95f28a6ce686b2c060c3eceea0fa23e1169072727fca021f9c53a7e8afb55a28f87d7f1e7309292a48511a2fbcf895e
7
+ data.tar.gz: ca66118c3e79de310d0031fb2dfa17e91c62e772138798072c4c3eff0566e6e91e51a170c3d1f727511af3470455f1eefe8c064bbfda961cf7086b6c0f19c9dd
data/README.md CHANGED
@@ -58,18 +58,21 @@ require "inci_score"
58
58
 
59
59
  inci = InciScore::Computer.new(src: 'aqua, dimethicone').call
60
60
  inci.score # 56.25
61
+ inci.precision # 100.0
61
62
  ```
62
63
 
63
64
  As you see the results are wrapped by an *InciScore::Response* object, this is useful when dealing with the CLI and HTTP interfaces (read below).
64
65
 
65
66
  #### Unrecognized components
66
- The API treats unrecognized components as a common case by just marking the object as non valid and raise a warning in case more than 30% of the ingredients are not found.
67
+ The API treats unrecognized components as a common case by just marking the object as non valid.
67
68
  In such case the score is computed anyway by considering only recognized components.
68
- Is still possible to query the object for its state:
69
+ You can check the `precision` value, which is zero for unrecognized components, and changes based on the applied recognizer rule (100% when exact matching).
69
70
 
70
71
  ```ruby
71
72
  inci = InciScore::Computer.new(src: 'ingredients:aqua,noent1,noent2')
72
73
  inci.valid? # false
74
+ inci.score # 100.0
75
+ inci.precision # 33.33
73
76
  inci.unrecognized # ["noent1", "noent2"]
74
77
  ```
75
78
 
@@ -82,7 +85,7 @@ inci_score --src="ingredients: aqua, dimethicone, pej-10, noent"
82
85
  TOTAL SCORE:
83
86
  53.22
84
87
  PRECISION:
85
- 75.0
88
+ 71.54
86
89
  COMPONENTS:
87
90
  aqua (0), dimethicone (4), peg-10 (3)
88
91
  UNRECOGNIZED:
data/config/catalog.yml CHANGED
@@ -2818,7 +2818,7 @@ pantothenic acid polypeptide: 0
2818
2818
  papaver orientale: 0
2819
2819
  papaver rhoeas: 0
2820
2820
  paraffin: 3
2821
- paraffinum liquidum: 3
2821
+ paraffinum liquidum (mineral oil): 3
2822
2822
  parietaria officinalis: 0
2823
2823
  passiflora incarnata: 0
2824
2824
  passiflora quadrangularis: 0
@@ -15,7 +15,7 @@ module InciScore
15
15
 
16
16
  def call
17
17
  parser.parse!(args)
18
- return io.puts(%q{Specify inci list as: --src='aqua, parfum, etc'}) unless src
18
+ return io.puts(%q{Specify INCI list as: --src='aqua, parfum, etc'}) unless src
19
19
  computer = Computer.new(src: src)
20
20
  io.puts computer.call
21
21
  end
@@ -5,10 +5,11 @@ module InciScore
5
5
  TOLERANCE = 30.0
6
6
  DECIMALS = 2
7
7
 
8
- attr_reader :src, :rules, :ingredients, :components, :unrecognized
8
+ attr_reader :src, :rules, :ingredients, :components, :unrecognized, :precisions
9
9
 
10
10
  def initialize(src:, rules: Normalizer::DEFAULT_RULES)
11
11
  @unrecognized = []
12
+ @precisions = []
12
13
  @src = src
13
14
  @rules = rules
14
15
  @ingredients = Normalizer.new(src: src, rules: rules).call
@@ -28,7 +29,7 @@ module InciScore
28
29
  end
29
30
 
30
31
  def precision
31
- (100 - ((unrecognized.size / Float(ingredients.size)) * 100)).round(DECIMALS)
32
+ (precisions.sum / ingredients.size).round(DECIMALS)
32
33
  end
33
34
 
34
35
  def valid?
@@ -39,7 +40,9 @@ module InciScore
39
40
 
40
41
  def fetch_components
41
42
  ingredients.map do |ingredient|
42
- Recognizer.new(ingredient).call.tap do |component|
43
+ recognizer = Recognizer.new(ingredient)
44
+ recognizer.call.tap do |component|
45
+ precisions << recognizer.precision
43
46
  unrecognized << ingredient unless component
44
47
  end
45
48
  end.compact
@@ -3,19 +3,31 @@
3
3
  module InciScore
4
4
  class Recognizer
5
5
  DEFAULT_RULES = [Rules::Key, Rules::Levenshtein, Rules::Hazard, Rules::Prefix, Rules::Tokens].freeze
6
+ PRECISION_BASE = 4
6
7
 
7
8
  attr_reader :ingredient, :rules, :applied
9
+ attr_accessor :found
8
10
 
9
11
  def initialize(ingredient, rules = DEFAULT_RULES)
10
12
  @ingredient = Ingredient.new(ingredient)
11
13
  @rules = rules
12
14
  @applied = []
13
- freeze
15
+ @found = false
14
16
  end
15
17
 
16
18
  def call
17
19
  return if ingredient.to_s.empty?
18
- find_component
20
+ find_component.tap do |c|
21
+ self.found = true if c
22
+ end
23
+ end
24
+
25
+ def precision
26
+ return 0.0 unless found
27
+ rule = applied.last
28
+ index = rules.index(rule) + PRECISION_BASE
29
+ ratio = Math.log(index, PRECISION_BASE)
30
+ (100 / ratio).round(2)
19
31
  end
20
32
 
21
33
  private
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module InciScore
4
- VERSION = '4.6.0'
4
+ VERSION = '4.6.2'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inci_score
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.6.0
4
+ version: 4.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - costajob
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-05 00:00:00.000000000 Z
11
+ date: 2023-01-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oj