eulim 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +11 -12
- data/lib/eulim/chemistry/compound.rb +31 -43
- data/lib/eulim/chemistry/element.rb +49 -37
- data/lib/eulim/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9ae4a069d424238d03ee05cdf5261aecc11c4c64
|
4
|
+
data.tar.gz: 5ec6e25efaab183bd4d7cb2a9622d6f691b9004c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 09d19cc17e2be7ab42ae9e29924f241dc286caae6496bc7b09a71db65a7ba8d05915677f60603c6bbfab5b9822363ef23a80cdf0e43dfba2038ecfe896d4d843
|
7
|
+
data.tar.gz: 7c655642b401042d157b99e4a6ea904eada04f2469bfd7a236f4642ff405bbeb37b7f29e2253719825013d93f66d7215674e2a3a4ebabd7ebb36e0186ff83f38
|
data/README.md
CHANGED
@@ -32,28 +32,27 @@ Or install it yourself as:
|
|
32
32
|
#### Element
|
33
33
|
|
34
34
|
* H, He, Li, Be, B, C, N, O, F, Ne, Na, Mg, Al, Si, P, S, Cl, Ar, K , Ca, Sc, Ti, V, Cr, Mn, Fe, Co, Ni
|
35
|
-
* symbol, name, atomic_number, atomic_mass
|
35
|
+
* attributes: symbol, name, atomic_number, atomic_mass
|
36
|
+
* methods: get_by_* (* can be any of the attributes)
|
36
37
|
|
37
38
|
#### Compound
|
38
39
|
|
39
|
-
* molecular_mass
|
40
|
+
* attributes: formula, molecular_mass, constituents
|
41
|
+
* methods: new(compound formula)
|
40
42
|
|
41
43
|
## Usage
|
42
44
|
|
43
|
-
$ Eulim::Chemistry::Element.get_by_symbol
|
44
|
-
=> #<Eulim::Chemistry::Element: @symbol="H", @name="Hydrogen", @atomic_number=1, @atomic_mass=1.
|
45
|
+
$ Eulim::Chemistry::Element.get_by_symbol "H"
|
46
|
+
=> #<Eulim::Chemistry::Element: @symbol="H", @name="Hydrogen", @atomic_number=1, @atomic_mass=1.0079>
|
45
47
|
|
46
|
-
$ Eulim::Chemistry::Element.get_by_atomic_number
|
48
|
+
$ Eulim::Chemistry::Element.get_by_atomic_number 12
|
47
49
|
=> #<Eulim::Chemistry::Element: @symbol="Mg", @name="Magnesium", @atomic_number=12, @atomic_mass=24.305>
|
48
50
|
|
49
|
-
$ Eulim::Chemistry::
|
50
|
-
=> #<Eulim::Chemistry::
|
51
|
-
|
52
|
-
$ Eulim::Chemistry::Compound.new("CaCO3").elements
|
53
|
-
=> [#<Eulim::Chemistry::Element: @symbol="Ca", @name="Calcium", @atomic_number=20, @atomic_mass=40.078>, #<Eulim::Chemistry::Element: @symbol="C", @name="Carbon", @atomic_number=6, @atomic_mass=12.0107>, #<Eulim::Chemistry::Element: @symbol="O", @name="Oxygen", @atomic_number=8, @atomic_mass=15.9996>]
|
51
|
+
$ Eulim::Chemistry::Element.get_by_name "helium" # or "Helium"
|
52
|
+
=> #<Eulim::Chemistry::Element: @symbol="He", @name="Helium", @atomic_number=2, @atomic_mass=4.002602>
|
54
53
|
|
55
|
-
$ Eulim::Chemistry::Compound.new("
|
56
|
-
=>
|
54
|
+
$ Eulim::Chemistry::Compound.new("CaCO3")
|
55
|
+
=> #<Eulim::Chemistry::Compound: @formula="CaCO3", @constituents=[{:element=>#<Eulim::Chemistry::Element: @symbol="Ca", @name="Calcium", @atomic_number=20, @atomic_mass=40.078>, :atom_count=>1}, {:element=>#<Eulim::Chemistry::Element: @symbol="C", @name="Carbon", @atomic_number=6, @atomic_mass=12.0107>, :atom_count=>1}, {:element=>#<Eulim::Chemistry::Element: @symbol="O", @name="Oxygen", @atomic_number=8, @atomic_mass=15.9996>, :atom_count=>3}], @molecular_mass=100.0875>
|
57
56
|
|
58
57
|
## Development
|
59
58
|
|
@@ -2,63 +2,51 @@ module Eulim::Chemistry
|
|
2
2
|
class Compound
|
3
3
|
|
4
4
|
VALID_COMPOUND_REGEXP = /[A-Z][a-z]{0,2}\d*|\((?:[^()]*(?:\(.*\))?[^()]*)+\)\d*/
|
5
|
-
VAILD_ELEMENT_REGEXP = /[A-Z][a-z]{0,2}\d*/
|
6
5
|
|
6
|
+
attr_accessor :molecular_mass, :constituents, :formula
|
7
|
+
|
7
8
|
def initialize(arg)
|
8
9
|
@formula = arg
|
10
|
+
@constituents = get_constituents
|
11
|
+
@molecular_mass = get_molecular_mass
|
9
12
|
end
|
10
13
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
private
|
15
|
+
def get_molecular_mass
|
16
|
+
mass = 0
|
17
|
+
@constituents.each do |constituent|
|
18
|
+
mass += constituent[:element].atomic_mass * constituent[:atom_count]
|
19
|
+
end
|
20
|
+
mass
|
16
21
|
end
|
17
|
-
mass
|
18
|
-
end
|
19
22
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
23
|
+
def get_constituents
|
24
|
+
constituents = []
|
25
|
+
get_constituent_atoms.each do |symbol, count|
|
26
|
+
constituents << {element: Element.get_by_symbol(symbol), atom_count: count}
|
27
|
+
end
|
28
|
+
constituents
|
25
29
|
end
|
26
|
-
elements
|
27
|
-
end
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
elements = elements_n_groups.last.scan VAILD_ELEMENT_REGEXP
|
36
|
-
if elements.first === elements_n_groups.last
|
37
|
-
element_multipler = elements.first.match(/\d*$/).to_a.first.to_i
|
38
|
-
element_multipler = element_multipler > 0 ? element_multipler : 1
|
39
|
-
element_symbol = elements.first.match(/[A-Z][a-z]{0,2}/).to_a.first
|
40
|
-
if result[element_symbol]
|
41
|
-
result[element_symbol] += (element_multipler * group_multiplier)
|
42
|
-
else
|
43
|
-
result[element_symbol] = (element_multipler * group_multiplier)
|
44
|
-
end
|
31
|
+
def get_constituent_atoms formula=@formula, result={}
|
32
|
+
constituents = formula.scan VALID_COMPOUND_REGEXP
|
33
|
+
constituents.each do |constituent|
|
34
|
+
multipler = get_multipler constituent
|
35
|
+
if constituent[0] != '(' && multipler == 0
|
36
|
+
result[constituent] = result[constituent] ? result[constituent] + 1 : 1
|
45
37
|
else
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
group = groups.pop
|
53
|
-
grml = get_group_multiplier(group)
|
54
|
-
get_element_atom_count group[1..-(grml.to_s.length+1)], grml*group_multiplier, result, groups
|
38
|
+
(multipler == 0 ? 1 : multipler).times do
|
39
|
+
sub_constituents = constituent.match(/^\(?(.*?)\)?($|\d*$)/).to_a
|
40
|
+
idx = constituent == sub_constituents.first ? 1 : 0
|
41
|
+
get_constituent_atoms sub_constituents[idx], result
|
42
|
+
end
|
43
|
+
end
|
55
44
|
end
|
56
45
|
result
|
57
46
|
end
|
58
47
|
|
59
|
-
def
|
60
|
-
|
61
|
-
group_multiplier > 0 ? group_multiplier : 1
|
48
|
+
def get_multipler constituent
|
49
|
+
multipler = constituent.match(/\d*$/).to_a.first.to_i
|
62
50
|
end
|
63
51
|
|
64
52
|
end
|
@@ -4,60 +4,72 @@ module Eulim::Chemistry
|
|
4
4
|
VALID_SYMBOL_REGEXP = /[A-Z][a-z]{0,2}/
|
5
5
|
VALID_NAME_REGEXP = /[A-Z][a-z]+/
|
6
6
|
|
7
|
-
attr_accessor :atomic_mass
|
7
|
+
attr_accessor :atomic_mass, :symbol, :name, :atomic_number
|
8
8
|
|
9
|
+
@@attributes = ['symbol', 'name', 'atomic_number', 'atomic_mass']
|
9
10
|
@@elements = [
|
10
|
-
{ symbol:'H',
|
11
|
-
{ symbol:'He', name: 'Helium', atomic_number: 2,
|
12
|
-
{ symbol:'Li', name: 'Lithium', atomic_number: 3,
|
13
|
-
{ symbol:'Be', name: 'Beryllium',
|
14
|
-
{ symbol:'B',
|
15
|
-
{ symbol:'C',
|
16
|
-
{ symbol:'N',
|
17
|
-
{ symbol:'O',
|
18
|
-
{ symbol:'F',
|
19
|
-
{ symbol:'Ne', name: 'Neon',
|
11
|
+
{ symbol:'H', name: 'Hydrogen', atomic_number: 1, atomic_mass: 1.0079 },
|
12
|
+
{ symbol:'He', name: 'Helium', atomic_number: 2, atomic_mass: 4.002602 },
|
13
|
+
{ symbol:'Li', name: 'Lithium', atomic_number: 3, atomic_mass: 6.941 },
|
14
|
+
{ symbol:'Be', name: 'Beryllium', atomic_number: 4, atomic_mass: 9.012182 },
|
15
|
+
{ symbol:'B', name: 'Boron', atomic_number: 5, atomic_mass: 10.811 },
|
16
|
+
{ symbol:'C', name: 'Carbon', atomic_number: 6, atomic_mass: 12.0107 },
|
17
|
+
{ symbol:'N', name: 'Nitrogen', atomic_number: 7, atomic_mass: 14.0067 },
|
18
|
+
{ symbol:'O', name: 'Oxygen', atomic_number: 8, atomic_mass: 15.9996 },
|
19
|
+
{ symbol:'F', name: 'Fluorine', atomic_number: 9, atomic_mass: 18.9984 },
|
20
|
+
{ symbol:'Ne', name: 'Neon', atomic_number: 10, atomic_mass: 20.1797 },
|
20
21
|
{ symbol:'Na', name: 'Sodium', atomic_number: 11, atomic_mass: 22.9897 },
|
21
|
-
{ symbol:'Mg', name: 'Magnesium',
|
22
|
-
{ symbol:'Al', name: 'Aluminium',
|
22
|
+
{ symbol:'Mg', name: 'Magnesium', atomic_number: 12, atomic_mass: 24.305 },
|
23
|
+
{ symbol:'Al', name: 'Aluminium', atomic_number: 13, atomic_mass: 26.9815 },
|
23
24
|
{ symbol:'Si', name: 'Silicon', atomic_number: 14, atomic_mass: 28.0855 },
|
24
|
-
{ symbol:'P',
|
25
|
-
{ symbol:'S',
|
25
|
+
{ symbol:'P', name: 'Phosphorus', atomic_number: 15, atomic_mass: 30.9738 },
|
26
|
+
{ symbol:'S', name: 'Sulfur', atomic_number: 16, atomic_mass: 32.065 },
|
26
27
|
{ symbol:'Cl', name: 'Chlorine', atomic_number: 17, atomic_mass: 35.453 },
|
27
28
|
{ symbol:'Ar', name: 'Argon', atomic_number: 18, atomic_mass: 39.948 },
|
28
|
-
{ symbol:'K',
|
29
|
+
{ symbol:'K', name: 'Potassium', atomic_number: 19, atomic_mass: 39.0983 },
|
29
30
|
{ symbol:'Ca', name: 'Calcium', atomic_number: 20, atomic_mass: 40.078 },
|
30
31
|
{ symbol:'Sc', name: 'Scandium', atomic_number: 21, atomic_mass: 44.9559 },
|
31
32
|
{ symbol:'Ti', name: 'Titanium', atomic_number: 22, atomic_mass: 47.867 },
|
32
|
-
{ symbol:'V',
|
33
|
+
{ symbol:'V', name: 'Vanadium', atomic_number: 23, atomic_mass: 50.9415 },
|
33
34
|
{ symbol:'Cr', name: 'Chromium', atomic_number: 24, atomic_mass: 51.9961 },
|
34
|
-
{ symbol:'Mn', name: 'Manganese',
|
35
|
-
{ symbol:'Fe', name: 'Iron',
|
35
|
+
{ symbol:'Mn', name: 'Manganese', atomic_number: 25, atomic_mass: 54.938 },
|
36
|
+
{ symbol:'Fe', name: 'Iron', atomic_number: 26, atomic_mass: 55.845 },
|
36
37
|
{ symbol:'Co', name: 'Cobalt', atomic_number: 27, atomic_mass: 58.9332 },
|
37
38
|
{ symbol:'Ni', name: 'Nickel', atomic_number: 28, atomic_mass: 58.6934 }
|
38
39
|
]
|
39
40
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
41
|
+
private
|
42
|
+
def self.method_missing m, *args
|
43
|
+
if m.to_s.start_with?("get_by_")
|
44
|
+
attribute = m.to_s.split("get_by_").last
|
45
|
+
if @@attributes.include? attribute
|
46
|
+
args[0] = attribute == 'name' ? args[0].capitalize : args[0]
|
47
|
+
element_data = self.all.select { |element| element[attribute.to_sym] === args[0]}.first
|
48
|
+
if element_data
|
49
|
+
new(element_data)
|
50
|
+
else
|
51
|
+
raise "Element not found"
|
52
|
+
end
|
53
|
+
else
|
54
|
+
raise NameError, "Element class does not have that attribute or method"
|
55
|
+
end
|
56
|
+
else
|
57
|
+
super
|
44
58
|
end
|
45
|
-
else
|
46
|
-
nil
|
47
59
|
end
|
48
|
-
end
|
49
60
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
def self.get_by_symbol(symbol)
|
55
|
-
new(self.all.select { |element| element[:symbol] === symbol }.first)
|
56
|
-
end
|
57
|
-
|
58
|
-
def self.get_by_atomic_number(z)
|
59
|
-
new(self.all.select { |element| element[:atomic_number] === z }.first)
|
60
|
-
end
|
61
|
+
def self.all
|
62
|
+
@@elements
|
63
|
+
end
|
61
64
|
|
65
|
+
def initialize args
|
66
|
+
if args
|
67
|
+
args.each do |k,v|
|
68
|
+
instance_variable_set("@#{k}", v) unless v.nil?
|
69
|
+
end
|
70
|
+
else
|
71
|
+
nil
|
72
|
+
end
|
73
|
+
end
|
62
74
|
end
|
63
75
|
end
|
data/lib/eulim/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eulim
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Syed Fazil Basheer
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-05-
|
11
|
+
date: 2017-05-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|