eulim 0.0.4 → 0.0.5

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
  SHA1:
3
- metadata.gz: 1ea827962631e7dcd4f4d78d2e278be6d27f01a3
4
- data.tar.gz: dfdd95057622a0251ca8b1c5d40e6b350320863e
3
+ metadata.gz: 848f2bdad4e29272b0fa072940779da4fa423ef7
4
+ data.tar.gz: aa8f97a80023676fb7f984343949b033c02b2773
5
5
  SHA512:
6
- metadata.gz: e1fac3fc7398f2e20ca878ecc27c277028ce7848002ce2711d4d69bfe681fe18afe4db022b86404552cf889600e6e69e4acc6f110ddc901d682334ec414e778d
7
- data.tar.gz: e400918e1b58366a95683a4a2efcebec15829e1a4884310dbdf2d2538995621d0ec27e266bae66feab9b4910abf5eff3d06a208f4260997be99d5cbd51234ab1
6
+ metadata.gz: 55336a3b7f9db14cdddbe750e65871fb2f1c9982a82917a09f8f51f87da17875e97f21a5c89d7db8b019e5bb33c8be202f5bb31a2df950828a7296e92019b3d1
7
+ data.tar.gz: 3a127b106a946e0f3a8f16b6e11948a8f0b8006577db9bd41b90cb8490acea3f91ce28170c2ea892675dd76fce4d9156db73e8f9ec5619951eb7a7e3f6079745
data/README.md CHANGED
@@ -39,13 +39,17 @@ Or install it yourself as:
39
39
  ## Usage
40
40
 
41
41
  $ Eulim::Chemistry::Element.get_by_symbol("H")
42
- => #<Eulim::Chemistry::Element:0x0055ac58c146e8 @symbol="Mg", @name="Magnesium", @atomic_number=12, @atomic_mass=24.305>
42
+ => #<Eulim::Chemistry::Element: @symbol="H", @name="Hydrogen", @atomic_number=1, @atomic_mass=1.008>
43
43
 
44
44
  $ Eulim::Chemistry::Element.get_by_atomic_number(12)
45
- => #<Eulim::Chemistry::Element:0x0055ac58c146e8 @symbol="Mg", @name="Magnesium", @atomic_number=12, @atomic_mass=24.305>
45
+ => #<Eulim::Chemistry::Element: @symbol="Mg", @name="Magnesium", @atomic_number=12, @atomic_mass=24.305>
46
46
 
47
- $ Eulim::Chemistry::Compound.constituent_elements("CaCO3")
48
- => [#<Eulim::Chemistry::Element:0x0055c971365598 @symbol="Ca", @name="Calcium", @atomic_number=20, @atomic_mass=40.078>, #<Eulim::Chemistry::Element:0x0055c9713652c8 @symbol="C", @name="Carbon", @atomic_number=6, @atomic_mass=12.0107>, #<Eulim::Chemistry::Element:0x0055c971365048 @symbol="O", @name="Oxygen", @atomic_number=8, @atomic_mass=15.9996>]
47
+ $ Eulim::Chemistry::Compound.new("CaCO3")
48
+ => #<Eulim::Chemistry::Compound: @formula="CaCO3">
49
+
50
+ $ Eulim::Chemistry::Compound.new("CaCO3").elements
51
+ => [#<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>]
52
+
49
53
  ## Development
50
54
 
51
55
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -1,16 +1,56 @@
1
1
  module Eulim::Chemistry
2
2
  class Compound
3
+
4
+ VALID_COMPOUND_REGEXP = /[A-Z][a-z]{0,2}\d*|\((?:[^()]*(?:\(.*\))?[^()]*)+\)\d*/
5
+ VAILD_ELEMENT_REGEXP = /[A-Z][a-z]{0,2}\d*/
6
+
3
7
  def initialize(arg)
4
8
  @formula = arg
5
9
  end
6
10
 
7
- def constituent_elements
8
- elements = []
9
- @formula.split(/(?=[A-Z])/).each do |element_symbol|
10
- elements << Element.get_by_symbol(element_symbol.gsub(/(\W|\d)/, ""))
11
+ def molecular_mass
12
+ mass = 0
13
+ element_atom_count = get_element_atom_count
14
+ element_atom_count.each do |symbol, count|
15
+ mass += Element.get_by_symbol(symbol).atomic_mass * count
11
16
  end
12
- elements
17
+ mass
13
18
  end
14
-
19
+
20
+ private
21
+ def get_element_atom_count formula = @formula, group_multiplier = 1, result = {}, groups = []
22
+ formula
23
+ elements_n_groups = formula.scan VALID_COMPOUND_REGEXP
24
+ loop do
25
+ break if !elements_n_groups.last
26
+ elements = elements_n_groups.last.scan VAILD_ELEMENT_REGEXP
27
+ if elements.first === elements_n_groups.last
28
+ element_multipler = elements.first.match(/\d*$/).to_a.first.to_i
29
+ element_multipler = element_multipler > 0 ? element_multipler : 1
30
+ element_symbol = elements.first.match(/[A-Z][a-z]{0,2}/).to_a.first
31
+ if result[element_symbol]
32
+ result[element_symbol] += (element_multipler * group_multiplier)
33
+ else
34
+ result[element_symbol] = (element_multipler * group_multiplier)
35
+ end
36
+ else
37
+ groups << elements_n_groups.last
38
+ end
39
+ elements_n_groups.pop
40
+ end
41
+ loop do
42
+ break if !groups.last
43
+ group = groups.pop
44
+ grml = get_group_multiplier(group)
45
+ get_element_atom_count group[1..-(grml.to_s.length+1)], grml*group_multiplier, result, groups
46
+ end
47
+ result
48
+ end
49
+
50
+ def get_group_multiplier formula
51
+ group_multiplier = formula.scan(VALID_COMPOUND_REGEXP).first.match(/\d*$/).to_a.first.to_i
52
+ group_multiplier > 0 ? group_multiplier : 1
53
+ end
54
+
15
55
  end
16
- end
56
+ end
@@ -1,6 +1,11 @@
1
1
  module Eulim::Chemistry
2
2
  class Element
3
3
 
4
+ VALID_SYMBOL_REGEXP = /[A-Z][a-z]{0,2}/
5
+ VALID_NAME_REGEXP = /[A-Z][a-z]+/
6
+
7
+ attr_accessor :atomic_mass
8
+
4
9
  @@elements = [
5
10
  { symbol:'H', name: 'Hydrogen', atomic_number: 1, atomic_mass: 1.0079 },
6
11
  { symbol:'He', name: 'Helium', atomic_number: 2, atomic_mass: 4.002602 },
data/lib/eulim/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Eulim
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
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
4
+ version: 0.0.5
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-19 00:00:00.000000000 Z
11
+ date: 2017-05-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler