rubychem 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rubychem (1.0.0)
4
+ rubychem (1.0.2)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
data/README.markdown CHANGED
@@ -1,13 +1,25 @@
1
- # RubyChem is a Rails Plugin that allows you to calculate molecular mass from the chemical formula. The script iterates through the chemical formula and breaks the formula down into species. Then calculates molar mass.
1
+ # RubyChem - scripting chemistry intelligence
2
2
 
3
3
  Example:
4
4
 
5
5
  * H2SO4 -> ["H2", "S", "O4"]
6
6
  * -> 97.99
7
7
 
8
- ***************************************************************************
8
+ ************************************************************************
9
9
 
10
10
  # Installation
11
11
 
12
12
  * gem install rubychem
13
13
 
14
+
15
+ # Use
16
+
17
+ * x = RubyChem::Valence.new(1).calc_valence
18
+ * => {"1s"=>1}
19
+
20
+ * x = RubyChem::Chemical.new("H2O")
21
+ * => #<RubyChem::Chemical:0x00000101059540 @chem_species=[["H", "2"], ["O", "1"]], @mm=18.01, @moles=.0.010205122971731808>
22
+ * x = RubyChem::Chemical.new("H2O").chem_species
23
+ * => [["H", "2"], ["O", "1"]]
24
+ * x = RubyChem::Chemical.new("H2O",1).moles
25
+ * => 0.010205122971731808
@@ -2,7 +2,7 @@ Given /^I am not yet using the program$/ do
2
2
  end
3
3
 
4
4
  When /^I start the program$/ do
5
- chemical = Mass::Compound.new(output)
5
+ chemical = RubyChem::Chemical.new(output)
6
6
  chemical.start('H2O')
7
7
  end
8
8
 
@@ -1,2 +1,2 @@
1
1
  $LOAD_PATH << File.expand_path('../../../lib', __FILE__)
2
- require 'ruby_chem'
2
+ require 'rubychem'
@@ -0,0 +1,42 @@
1
+ module RubyChem
2
+ class Lewis
3
+ attr_accessor :structure
4
+ Valence = {"O" => 6, "C" => 4}
5
+ Species = [["C"], ["O", "2"]]
6
+
7
+ def initialize
8
+ @species = Species
9
+ determine_configuration
10
+ end
11
+
12
+ private
13
+
14
+ def determine_configuration
15
+ @valence_electrons_available = valence_electrons_available(@species)
16
+ @valence_electrons_needed = valence_electrons_needed_to_complete_shell(@species) * 8
17
+ @shared_electrons = @valence_electrons_needed - @valence_electrons_available
18
+ end
19
+
20
+ def valence_electrons_available(species)
21
+ electrons = []
22
+ species.each do |x|
23
+ if x.count > 1
24
+ x.count.times do
25
+ electrons << Valence[x.first]
26
+ end
27
+ else
28
+ electrons << Valence[x.first]
29
+ end
30
+ end
31
+ electrons.inject{|sum,x| sum + x }
32
+ end
33
+
34
+ def valence_electrons_needed_to_complete_shell(species)
35
+ array = []
36
+ species.each{|x|array << x.count}
37
+ array.inject{|sum,x| sum + x}
38
+ end
39
+
40
+
41
+ end
42
+ end
@@ -1,44 +1,44 @@
1
1
  module RubyChem
2
2
  class Chemical
3
3
 
4
- MASSES = { :H => 1.01, :He => 4.00, :Li => 6.94, :Be => 9.01, :B => 10.81, :C => 12.01, :N => 14.01, :F => 19.00, :Ne => 20.18, :S => 32.01, :O => 15.99,
5
- :Na => 22.99, :Mg => 24.31, :Al => 26.98, :Si => 28.09, :P => 30.97, :Cl => 35.45, :Ar => 39.95, :K => 39.1, :Ca => 40.08, :Sc => 44.96, :Ti => 47.88, :V => 50.94,
6
- :Cr => 52.00, :Mn => 54.94, :Fe => 55.85, :Co => 58.93, :Ni => 58.69, :Cu => 63.55, :Zn => 65.39, :Ga => 69.72, :Ge=> 72.61, :As => 74.92, :Se => 78.96,
7
- :Br => 79.90, :Kr => 83.80, :Rb => 85.47, :Sr => 87.62, :Y => 88.91, :Zr => 91.22, :Nb => 92.91, :Mo => 95.94, :Te => 98, :Ru => 101.07, :Rh => 102.91,
8
- :Pd => 106.42, :Ag => 107.87, :Cd => 112.41, :In => 114.82, :Sn => 118.71, :Sb => 121.76, :Te => 127.6, :I => 126.9, :Xe => 131.29, :Cs => 132.9, :Ba => 137.3,
9
- :La => 138.9, :Hf => 178.5, :Ta => 180.9, :W => 183.9, :Re => 186.2, :Os => 190.2, :Ir => 192.2, :Pt => 195.1, :Au => 197.0, :Hg => 200.6, :Ti => 204.4,
10
- :Pb => 207.2, :Bi => 209, :Po => 209, :At => 210, :Rn => 222, :Fr => 223, :Ra => 226, :Ac => 227, :Rf => 261, :Db => 262, :Sg => 263, :Bh => 264, :Hs => 265,
11
- :Mt => 268, :Ds => 271, :Rg => 272 }
12
-
13
- attr_accessor :chem_species, :mm
4
+ MASSES = { H: 1.01, He: 4.00, Li: 6.94, Be: 9.01, B: 10.81, C: 12.01, N: 14.01, F: 19.00, Ne: 20.18, S: 32.01, O: 15.99,
5
+ Na: 22.99, Mg: 24.31, Al: 26.98, Si: 28.09, P: 30.97, Cl: 35.45, Ar: 39.95, K: 39.1, Ca: 40.08, Sc: 44.96, Ti: 47.88, V: 50.94,
6
+ Cr: 52.00, Mn: 54.94, Fe: 55.85, Co: 58.93, Ni: 58.69, Cu: 63.55, Zn: 65.39, Ga: 69.72, Ge: 72.61, As: 74.92, Se: 78.96,
7
+ Br: 79.90, Kr: 83.80, Rb: 85.47, Sr: 87.62, Y: 88.91, Zr: 91.22, Nb: 92.91, Mo: 95.94, Te: 98, Ru: 101.07, Rh: 102.91,
8
+ Pd: 106.42, Ag: 107.87, Cd: 112.41, In: 114.82, Sn: 118.71, Sb: 121.76, Te: 127.6, I: 126.9, Xe: 131.29, Cs: 132.9, Ba: 137.3,
9
+ La: 138.9, Hf: 178.5, Ta: 180.9, W: 183.9, Re: 186.2, Os: 190.2, Ir: 192.2, Pt: 195.1, Au: 197.0, Hg: 200.6, Ti: 204.4,
10
+ Pb: 207.2, Bi: 209, Po: 209, At: 210, Rn: 222, Fr: 223, Ra: 226, Ac: 227, Rf: 261, Db: 262, Sg: 263, Bh: 264, Hs: 265,
11
+ Mt: 268, Ds: 271, Rg: 272 }
12
+
13
+ attr_accessor :chem_species, :mm, :moles
14
14
 
15
- def initialize(formula)
15
+ def initialize(formula,grams=1)
16
16
  if formula.scan(/\d+$/) == []
17
17
  x = formula.gsub(/$/, '1').scan(/[A-za-z]*\d+/)
18
- speciate(x)
18
+ speciate(x,grams)
19
19
  else
20
20
  x = formula.scan(/[A-za-z]*\d+/)
21
- speciate(x)
21
+ speciate(x,grams)
22
22
  end
23
23
  end
24
24
 
25
25
  private
26
26
 
27
- def speciate(x)
27
+ def speciate(x,grams=1)
28
28
  @chem_species = x.map { |chem| chem.scan(/[A-Z][^A-Z]*/) }.flatten
29
29
  @chem_species.map! {|chem| chem.scan /[A-Z]+|\d+/i }
30
30
  atom_masses = @chem_species.map { |(elem, coeff)| MASSES[elem.to_sym] * (coeff || 1).to_f }
31
31
  x = atom_masses.map { |int| int.to_f }
32
32
  @mm = x.inject(0) { |s,v| s+= v }
33
+ @moles = grams/@mm
33
34
  end
34
35
  end
35
36
 
36
37
  class BalanceChem
37
38
  attr_accessor :balanced, :lefteq, :righteq, :leftfw, :rightfw, :count
38
39
 
39
- ##
40
- # Checks if two formulas are balanced.
41
- #
40
+ # Checks if two formulas are balanced.
41
+ #
42
42
  def initialize(lefteq, righteq)
43
43
  @lefteq = lefteq
44
44
  @righteq = righteq
@@ -1,3 +1,3 @@
1
1
  module Rubychem
2
- VERSION = "1.0.2"
2
+ VERSION = "1.0.3"
3
3
  end
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubychem
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-11-15 00:00:00.000000000Z
12
+ date: 2013-02-05 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: This is an open source library of chemistry, goodies. I'm dedicating
15
15
  this code to my major professor Arthur Brecher and Graduate PI Dr. Rogers of Bowling
@@ -20,7 +20,6 @@ executables: []
20
20
  extensions: []
21
21
  extra_rdoc_files: []
22
22
  files:
23
- - .DS_Store
24
23
  - .gitignore
25
24
  - Gemfile
26
25
  - Gemfile.lock
@@ -32,15 +31,16 @@ files:
32
31
  - features/support/env.rb
33
32
  - features/user_starts_program.feature
34
33
  - features/user_submits_compound.feature
35
- - lib/.DS_Store
36
34
  - lib/benchmark.rb
37
35
  - lib/rubychem.rb
38
36
  - lib/rubychem/comments.rb
37
+ - lib/rubychem/lewis.rb
39
38
  - lib/rubychem/molecule.rb
40
39
  - lib/rubychem/valence.rb
41
40
  - lib/rubychem/version.rb
42
41
  - lib/rubychem_rspec.rb
43
42
  - rubychem-1.0.1.gem
43
+ - rubychem-1.0.2.gem
44
44
  - rubychem.gemspec
45
45
  - spec/rubychem/ruby_chem_spec.rb
46
46
  - spec/spec_helper.rb
@@ -64,7 +64,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
64
64
  version: '0'
65
65
  requirements: []
66
66
  rubyforge_project: rubychem
67
- rubygems_version: 1.8.10
67
+ rubygems_version: 1.8.15
68
68
  signing_key:
69
69
  specification_version: 3
70
70
  summary: A ruby chemistry library