chemistry 0.0.1 → 0.0.2

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.
data/Gemfile CHANGED
@@ -7,6 +7,7 @@ gem 'flay'
7
7
  group :test do
8
8
  gem 'minitest'
9
9
  gem 'minitest-colorize'
10
+ gem 'pry'
10
11
  end
11
12
 
12
13
  # Specify your gem's dependencies in chemistry.gemspec
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ TEST_FILES = LIB_FILES.pathmap('%{^lib,test}d/test_%f')
5
5
 
6
6
  task :test do
7
7
  TEST_FILES.zip(LIB_FILES).each do |test_file, lib_file|
8
- ruby "-I . -I test -r #{lib_file} #{test_file}"
8
+ ruby "-I lib -I . -I test -r #{lib_file} #{test_file}"
9
9
  end
10
10
  end
11
11
 
@@ -0,0 +1,41 @@
1
+ module Chemistry
2
+ class Element
3
+ class << self
4
+ def symbol symbol
5
+ if symbol.is_a? String
6
+ const_set :SYMBOL, symbol
7
+ else
8
+ raise TypeError, "can't convert #{symbol.class} into String"
9
+ end
10
+ end
11
+
12
+ def atomic_number atomic_number
13
+ if atomic_number.is_a? Integer
14
+ const_set :ATOMIC_NUMBER, atomic_number
15
+ else
16
+ raise TypeError, "can't convert #{atomic_number.class} into Integer"
17
+ end
18
+ end
19
+
20
+ def atomic_weight atomic_weight
21
+ if atomic_weight.is_a? Numeric
22
+ const_set :ATOMIC_WEIGHT, atomic_weight
23
+ else
24
+ raise TypeError, "can't convert #{atomic_weight.class} into Numeric"
25
+ end
26
+ end
27
+ end
28
+
29
+ def symbol
30
+ self.class::SYMBOL
31
+ end
32
+
33
+ def atomic_number
34
+ self.class::ATOMIC_NUMBER
35
+ end
36
+
37
+ def atomic_weight
38
+ self.class::ATOMIC_WEIGHT
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,15 @@
1
+ require 'chemistry/element'
2
+
3
+ module Chemistry::Element::DSL
4
+ extend self
5
+
6
+ def element(name, &definition)
7
+ if block_given?
8
+ element_class = Class.new(Chemistry::Element)
9
+ Chemistry::Element.const_set(name, element_class)
10
+ element_class.instance_eval &definition if block_given?
11
+ else
12
+ raise ArgumentError, "`element` must be given a block"
13
+ end
14
+ end
15
+ end
@@ -1,3 +1,3 @@
1
1
  module Chemistry
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -0,0 +1,43 @@
1
+ require 'test_helper'
2
+
3
+ class ElementTest < MiniTest::Unit::TestCase
4
+ def test_raises_error_without_name
5
+ assert_raises ArgumentError do
6
+ ::Chemistry::Element::DSL.element
7
+ end
8
+ end
9
+
10
+ def test_raises_error_without_block
11
+ assert_raises ArgumentError do
12
+ Chemistry::Element::DSL.element "Hydrogen"
13
+ end
14
+ end
15
+
16
+ def test_defines_an_element
17
+ assert_raises NameError do
18
+ ::Chemistry::Element::Foobar
19
+ end
20
+
21
+ ::Chemistry::Element::DSL.element "Foobar" do
22
+ end
23
+
24
+ assert_equal ::Chemistry::Element <=> ::Chemistry::Element::Foobar, 1
25
+ end
26
+ end
27
+
28
+ class DefinitionTest < MiniTest::Unit::TestCase
29
+ include Chemistry::Element::DSL
30
+
31
+ def test_full_definition
32
+ element "Hydrogen" do
33
+ symbol 'H'
34
+ atomic_number 1
35
+ atomic_weight 1.00794
36
+ end
37
+
38
+ h_atom = Chemistry::Element::Hydrogen.new
39
+
40
+ assert_equal h_atom.symbol, 'H'
41
+ assert_equal h_atom.atomic_number, 1
42
+ end
43
+ end
@@ -0,0 +1,101 @@
1
+ require 'test_helper'
2
+
3
+ class ClassLevelAtomicNumberTest < ElementTestCase
4
+ def test_defines_a_constant
5
+ assert_raises NameError do
6
+ element::ATOMIC_NUMBER
7
+ end
8
+
9
+ element.atomic_number 14
10
+
11
+ assert_equal element::ATOMIC_NUMBER, 14
12
+ end
13
+
14
+ def test_must_be_an_integer
15
+ assert_raises TypeError do
16
+ element.atomic_number "a"
17
+ end
18
+
19
+ assert_raises TypeError do
20
+ element.atomic_number 1.2
21
+ end
22
+
23
+ assert element.atomic_number 12
24
+ end
25
+ end
26
+
27
+ class InstanceLevelAtomicNumberTest < ElementTestCase
28
+ def test_requires_atomic_number_to_be_defined_on_the_class_level
29
+ assert_raises NameError do
30
+ element.new.atomic_number
31
+ end
32
+
33
+ element.atomic_number 123
34
+
35
+ assert_equal element.new.atomic_number, 123
36
+ end
37
+ end
38
+
39
+ class ClassLevelAtomicWeightTest < ElementTestCase
40
+ def test_defines_a_constant
41
+ assert_raises NameError do
42
+ element::ATOMIC_WEIGHT
43
+ end
44
+
45
+ element.atomic_weight 1.12342314
46
+
47
+ assert_equal element::ATOMIC_WEIGHT, 1.12342314
48
+ end
49
+
50
+ def test_must_be_a_number
51
+ assert_raises TypeError do
52
+ element.atomic_weight "a"
53
+ end
54
+
55
+ assert element.atomic_weight 1.2
56
+ end
57
+ end
58
+
59
+ class InstanceLevelAtomicWeightTest < ElementTestCase
60
+ def test_requires_atomic_weight_to_be_defined_on_the_class_level
61
+ assert_raises NameError do
62
+ element.new.atomic_weight
63
+ end
64
+
65
+ element.atomic_weight 1.12342314
66
+
67
+ assert_equal element.new.atomic_weight, 1.12342314
68
+ end
69
+ end
70
+
71
+ class ClassLevelSymbolTest < ElementTestCase
72
+ def test_defines_a_constant
73
+ assert_raises NameError do
74
+ element::SYMBOL
75
+ end
76
+
77
+ element.symbol "H"
78
+
79
+ assert_equal element::SYMBOL, "H"
80
+ end
81
+
82
+ def test_must_be_a_string_or_symbol
83
+ assert_raises TypeError do
84
+ element.symbol 1
85
+ end
86
+
87
+ assert element.symbol 'H'
88
+ end
89
+ end
90
+
91
+ class InstanceLevelSymbolTest < ElementTestCase
92
+ def test_requires_symbol_to_be_defined_on_the_class_level
93
+ assert_raises NameError do
94
+ element.new.symbol
95
+ end
96
+
97
+ element.symbol 'He'
98
+
99
+ assert_equal element.new.symbol, 'He'
100
+ end
101
+ end
@@ -1,2 +1,8 @@
1
1
  require 'minitest/autorun'
2
2
  require 'minitest/colorize'
3
+
4
+ class ElementTestCase < MiniTest::Unit::TestCase
5
+ def element
6
+ @element ||= Class.new(Chemistry::Element)
7
+ end
8
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chemistry
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -26,7 +26,11 @@ files:
26
26
  - Rakefile
27
27
  - chemistry.gemspec
28
28
  - lib/chemistry.rb
29
+ - lib/chemistry/element.rb
30
+ - lib/chemistry/element/dsl.rb
29
31
  - lib/chemistry/version.rb
32
+ - test/chemistry/element/test_dsl.rb
33
+ - test/chemistry/test_element.rb
30
34
  - test/test_chemistry.rb
31
35
  - test/test_helper.rb
32
36
  homepage: http://isaacbfsanders.com/chemistry
@@ -43,7 +47,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
43
47
  version: '0'
44
48
  segments:
45
49
  - 0
46
- hash: -3593870372361112947
50
+ hash: -3193914091140684152
47
51
  required_rubygems_version: !ruby/object:Gem::Requirement
48
52
  none: false
49
53
  requirements:
@@ -52,7 +56,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
52
56
  version: '0'
53
57
  segments:
54
58
  - 0
55
- hash: -3593870372361112947
59
+ hash: -3193914091140684152
56
60
  requirements: []
57
61
  rubyforge_project:
58
62
  rubygems_version: 1.8.24
@@ -60,5 +64,7 @@ signing_key:
60
64
  specification_version: 3
61
65
  summary: Chemistry is a toolkit for dealing with compounds
62
66
  test_files:
67
+ - test/chemistry/element/test_dsl.rb
68
+ - test/chemistry/test_element.rb
63
69
  - test/test_chemistry.rb
64
70
  - test/test_helper.rb