rubychem 1.0.0 → 1.0.1

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 (0.0.1)
4
+ rubychem (1.0.0)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
data/README.markdown CHANGED
@@ -9,10 +9,5 @@ Example:
9
9
 
10
10
  # Installation
11
11
 
12
- * cd vendor/plugins
13
- * git clone
14
- * git://github.com/fogonthedowns/rubychem.git
15
- * ruby script/generate scaffold chem formula:string
16
- * rake db:migrate
17
- * Add "include RubyChem" in the application_controller.rb
18
- * in views/chems/show.html.erb add the following code: Molecular Mass: <%= RubyChem::Chemical.new(@chem.formula.to_s).fw %>
12
+ * gem install rubychem
13
+
@@ -0,0 +1,26 @@
1
+ Given /^I am not yet using the program$/ do
2
+ end
3
+
4
+ When /^I start the program$/ do
5
+ chemical = Mass::Compound.new(output)
6
+ chemical.start('H2O')
7
+ end
8
+
9
+ Then /^I should see "([^"]*)"$/ do |message|
10
+ output.messages.should include(message)
11
+ end
12
+
13
+
14
+ class Output
15
+ def messages
16
+ @messages ||= []
17
+ end
18
+
19
+ def puts(message)
20
+ messages << message
21
+ end
22
+ end
23
+
24
+ def output
25
+ @output ||= Output.new
26
+ end
@@ -0,0 +1,12 @@
1
+ When /^I submit "([^"]*)"$/ do |formula|
2
+ @chemical = Mass::Compound.new(output)
3
+ @chemical.start
4
+ @chemical.fw(formula)
5
+ end
6
+
7
+ Then /^the molecular mass should be "([^"]*)"$/ do |mass|
8
+ output.messages.should include(mass)
9
+ end
10
+
11
+
12
+
@@ -0,0 +1,2 @@
1
+ $LOAD_PATH << File.expand_path('../../../lib', __FILE__)
2
+ require 'ruby_chem'
@@ -0,0 +1,10 @@
1
+ Feature: user starts program
2
+ As a user
3
+ I want to start the program
4
+ So that I can find the molecular mass
5
+
6
+ Scenario: start game
7
+ Given I am not yet using the program
8
+ When I start the program
9
+ Then I should see "Welcome to RubyChem!"
10
+ And I should see "Enter a Compound:"
@@ -0,0 +1,19 @@
1
+ Feature: user submits compound
2
+
3
+ The user submits a chemical equation. The program returns the molecular mass
4
+
5
+ For the chemical compound the user submits, the program iterates through the equation to return
6
+ the number of atoms. The program multiplies the number of atoms times each specific molecular mass
7
+ and sums the masses. The program returns the total molecular mass
8
+
9
+ Scenario Outline: submit compound
10
+ When I submit "<compound>"
11
+ Then the molecular mass should be "<mass>"
12
+
13
+ Scenarios: no matches
14
+ | compound | mass |
15
+ | H2O | 18.01 |
16
+ | O | 15.99 |
17
+ | H2SO4 | 97.99 |
18
+ | NaCl | 58.44 |
19
+ | C6H12O6 | 180.12 |
data/lib/benchmark.rb CHANGED
@@ -1,32 +1,35 @@
1
1
  # The goal is for beta.rb to run faster
2
2
 
3
- load 'benchmark'
4
- load 'oldrubychem.rb'
3
+ require 'rubygems'
4
+ require 'benchmark'
5
+
5
6
  load 'rubychem.rb'
7
+ load 'comments.rb'
8
+
6
9
 
7
10
  iterations = 10000
8
11
 
9
12
  a = Benchmark.measure do
10
13
  for i in 1..iterations do
11
- RubyChem::Chemical.new("H2O").fw
14
+ RubyChem::Chemical.new("H2O")
12
15
  end
13
16
  end
14
17
 
15
18
  b = Benchmark.measure do
16
19
  for i in 1..iterations do
17
- RubyChemBeta::Chemical.new("H2O")
20
+ RubyChem::Compound.new("H2O").fw
18
21
  end
19
22
  end
20
23
 
21
24
  c = Benchmark.measure do
22
25
  for i in 1..iterations do
23
- RubyChem::Chemical.new("H2SO4").fw
26
+ RubyChem::Chemical.new("H2SO4")
24
27
  end
25
28
  end
26
29
 
27
30
  d = Benchmark.measure do
28
31
  for i in 1..iterations do
29
- RubyChemBeta::Chemical.new("H2SO4")
32
+ RubyChem::Compound.new("H2SO4").fw
30
33
  end
31
34
  end
32
35
 
@@ -1,5 +1,5 @@
1
- module RubyChemOld
2
- class Chemical
1
+ module RubyChem
2
+ class Compound
3
3
 
4
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
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,
@@ -1,3 +1,3 @@
1
1
  module Rubychem
2
- VERSION = "1.0.0"
2
+ VERSION = "1.0.1"
3
3
  end
@@ -0,0 +1,51 @@
1
+ module Mass
2
+ class Compound
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
14
+
15
+ def initialize(output)
16
+ @output = output
17
+ end
18
+
19
+ def start
20
+ @output.puts 'Welcome to RubyChem!'
21
+ @output.puts 'Enter a Compound:'
22
+ end
23
+
24
+ def fw(formula)
25
+ if formula.scan(/\d+$/) == []
26
+ x = formula.gsub(/$/, '1').scan(/[A-za-z]*\d+/)
27
+ speciate(x)
28
+ else
29
+ x = formula.scan(/[A-za-z]*\d+/)
30
+ speciate(x)
31
+ end
32
+ @output.puts @mm.round_to(4).to_s
33
+ end
34
+
35
+ private
36
+
37
+ def speciate(x)
38
+ @chem_species = x.map { |chem| chem.scan(/[A-Z][^A-Z]*/) }.flatten
39
+ @chem_species.map! {|chem| chem.scan /[A-Z]+|\d+/i }
40
+ atom_masses = @chem_species.map { |(elem, coeff)| MASSES[elem.to_sym] * (coeff || 1).to_f }
41
+ x = atom_masses.map { |int| int.to_f }
42
+ @mm = x.inject(0) { |s,v| s+= v }
43
+ end
44
+ end
45
+ end
46
+
47
+ class Float
48
+ def round_to(x)
49
+ (self * 10**x).round.to_f / 10**x
50
+ end
51
+ end
data/lib/valence.rb ADDED
@@ -0,0 +1,73 @@
1
+ module RubyChem
2
+ class Valence
3
+ Fillorder = ["1s","2s","2p","3s","3p","4s","3d","4p","5s","4d","5p","6s","4f","5d","6p","7s","5f","6d","7p"]
4
+ attr_accessor :calc_valence
5
+
6
+ def initialize(k)
7
+ @mass = k
8
+ determine_valence(@mass)
9
+ @calc_valence = Hash.new
10
+ @calc_valence = calculate_electronic_config
11
+ identify_valence_electrons
12
+ end
13
+
14
+
15
+ def calculate_electronic_config
16
+ @shell_location = 0
17
+ 1.upto(100) do |x|
18
+ until @v <= 0
19
+ shell_electrons = determine_valence_electrons_in_shell(@shell_location)
20
+ @before_subtract = @v
21
+ @v -= shell_electrons
22
+ @calc_valence[Fillorder[@shell_location]] = shell_electrons
23
+ move_on(@v)
24
+ end
25
+ end
26
+ @calc_valence
27
+ end
28
+
29
+ private
30
+
31
+ def determine_valence(mass)
32
+ @v = (mass / 1).round.to_i
33
+ end
34
+
35
+ def determine_valence_electrons_in_shell(x)
36
+ y = Fillorder[x].match(/\D/)[0]
37
+ if y == "s"
38
+ 2
39
+ elsif y == "p"
40
+ 6
41
+ elsif y == "d"
42
+ 10
43
+ elsif y == "f"
44
+ 14
45
+ end
46
+ end
47
+
48
+ def move_on(v)
49
+ if v > 0
50
+ @shell_location += 1
51
+ else
52
+ @calc_valence.delete(@shell_location)
53
+ @calc_valence[Fillorder[@shell_location]] = @before_subtract
54
+ end
55
+ end
56
+
57
+ def identify_valence_electrons
58
+ @valence_electrons = Hash.new
59
+ high_number = 0
60
+ @calc_valence.each_key do |x|
61
+ high_number = x.match(/\d/)[0].to_i if x.match(/\d/)[0].to_i > high_number
62
+ end
63
+
64
+ @calc_valence.each do |k,x|
65
+ if k.match(/\d/)[0].to_i == high_number
66
+ @valence_electrons[k] = x
67
+ end
68
+ end
69
+
70
+ end
71
+
72
+ end
73
+ end
data/rubychem.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
10
10
  s.email = ["justin.zollars@gmail.com"]
11
11
  s.homepage = "http://www.justinzollars.com"
12
12
  s.summary = %q{A ruby chemistry library}
13
- s.description = %q{This is an open source library of chemistry, goodies. I'm dedicating this code to my major professor Arthur Brecher and Graduate PI Dr. Rogers of Bowling Green State University'}
13
+ s.description = %q{This is an open source library of chemistry, goodies. I'm dedicating this code to my major professor Arthur Brecher and Graduate PI Dr. Rogers of Bowling Green State University}
14
14
 
15
15
  s.rubyforge_project = "rubychem"
16
16
 
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ module Mass
4
+ describe Compound do
5
+ let(:output) {double('output').as_null_object}
6
+ let(:chemical) {Compound.new(output)}
7
+
8
+ describe "#start" do
9
+ it "sends a welcome message" do
10
+ output.should_receive(:puts).with('Welcome to RubyChem!')
11
+ chemical.start
12
+ end
13
+
14
+ it "prompts for the compound" do
15
+ output.should_receive(:puts).with('Enter a Compound:')
16
+ chemical.start
17
+ end
18
+ end
19
+
20
+ describe "#fw" do
21
+ context "H2O" do
22
+ it "returns 18.01" do
23
+ chemical.start
24
+ output.should_receive(:puts).with('18.01')
25
+ chemical.fw('H2O')
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1 @@
1
+ require 'ruby_chem'
metadata CHANGED
@@ -1,33 +1,25 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: rubychem
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 1
7
- - 0
8
- - 0
9
- version: 1.0.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Justin Zollars
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2011-11-06 01:00:00 -07:00
18
- default_executable:
12
+ date: 2011-11-14 00:00:00.000000000Z
19
13
  dependencies: []
20
-
21
- description: This is an open source library of chemistry, goodies. I'm dedicating this code to my major professor Arthur Brecher and Graduate PI Dr. Rogers of Bowling Green State University'
22
- email:
14
+ description: This is an open source library of chemistry, goodies. I'm dedicating
15
+ this code to my major professor Arthur Brecher and Graduate PI Dr. Rogers of Bowling
16
+ Green State University
17
+ email:
23
18
  - justin.zollars@gmail.com
24
19
  executables: []
25
-
26
20
  extensions: []
27
-
28
21
  extra_rdoc_files: []
29
-
30
- files:
22
+ files:
31
23
  - .DS_Store
32
24
  - .gitignore
33
25
  - Gemfile
@@ -35,43 +27,50 @@ files:
35
27
  - LICENSE
36
28
  - README.markdown
37
29
  - Rakefile
30
+ - features/step_definitions/user_starts_program_steps.rb
31
+ - features/step_definitions/user_submits_compound_steps.rb
32
+ - features/support/env.rb
33
+ - features/user_starts_program.feature
34
+ - features/user_submits_compound.feature
38
35
  - lib/.DS_Store
39
36
  - lib/benchmark.rb
40
- - lib/oldrubychem.rb
37
+ - lib/comments.rb
41
38
  - lib/rubychem.rb
42
39
  - lib/rubychem/version.rb
40
+ - lib/rubychem_rspec.rb
41
+ - lib/valence.rb
43
42
  - rubychem.gemspec
44
- has_rdoc: true
43
+ - spec/rubychem/ruby_chem_spec.rb
44
+ - spec/spec_helper.rb
45
45
  homepage: http://www.justinzollars.com
46
46
  licenses: []
47
-
48
47
  post_install_message:
49
48
  rdoc_options: []
50
-
51
- require_paths:
49
+ require_paths:
52
50
  - lib
53
- required_ruby_version: !ruby/object:Gem::Requirement
51
+ required_ruby_version: !ruby/object:Gem::Requirement
54
52
  none: false
55
- requirements:
56
- - - ">="
57
- - !ruby/object:Gem::Version
58
- segments:
59
- - 0
60
- version: "0"
61
- required_rubygems_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ! '>='
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ required_rubygems_version: !ruby/object:Gem::Requirement
62
58
  none: false
63
- requirements:
64
- - - ">="
65
- - !ruby/object:Gem::Version
66
- segments:
67
- - 0
68
- version: "0"
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
69
63
  requirements: []
70
-
71
64
  rubyforge_project: rubychem
72
- rubygems_version: 1.3.7
65
+ rubygems_version: 1.8.10
73
66
  signing_key:
74
67
  specification_version: 3
75
68
  summary: A ruby chemistry library
76
- test_files: []
77
-
69
+ test_files:
70
+ - features/step_definitions/user_starts_program_steps.rb
71
+ - features/step_definitions/user_submits_compound_steps.rb
72
+ - features/support/env.rb
73
+ - features/user_starts_program.feature
74
+ - features/user_submits_compound.feature
75
+ - spec/rubychem/ruby_chem_spec.rb
76
+ - spec/spec_helper.rb