eulim 0.0.4 → 0.0.5

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