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 +4 -4
- data/README.md +6 -3
- data/config/catalog.yml +1 -1
- data/lib/inci_score/cli.rb +1 -1
- data/lib/inci_score/computer.rb +6 -3
- data/lib/inci_score/recognizer.rb +14 -2
- data/lib/inci_score/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 948a01654e32fadaaa2cce158a59e84fc3f904a403d89fabfe18b3529600d0a8
|
4
|
+
data.tar.gz: 664c64f7dfb9003fcd1fa795d39c59157f1742d1e42653e504e9be2be47c196e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
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
|
-
|
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
|
-
|
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
|
data/lib/inci_score/cli.rb
CHANGED
@@ -15,7 +15,7 @@ module InciScore
|
|
15
15
|
|
16
16
|
def call
|
17
17
|
parser.parse!(args)
|
18
|
-
return io.puts(%q{Specify
|
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
|
data/lib/inci_score/computer.rb
CHANGED
@@ -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
|
-
(
|
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)
|
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
|
-
|
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
|
data/lib/inci_score/version.rb
CHANGED
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.
|
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-
|
11
|
+
date: 2023-01-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oj
|