eulim 0.0.9 → 0.0.10
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/.gitignore +12 -12
- data/.rspec +2 -2
- data/.travis.yml +5 -5
- data/CODE_OF_CONDUCT.md +74 -74
- data/Gemfile +4 -4
- data/LICENSE +21 -21
- data/LICENSE.txt +21 -21
- data/README.md +71 -71
- data/Rakefile +6 -6
- data/bin/console +14 -14
- data/bin/setup +8 -8
- data/eulim.gemspec +43 -43
- data/lib/eulim.rb +8 -8
- data/lib/eulim/chemistry.rb +6 -6
- data/lib/eulim/chemistry/compound.rb +59 -59
- data/lib/eulim/chemistry/element.rb +53 -265
- data/lib/eulim/chemistry/elements.csv +110 -0
- data/lib/eulim/chemistry/reaction.rb +73 -0
- data/lib/eulim/structures.rb +6 -6
- data/lib/eulim/structures/pipe.rb +13 -13
- data/lib/eulim/structures/structure.rb +12 -12
- data/lib/eulim/version.rb +3 -3
- metadata +5 -3
data/bin/console
CHANGED
@@ -1,14 +1,14 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'bundler/setup'
|
4
|
-
require 'eulim'
|
5
|
-
|
6
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
-
# with your gem easier. You can also use a different console, if you like.
|
8
|
-
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require 'pry'
|
11
|
-
# Pry.start
|
12
|
-
|
13
|
-
require 'irb'
|
14
|
-
IRB.start(__FILE__)
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'eulim'
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require 'pry'
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require 'irb'
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
#!/usr/bin/env bash
|
2
|
-
set -euo pipefail
|
3
|
-
IFS=$'\n\t'
|
4
|
-
set -vx
|
5
|
-
|
6
|
-
bundle install
|
7
|
-
|
8
|
-
# Do any other automated setup that you need to do here
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
set -euo pipefail
|
3
|
+
IFS=$'\n\t'
|
4
|
+
set -vx
|
5
|
+
|
6
|
+
bundle install
|
7
|
+
|
8
|
+
# Do any other automated setup that you need to do here
|
data/eulim.gemspec
CHANGED
@@ -1,43 +1,43 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
lib = File.expand_path('../lib', __FILE__)
|
4
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
-
require 'eulim/version'
|
6
|
-
|
7
|
-
Gem::Specification.new do |spec|
|
8
|
-
spec.name = 'eulim'
|
9
|
-
spec.version = Eulim::VERSION
|
10
|
-
spec.authors = ['Syed Fazil Basheer']
|
11
|
-
spec.email = ['fazil.basheer@quester.xyz']
|
12
|
-
|
13
|
-
spec.summary = 'A gem for scientific data.'
|
14
|
-
spec.description = 'A gem for scientific data.'
|
15
|
-
spec.homepage = 'https://github.com/syedfazilbasheer-quester/eulim-gem'
|
16
|
-
spec.license = 'MIT'
|
17
|
-
|
18
|
-
# Prevent pushing this gem to RubyGems.org.
|
19
|
-
# To allow pushes either set the 'allowed_push_host'
|
20
|
-
# to allow pushing to a single host
|
21
|
-
# or delete this section to allow pushing to any host.
|
22
|
-
# if spec.respond_to?(:metadata)
|
23
|
-
# spec.metadata['allowed_push_host'] =
|
24
|
-
# 'https://github.com/syedfazilbasheer-quester/eulim-gem'
|
25
|
-
# else
|
26
|
-
# raise 'RubyGems 2.0 or newer is required to protect against ' \
|
27
|
-
# 'public gem pushes.'
|
28
|
-
# end
|
29
|
-
|
30
|
-
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
31
|
-
f.match(%r{^(test|spec|features)/})
|
32
|
-
end
|
33
|
-
spec.bindir = 'exe'
|
34
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
35
|
-
spec.require_paths = ['lib']
|
36
|
-
|
37
|
-
spec.add_development_dependency 'bundler', '~> 1.14'
|
38
|
-
spec.add_development_dependency 'rake', '~> 10.0'
|
39
|
-
spec.add_development_dependency 'rspec', '~> 3.0'
|
40
|
-
spec.add_development_dependency 'rubocop'
|
41
|
-
|
42
|
-
spec.add_dependency 'require_all', '~> 1.4.0'
|
43
|
-
end
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
lib = File.expand_path('../lib', __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require 'eulim/version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |spec|
|
8
|
+
spec.name = 'eulim'
|
9
|
+
spec.version = Eulim::VERSION
|
10
|
+
spec.authors = ['Syed Fazil Basheer']
|
11
|
+
spec.email = ['fazil.basheer@quester.xyz']
|
12
|
+
|
13
|
+
spec.summary = 'A gem for scientific data.'
|
14
|
+
spec.description = 'A gem for scientific data.'
|
15
|
+
spec.homepage = 'https://github.com/syedfazilbasheer-quester/eulim-gem'
|
16
|
+
spec.license = 'MIT'
|
17
|
+
|
18
|
+
# Prevent pushing this gem to RubyGems.org.
|
19
|
+
# To allow pushes either set the 'allowed_push_host'
|
20
|
+
# to allow pushing to a single host
|
21
|
+
# or delete this section to allow pushing to any host.
|
22
|
+
# if spec.respond_to?(:metadata)
|
23
|
+
# spec.metadata['allowed_push_host'] =
|
24
|
+
# 'https://github.com/syedfazilbasheer-quester/eulim-gem'
|
25
|
+
# else
|
26
|
+
# raise 'RubyGems 2.0 or newer is required to protect against ' \
|
27
|
+
# 'public gem pushes.'
|
28
|
+
# end
|
29
|
+
|
30
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
31
|
+
f.match(%r{^(test|spec|features)/})
|
32
|
+
end
|
33
|
+
spec.bindir = 'exe'
|
34
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
35
|
+
spec.require_paths = ['lib']
|
36
|
+
|
37
|
+
spec.add_development_dependency 'bundler', '~> 1.14'
|
38
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
39
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
40
|
+
spec.add_development_dependency 'rubocop'
|
41
|
+
|
42
|
+
spec.add_dependency 'require_all', '~> 1.4.0'
|
43
|
+
end
|
data/lib/eulim.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
require 'require_all'
|
2
|
-
|
3
|
-
require_all '../eulim/lib'
|
4
|
-
|
5
|
-
# Root module. Everything in the gem goes inside this
|
6
|
-
module Eulim
|
7
|
-
# Your code goes here...
|
8
|
-
end
|
1
|
+
require 'require_all'
|
2
|
+
|
3
|
+
require_all '../eulim/lib'
|
4
|
+
|
5
|
+
# Root module. Everything in the gem goes inside this
|
6
|
+
module Eulim
|
7
|
+
# Your code goes here...
|
8
|
+
end
|
data/lib/eulim/chemistry.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
module Eulim
|
2
|
-
# This module will contain all chemistry related info
|
3
|
-
# Ex: Elements, Compounds, Reactions, etc
|
4
|
-
module Chemistry
|
5
|
-
end
|
6
|
-
end
|
1
|
+
module Eulim
|
2
|
+
# This module will contain all chemistry related info
|
3
|
+
# Ex: Elements, Compounds, Reactions, etc
|
4
|
+
module Chemistry
|
5
|
+
end
|
6
|
+
end
|
@@ -1,59 +1,59 @@
|
|
1
|
-
module Eulim
|
2
|
-
module Chemistry
|
3
|
-
# This class has functionality for compounds
|
4
|
-
# Ex: constituent elements, molecular mass, etc
|
5
|
-
class Compound
|
6
|
-
COMPOUND_REGEXP =
|
7
|
-
/[A-Z][a-z]{0,2}\d*|\((?:[^()]*(?:\(.*\))?[^()]*)+\)\d*/
|
8
|
-
|
9
|
-
attr_accessor :molecular_mass, :constituents, :formula
|
10
|
-
|
11
|
-
def initialize(arg)
|
12
|
-
@formula = arg
|
13
|
-
|
14
|
-
|
15
|
-
end
|
16
|
-
|
17
|
-
private
|
18
|
-
|
19
|
-
def
|
20
|
-
|
21
|
-
@constituents.each do |
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
def
|
28
|
-
constituents =
|
29
|
-
get_const_atoms.each do |symbol, count|
|
30
|
-
constituents
|
31
|
-
element: Element.get_by_symbol(symbol),
|
32
|
-
atom_count: count
|
33
|
-
}
|
34
|
-
end
|
35
|
-
constituents
|
36
|
-
end
|
37
|
-
|
38
|
-
def get_const_atoms(formula = @formula, r = {})
|
39
|
-
formula.scan(COMPOUND_REGEXP).each do |const|
|
40
|
-
multipler = get_multipler const
|
41
|
-
if const[0] != '(' && multipler.zero?
|
42
|
-
r[const] = r[const] ? r[const] + 1 : 1
|
43
|
-
else
|
44
|
-
(multipler.zero? ? 1 : multipler).times do
|
45
|
-
sub_const = const.match(/^\(?(.*?)\)?($|\d*$)/).to_a
|
46
|
-
get_const_atoms sub_const[const == sub_const.first ? 1 : 0], r
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
r
|
51
|
-
end
|
52
|
-
|
53
|
-
def get_multipler(const)
|
54
|
-
multipler = const.match(/\d*$/).to_a.first.to_i
|
55
|
-
multipler
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
1
|
+
module Eulim
|
2
|
+
module Chemistry
|
3
|
+
# This class has functionality for compounds
|
4
|
+
# Ex: constituent elements, molecular mass, etc
|
5
|
+
class Compound
|
6
|
+
COMPOUND_REGEXP =
|
7
|
+
/[A-Z][a-z]{0,2}\d*|\((?:[^()]*(?:\(.*\))?[^()]*)+\)\d*/
|
8
|
+
|
9
|
+
attr_accessor :molecular_mass, :constituents, :formula
|
10
|
+
|
11
|
+
def initialize(arg)
|
12
|
+
@formula = arg
|
13
|
+
build_constituents
|
14
|
+
calculate_molecular_mass
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def calculate_molecular_mass
|
20
|
+
@molecular_mass = 0
|
21
|
+
@constituents.each do |_symbol, info|
|
22
|
+
@molecular_mass += info[:element].atomic_mass * info[:atom_count]
|
23
|
+
end
|
24
|
+
@molecular_mass
|
25
|
+
end
|
26
|
+
|
27
|
+
def build_constituents
|
28
|
+
@constituents = {}
|
29
|
+
get_const_atoms.each do |symbol, count|
|
30
|
+
@constituents[symbol] = {
|
31
|
+
element: Element.get_by_symbol(symbol),
|
32
|
+
atom_count: count
|
33
|
+
}
|
34
|
+
end
|
35
|
+
@constituents
|
36
|
+
end
|
37
|
+
|
38
|
+
def get_const_atoms(formula = @formula, r = {})
|
39
|
+
formula.scan(COMPOUND_REGEXP).each do |const|
|
40
|
+
multipler = get_multipler const
|
41
|
+
if const[0] != '(' && multipler.zero?
|
42
|
+
r[const] = r[const] ? r[const] + 1 : 1
|
43
|
+
else
|
44
|
+
(multipler.zero? ? 1 : multipler).times do
|
45
|
+
sub_const = const.match(/^\(?(.*?)\)?($|\d*$)/).to_a
|
46
|
+
get_const_atoms sub_const[const == sub_const.first ? 1 : 0], r
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
r
|
51
|
+
end
|
52
|
+
|
53
|
+
def get_multipler(const)
|
54
|
+
multipler = const.match(/\d*$/).to_a.first.to_i
|
55
|
+
multipler
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -1,265 +1,53 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
class
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
{ symbol: 'Cl', name: 'Chlorine',
|
55
|
-
atomic_number: 17, atomic_mass: 35.453 },
|
56
|
-
{ symbol: 'Ar', name: 'Argon',
|
57
|
-
atomic_number: 18, atomic_mass: 39.948 },
|
58
|
-
{ symbol: 'K', name: 'Potassium',
|
59
|
-
atomic_number: 19, atomic_mass: 39.0983 },
|
60
|
-
{ symbol: 'Ca', name: 'Calcium',
|
61
|
-
atomic_number: 20, atomic_mass: 40.078 },
|
62
|
-
{ symbol: 'Sc', name: 'Scandium',
|
63
|
-
atomic_number: 21, atomic_mass: 44.9559 },
|
64
|
-
{ symbol: 'Ti', name: 'Titanium',
|
65
|
-
atomic_number: 22, atomic_mass: 47.867 },
|
66
|
-
{ symbol: 'V', name: 'Vanadium',
|
67
|
-
atomic_number: 23, atomic_mass: 50.9415 },
|
68
|
-
{ symbol: 'Cr', name: 'Chromium',
|
69
|
-
atomic_number: 24, atomic_mass: 51.9961 },
|
70
|
-
{ symbol: 'Mn', name: 'Manganese',
|
71
|
-
atomic_number: 25, atomic_mass: 54.938 },
|
72
|
-
{ symbol: 'Fe', name: 'Iron',
|
73
|
-
atomic_number: 26, atomic_mass: 55.845 },
|
74
|
-
{ symbol: 'Co', name: 'Cobalt',
|
75
|
-
atomic_number: 27, atomic_mass: 58.9332 },
|
76
|
-
{ symbol: 'Ni', name: 'Nickel',
|
77
|
-
atomic_number: 28, atomic_mass: 58.6934 },
|
78
|
-
{ symbol: 'Cu', name: 'Copper',
|
79
|
-
atomic_number: 29, atomic_mass: 63.546 },
|
80
|
-
{ symbol: 'Zn', name: 'Zinc',
|
81
|
-
atomic_number: 30, atomic_mass: 65.39 },
|
82
|
-
{ symbol: 'Ga', name: 'Gallium',
|
83
|
-
atomic_number: 31, atomic_mass: 69.723 },
|
84
|
-
{ symbol: 'Ge', name: 'Germanium',
|
85
|
-
atomic_number: 32, atomic_mass: 72.64 },
|
86
|
-
{ symbol: 'As', name: 'Arsenic',
|
87
|
-
atomic_number: 33, atomic_mass: 74.9216 },
|
88
|
-
{ symbol: 'Se', name: 'Selenium',
|
89
|
-
atomic_number: 34, atomic_mass: 78.96 },
|
90
|
-
{ symbol: 'Br', name: 'Bromine',
|
91
|
-
atomic_number: 35, atomic_mass: 79.904 },
|
92
|
-
{ symbol: 'Kr', name: 'Krypton',
|
93
|
-
atomic_number: 36, atomic_mass: 83.3 },
|
94
|
-
{ symbol: 'Rb', name: 'Rubidium',
|
95
|
-
atomic_number: 37, atomic_mass: 85.4678 },
|
96
|
-
{ symbol: 'Sr', name: 'Strontium',
|
97
|
-
atomic_number: 38, atomic_mass: 87.62 },
|
98
|
-
{ symbol: 'Y', name: 'Yttrium',
|
99
|
-
atomic_number: 39, atomic_mass: 88.9059 },
|
100
|
-
{ symbol: 'Zr', name: 'Zirconium',
|
101
|
-
atomic_number: 40, atomic_mass: 91.224 },
|
102
|
-
{ symbol: 'Nb', name: 'Niobium',
|
103
|
-
atomic_number: 41, atomic_mass: 92.9064 },
|
104
|
-
{ symbol: 'Mo', name: 'Molybdenum',
|
105
|
-
atomic_number: 42, atomic_mass: 95.94 },
|
106
|
-
{ symbol: 'Tc', name: 'Technitium',
|
107
|
-
atomic_number: 43, atomic_mass: 98 },
|
108
|
-
{ symbol: 'Ru', name: 'Ruthenium',
|
109
|
-
atomic_number: 44, atomic_mass: 101.07 },
|
110
|
-
{ symbol: 'Rh', name: 'Rhodium',
|
111
|
-
atomic_number: 45, atomic_mass: 102.9055 },
|
112
|
-
{ symbol: 'Pd', name: 'Palladium',
|
113
|
-
atomic_number: 46, atomic_mass: 106.42 },
|
114
|
-
{ symbol: 'Ag', name: 'Silver',
|
115
|
-
atomic_number: 47, atomic_mass: 107.8682 },
|
116
|
-
{ symbol: 'Cd', name: 'Cadmiuim',
|
117
|
-
atomic_number: 48, atomic_mass: 112.411 },
|
118
|
-
{ symbol: 'In', name: 'Indium',
|
119
|
-
atomic_number: 49, atomic_mass: 114.818 },
|
120
|
-
{ symbol: 'Sn', name: 'Tin',
|
121
|
-
atomic_number: 50, atomic_mass: 118.71 },
|
122
|
-
{ symbol: 'Sb', name: 'Antimony',
|
123
|
-
atomic_number: 51, atomic_mass: 121.76 },
|
124
|
-
{ symbol: 'Te', name: 'Tellurium',
|
125
|
-
atomic_number: 52, atomic_mass: 127.6 },
|
126
|
-
{ symbol: 'I', name: 'Iodine',
|
127
|
-
atomic_number: 53, atomic_mass: 126.9045 },
|
128
|
-
{ symbol: 'Xe', name: 'Xenon',
|
129
|
-
atomic_number: 54, atomic_mass: 131.293 },
|
130
|
-
{ symbol: 'Cs', name: 'Cesium',
|
131
|
-
atomic_number: 55, atomic_mass: 132.9055 },
|
132
|
-
{ symbol: 'Ba', name: 'Barium',
|
133
|
-
atomic_number: 56, atomic_mass: 137.327 },
|
134
|
-
{ symbol: 'La', name: 'Lanthanum',
|
135
|
-
atomic_number: 57, atomic_mass: 138.9055 },
|
136
|
-
{ symbol: 'Ce', name: 'Cerium',
|
137
|
-
atomic_number: 58, atomic_mass: 140.116 },
|
138
|
-
{ symbol: 'Pr', name: 'Praseodymium',
|
139
|
-
atomic_number: 59, atomic_mass: 140.9077 },
|
140
|
-
{ symbol: 'Nd', name: 'Neodymium',
|
141
|
-
atomic_number: 60, atomic_mass: 144.24 },
|
142
|
-
{ symbol: 'Pm', name: 'Promethium',
|
143
|
-
atomic_number: 61, atomic_mass: 145 },
|
144
|
-
{ symbol: 'Sm', name: 'Samarium',
|
145
|
-
atomic_number: 62, atomic_mass: 150.36 },
|
146
|
-
{ symbol: 'Eu', name: 'Europium',
|
147
|
-
atomic_number: 63, atomic_mass: 151.964 },
|
148
|
-
{ symbol: 'Gd', name: 'Gadolium',
|
149
|
-
atomic_number: 64, atomic_mass: 157.25 },
|
150
|
-
{ symbol: 'Tb', name: 'Terbium',
|
151
|
-
atomic_number: 65, atomic_mass: 158.9253 },
|
152
|
-
{ symbol: 'Dy', name: 'Dysprosium',
|
153
|
-
atomic_number: 66, atomic_mass: 162.5 },
|
154
|
-
{ symbol: 'Ho', name: 'Holmium',
|
155
|
-
atomic_number: 67, atomic_mass: 164.9303 },
|
156
|
-
{ symbol: 'Er', name: 'Erbium',
|
157
|
-
atomic_number: 68, atomic_mass: 167.259 },
|
158
|
-
{ symbol: 'Tm', name: 'Thulium',
|
159
|
-
atomic_number: 69, atomic_mass: 168.9342 },
|
160
|
-
{ symbol: 'Yb', name: 'Ytterbium',
|
161
|
-
atomic_number: 70, atomic_mass: 173.04 },
|
162
|
-
{ symbol: 'Lu', name: 'Lutetium',
|
163
|
-
atomic_number: 71, atomic_mass: 174.967 },
|
164
|
-
{ symbol: 'Hf', name: 'Hafnium',
|
165
|
-
atomic_number: 72, atomic_mass: 178.49 },
|
166
|
-
{ symbol: 'Ta', name: 'Tantalum',
|
167
|
-
atomic_number: 73, atomic_mass: 180.9479 },
|
168
|
-
{ symbol: 'W', name: 'Tungsten',
|
169
|
-
atomic_number: 74, atomic_mass: 183.84 },
|
170
|
-
{ symbol: 'Re', name: 'Rhenium',
|
171
|
-
atomic_number: 75, atomic_mass: 186.207 },
|
172
|
-
{ symbol: 'Os', name: 'Osmium',
|
173
|
-
atomic_number: 76, atomic_mass: 190.23 },
|
174
|
-
{ symbol: 'Ir', name: 'Iridium',
|
175
|
-
atomic_number: 77, atomic_mass: 192.217 },
|
176
|
-
{ symbol: 'Pt', name: 'Platinum',
|
177
|
-
atomic_number: 78, atomic_mass: 195.078 },
|
178
|
-
{ symbol: 'Au', name: 'Gold',
|
179
|
-
atomic_number: 79, atomic_mass: 196.9665 },
|
180
|
-
{ symbol: 'Hg', name: 'Mercury',
|
181
|
-
atomic_number: 80, atomic_mass: 200.59 },
|
182
|
-
{ symbol: 'Tl', name: 'Thallium',
|
183
|
-
atomic_number: 81, atomic_mass: 204.3833 },
|
184
|
-
{ symbol: 'Pb', name: 'Lead',
|
185
|
-
atomic_number: 82, atomic_mass: 207.2 },
|
186
|
-
{ symbol: 'Bi', name: 'Bismuth',
|
187
|
-
atomic_number: 83, atomic_mass: 208.9804 },
|
188
|
-
{ symbol: 'Po', name: 'Polonium',
|
189
|
-
atomic_number: 84, atomic_mass: 209 },
|
190
|
-
{ symbol: 'At', name: 'Astatine',
|
191
|
-
atomic_number: 85, atomic_mass: 210 },
|
192
|
-
{ symbol: 'Rn', name: 'Radon',
|
193
|
-
atomic_number: 86, atomic_mass: 222 },
|
194
|
-
{ symbol: 'Fr', name: 'Francium',
|
195
|
-
atomic_number: 87, atomic_mass: 223 },
|
196
|
-
{ symbol: 'Ra', name: 'Radium',
|
197
|
-
atomic_number: 88, atomic_mass: 226 },
|
198
|
-
{ symbol: 'Ac', name: 'Actinium',
|
199
|
-
atomic_number: 89, atomic_mass: 227 },
|
200
|
-
{ symbol: 'Th', name: 'Thorium',
|
201
|
-
atomic_number: 90, atomic_mass: 232.0381 },
|
202
|
-
{ symbol: 'Pa', name: 'Protactinium',
|
203
|
-
atomic_number: 91, atomic_mass: 231.0359 },
|
204
|
-
{ symbol: 'U', name: 'Uranium',
|
205
|
-
atomic_number: 92, atomic_mass: 238.0289 },
|
206
|
-
{ symbol: 'Np', name: 'Neptunum',
|
207
|
-
atomic_number: 93, atomic_mass: 237 },
|
208
|
-
{ symbol: 'Pu', name: 'Plutonium',
|
209
|
-
atomic_number: 94, atomic_mass: 244 },
|
210
|
-
{ symbol: 'Am', name: 'Americium',
|
211
|
-
atomic_number: 95, atomic_mass: 243 },
|
212
|
-
{ symbol: 'Cm', name: 'Curium',
|
213
|
-
atomic_number: 96, atomic_mass: 247 },
|
214
|
-
{ symbol: 'Bk', name: 'Berkilium',
|
215
|
-
atomic_number: 97, atomic_mass: 247 },
|
216
|
-
{ symbol: 'Cf', name: 'Californium',
|
217
|
-
atomic_number: 98, atomic_mass: 251 },
|
218
|
-
{ symbol: 'Es', name: 'Einsteinium',
|
219
|
-
atomic_number: 99, atomic_mass: 252 },
|
220
|
-
{ symbol: 'Fm', name: 'Fermium',
|
221
|
-
atomic_number: 100, atomic_mass: 257 },
|
222
|
-
{ symbol: 'Md', name: 'Mendelevium',
|
223
|
-
atomic_number: 101, atomic_mass: 258 },
|
224
|
-
{ symbol: 'No', name: 'Nobelium',
|
225
|
-
atomic_number: 102, atomic_mass: 259 },
|
226
|
-
{ symbol: 'Lr', name: 'Lawrencium',
|
227
|
-
atomic_number: 103, atomic_mass: 262 },
|
228
|
-
{ symbol: 'Rf', name: 'Rutherfordium',
|
229
|
-
atomic_number: 104, atomic_mass: 261 },
|
230
|
-
{ symbol: 'Db', name: 'Dubnium',
|
231
|
-
atomic_number: 105, atomic_mass: 262 },
|
232
|
-
{ symbol: 'Sg', name: 'Seaborgium',
|
233
|
-
atomic_number: 106, atomic_mass: 266 },
|
234
|
-
{ symbol: 'Bh', name: 'Bohrium',
|
235
|
-
atomic_number: 107, atomic_mass: 264 },
|
236
|
-
{ symbol: 'Hs', name: 'Hassium',
|
237
|
-
atomic_number: 108, atomic_mass: 277 },
|
238
|
-
{ symbol: 'Mt', name: 'Meitnerium',
|
239
|
-
atomic_number: 109, atomic_mass: 268 }
|
240
|
-
]
|
241
|
-
|
242
|
-
private_class_method def self.method_missing(m, *args)
|
243
|
-
attribute = m.to_s.split('get_by_').last
|
244
|
-
valid_method? m, attribute
|
245
|
-
args[0] = attribute == 'name' ? args[0].capitalize : args[0]
|
246
|
-
element_data = get_element_by_attribute attribute, args[0]
|
247
|
-
raise 'Element not found' unless element_data
|
248
|
-
new(element_data)
|
249
|
-
end
|
250
|
-
|
251
|
-
private_class_method def self.get_element_by_attribute(attribute, value)
|
252
|
-
@@elements.select do |element|
|
253
|
-
element[attribute.to_sym] == value
|
254
|
-
end.first
|
255
|
-
end
|
256
|
-
|
257
|
-
private_class_method def self.valid_method?(m, attribute)
|
258
|
-
super unless m.to_s.start_with?('get_by_')
|
259
|
-
raise(NameError, 'Invalid attribute') unless @@attrs.include? attribute
|
260
|
-
end
|
261
|
-
|
262
|
-
private_class_method :new
|
263
|
-
end
|
264
|
-
end
|
265
|
-
end
|
1
|
+
require 'csv'
|
2
|
+
|
3
|
+
module Eulim
|
4
|
+
module Chemistry
|
5
|
+
# This class has functionality for elements
|
6
|
+
# Ex: symbol, atomic mass, atomic number
|
7
|
+
class Element
|
8
|
+
attr_accessor :atomic_mass, :symbol, :name, :atomic_number
|
9
|
+
|
10
|
+
ATTRS = %w[symbol name atomic_number atomic_mass].freeze
|
11
|
+
# Data taken from 'www.science.co.il/elements/'
|
12
|
+
ELEMENTS = []
|
13
|
+
|
14
|
+
def initialize(arg)
|
15
|
+
@name = arg[1]
|
16
|
+
@symbol = arg[0]
|
17
|
+
@atomic_number = arg[2].to_i
|
18
|
+
@atomic_mass = arg[3].to_f
|
19
|
+
end
|
20
|
+
|
21
|
+
# elements of the csv have no spaces
|
22
|
+
CSV.foreach(File.join(File.dirname(__FILE__), 'elements.csv'), headers: true) do |row|
|
23
|
+
ELEMENTS << new(row)
|
24
|
+
end
|
25
|
+
|
26
|
+
private_class_method def self.method_missing(m, *args)
|
27
|
+
attribute = m.to_s.split('get_by_').last
|
28
|
+
valid_method? m, attribute
|
29
|
+
raise 'please give argument' if args.empty?
|
30
|
+
args[0] = attribute == 'name' ? args[0].capitalize : args[0]
|
31
|
+
element_data = get_element_by_attribute attribute, args[0]
|
32
|
+
raise 'Element not found' unless element_data
|
33
|
+
element_data
|
34
|
+
end
|
35
|
+
|
36
|
+
private_class_method def self.get_element_by_attribute(attribute, value)
|
37
|
+
ELEMENTS.each do |element|
|
38
|
+
# elements value of attribute == value give by user
|
39
|
+
return element if
|
40
|
+
element.instance_variable_get(('@' + attribute).intern) == value
|
41
|
+
end
|
42
|
+
raise(NameError, 'element not found')
|
43
|
+
end
|
44
|
+
|
45
|
+
private_class_method def self.valid_method?(m, attribute)
|
46
|
+
super unless m.to_s.start_with?('get_by_')
|
47
|
+
raise(NameError, 'Invalid attribute') unless ATTRS.include? attribute
|
48
|
+
end
|
49
|
+
|
50
|
+
private_class_method :new
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|