inci_score 4.6.0 → 4.6.2

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: 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