temperature 1.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,8 @@
1
+ === 1.1.0 2010-03-09
2
+ * 1 major enhancement:
3
+ * Support ruby 1.9
4
+
5
+ === 1.0.0 2010-03-06
6
+
7
+ * 1 major enhancement:
8
+ * Initial release
@@ -0,0 +1,24 @@
1
+ COPYING
2
+ History.txt
3
+ Manifest.txt
4
+ PostInstall.txt
5
+ README.rdoc
6
+ Rakefile
7
+ config/website.yml
8
+ lib/temperature.rb
9
+ lib/temperature/numeric.rb
10
+ lib/temperature/string.rb
11
+ script/console
12
+ script/destroy
13
+ script/generate
14
+ script/txt2html
15
+ test/test_convert.rb
16
+ test/test_dewpoint.rb
17
+ test/test_helper.rb
18
+ test/test_num.rb
19
+ test/test_temperature.rb
20
+ website/index.html
21
+ website/index.txt
22
+ website/javascripts/rounded_corners_lite.inc.js
23
+ website/stylesheets/screen.css
24
+ website/template.html.erb
@@ -0,0 +1,7 @@
1
+
2
+ For more information on temperature, see http://temperature.rubyforge.org
3
+
4
+ NOTE: Change this information in PostInstall.txt
5
+ You can also delete it if you don't want it.
6
+
7
+
@@ -0,0 +1,66 @@
1
+ = temperature
2
+
3
+ * http://github.com/sdague/temperature.rb
4
+
5
+ == DESCRIPTION:
6
+
7
+ Temperature makes it easy to deal with temperatures in Ruby, but
8
+ adding mixin methods to numbers and strings.
9
+
10
+ This was inspired by using Ruby to manipulate data from my home
11
+ weather station, and wanting it to keep track of the units for me so
12
+ that I didn't have to think about that in code.
13
+
14
+ == FEATURES/PROBLEMS:
15
+
16
+ * Should autodetect what units are appropriate for the locale
17
+
18
+ == SYNOPSIS:
19
+
20
+ freezing_in_F = 32
21
+ freezing_in_C = freezing_in_F.to_C
22
+
23
+ boiling_in_C = 100
24
+ boiling_in_C.units = "C"
25
+ boiling_in_F = boiling_in_C.to_F
26
+
27
+ absolute_zero = "0K".to_degrees
28
+ absolute_zero_in_C = absolute_zero.to_C
29
+ absolute_zero_in_F = absolute_zero.to_F
30
+
31
+ There is also support to calculate dewpoint from relative humidity
32
+ based on the NOAA approximation documented here -
33
+ http://en.wikipedia.org/wiki/Dew_point#Closer_approximation
34
+
35
+ dewpoint = 32.dewpoint(45)
36
+
37
+ == REQUIREMENTS:
38
+
39
+ == INSTALL:
40
+
41
+ sudo gem install temperature
42
+
43
+ == LICENSE:
44
+
45
+ (The MIT License)
46
+
47
+ Copyright (c) 2010 Sean Dague
48
+
49
+ Permission is hereby granted, free of charge, to any person obtaining
50
+ a copy of this software and associated documentation files (the
51
+ 'Software'), to deal in the Software without restriction, including
52
+ without limitation the rights to use, copy, modify, merge, publish,
53
+ distribute, sublicense, and/or sell copies of the Software, and to
54
+ permit persons to whom the Software is furnished to do so, subject to
55
+ the following conditions:
56
+
57
+ The above copyright notice and this permission notice shall be
58
+ included in all copies or substantial portions of the Software.
59
+
60
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
61
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
62
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
63
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
64
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
65
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
66
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile CHANGED
@@ -1,133 +1,28 @@
1
- require 'rubygems'
2
- require 'rake'
3
- require 'rake/testtask'
4
- require 'rake/rdoctask'
5
- require 'rake/clean'
6
- require 'rake/contrib/sshpublisher'
7
-
8
- PKG_NAME = "temperature"
9
- PKG_VERSION = "1.0"
10
-
11
- $VERBOSE = nil
12
- TEST_CHANGES_SINCE = Time.now - 600 # Recent tests = changed in last 10 minutes
13
-
14
- desc "Run all the unit tests"
15
- task :default => [ :test, :lines ]
16
-
17
- desc "Run the unit tests in test"
18
- Rake::TestTask.new(:test) { |t|
19
- t.libs << "test"
20
- t.test_files = FileList['test/*_test.rb']
21
- t.verbose = true
22
- }
23
-
24
- # rcov code coverage
25
- rcov_path = '/usr/bin/rcov'
26
- rcov_test_output = "./test/coverage"
27
- rcov_exclude = "interactive.rb,read_write.rb,fixtures"
28
-
29
- # Add our created paths to the 'rake clobber' list
30
- CLOBBER.include(rcov_test_output)
31
-
32
- desc 'Removes all previous unit test coverage information'
33
- task (:reset_unit_test_coverage) do |t|
34
- rm_rf rcov_unit_test_output
35
- mkdir rcov_unit_test_output
36
- end
37
-
38
- desc 'Run all unit tests with Rcov to measure coverage'
39
- Rake::TestTask.new(:rcov) do |t|
40
- t.libs << "test"
41
- t.pattern = 'test/**/*_test.rb'
42
- t.ruby_opts << rcov_path
43
- t.ruby_opts << "-o #{rcov_test_output}"
44
- t.ruby_opts << "-x #{rcov_exclude}"
45
- t.verbose = true
46
- end
47
-
48
- # Generate the RDoc documentation
49
- Rake::RDocTask.new(:doc) { |rdoc|
50
- rdoc.main = 'README'
51
- rdoc.rdoc_files.include('lib/**/*.rb', 'README')
52
- rdoc.rdoc_files.include('COPYING')
53
- rdoc.rdoc_dir = 'docs/temperature'
54
- rdoc.title = "Temperature -- Temperature mixin for Numerics and Strings"
55
- rdoc.options << "--include=examples --line-numbers --inline-source"
56
- }
57
-
58
1
  require 'rubygems'
59
- require 'rubygems/gem_runner'
60
- require 'rake/gempackagetask'
61
-
62
- spec = Gem::Specification.new do |s|
63
- s.name = "temperature"
64
- s.version = PKG_VERSION
65
- s.homepage = "http://github.com/sdague/temperature.rb"
66
- s.platform = Gem::Platform::RUBY
67
- s.summary = "A ruby mixin for making Numerics temperatures"
68
- s.description = ""
69
-
70
- s.files = FileList["{test,lib,docs,examples}/**/*"].to_a
71
- s.files += ["Rakefile", "README", "COPYING" ]
72
- s.require_path = "lib"
73
- s.autorequire = "temperature"
74
- s.has_rdoc = true
75
- s.extra_rdoc_files = ["README", "COPYING" ]
76
- s.rdoc_options.concat ['--main', 'README']
77
-
78
- s.author = "Sean Dague"
79
- s.email = "sean@dague.net"
80
- end
81
-
82
- Rake::GemPackageTask.new(spec) do |pkg|
83
- pkg.gem_spec = spec
84
- pkg.need_tar = true
85
- pkg.need_zip = true
86
- end
2
+ gem 'hoe', '>= 2.1.0'
3
+ require 'hoe'
4
+ require 'fileutils'
5
+ require './lib/temperature'
87
6
 
88
- desc "Upload Docs to RubyForge"
89
- task :publish_docs => [:doc] do
90
- publisher = Rake::SshDirPublisher.new(
91
- "sdague@rubyforge.org",
92
- "/var/www/gforge-projects/sdaguegems",
93
- "docs"
94
- )
95
- publisher.upload
96
- end
7
+ ENV['VERSION'] = Temperature::VERSION
97
8
 
9
+ Hoe.plugin :newgem
10
+ Hoe.plugin :website
11
+ # Hoe.plugin :cucumberfeatures
98
12
 
99
- desc "Publish the release files to RubyForge."
100
- task :release => [ :package, :publish_docs ] do
101
- require 'rubyforge'
102
- packages = %w( gem tgz zip ).collect{ |ext| "pkg/#{PKG_NAME}-#{PKG_VERSION}.#{ext}" }
103
- rubyforge = RubyForge.new
104
- rubyforge.configure
105
- rubyforge.login
106
- rubyforge.scrape_project("sdaguegems")
107
- rubyforge.add_release("sdaguegems", PKG_NAME, "v#{PKG_VERSION}", *packages)
108
- end
13
+ # Generate all the Rake tasks
14
+ # Run 'rake -T' to see list of generated tasks (from gem root directory)
15
+ $hoe = Hoe.spec 'temperature' do
16
+ self.developer 'Sean Dague', 'sean@dague.net'
17
+ self.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required
18
+ self.rubyforge_name = "sdaguegems" # TODO this is default value
19
+ # self.extra_deps = [['activesupport','>= 2.0.2']]
109
20
 
110
- desc 'Install the gem globally (requires sudo)'
111
- task :install => :package do |t|
112
- `sudo gem install pkg/temperature-#{PKG_VERSION}.gem`
113
21
  end
114
22
 
115
- task :lines do
116
- lines = 0
117
- codelines = 0
118
- Dir.foreach("lib/") { |file_name|
119
- next unless file_name =~ /.*rb/
23
+ require 'newgem/tasks'
24
+ Dir['tasks/**/*.rake'].each { |t| load t }
120
25
 
121
- f = File.open("lib/" + file_name)
122
-
123
- while line = f.gets
124
- lines += 1
125
- next if line =~ /^\s*$/
126
- next if line =~ /^\s*#/
127
- codelines += 1
128
- end
129
- }
130
- puts "\n------------------------------\n"
131
- puts "Total Lines: #{lines}"
132
- puts "Lines of Code: #{codelines}"
133
- end
26
+ # TODO - want other tests/tasks run by default? Add them to the list
27
+ # remove_task :default
28
+ # task :default => [:spec, :features]
@@ -0,0 +1,2 @@
1
+ host: sdague@rubyforge.org
2
+ remote_dir: /var/www/gforge-projects/sdaguegems/temperature
@@ -1,174 +1,14 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require 'temperature/numeric'
5
+ require 'temperature/string'
6
+
1
7
  # Temperature works as a mixin on both the Numeric and String classes.
2
8
  # The idea is to make manipulating temperatures as simple and natural
3
9
  # as possible. If units are not specified, they are assume to be in
4
10
  # degrees 'F'. Yes, I realize this is US centric, but that's where I
5
11
  # live. In the future I'd like to auto detect that base on locale.
6
- #
7
- # Example use:
8
- #
9
- # freezing_in_C = 32.to_C
10
- #
11
- # num = 0
12
- # num.units = "C"
13
- # freezing_in_F = num.to_F
14
-
15
- class Numeric
16
- @units
17
-
18
- # The scale factor between C and F
19
- CScale = 1.8
20
- # The offset between C and F
21
- FOffset = 32
22
- # The offset between K and C
23
- KOffset = 273.15
24
-
25
- # The degree units the temperature is in. This defaults to "F" if
26
- # not specified. Valid values are "C", "F", or "K" (R is not
27
- # currently support... no one really uses that anyway).
28
- def units
29
- if @units
30
- return @units
31
- else
32
- # this should auto detect the env, but for now, I live in the US
33
- return "F"
34
- end
35
- end
36
-
37
- def units=(u)
38
- if u =~ /^(C|F|K)/
39
- @units = u
40
- end
41
- return @units
42
- end
43
-
44
- # Is this a Farenheit temperature, returns a boolean
45
- def is_F?
46
- return self.units == "F"
47
- end
48
-
49
- # Is this a Celcius temperature, returns a boolean
50
- def is_C?
51
- return self.units == "C"
52
- end
53
-
54
- # Is this a Kelvin temperature, returns a boolean
55
- def is_K?
56
- return self.units == "K"
57
- end
58
-
59
- # Convert the temperature to Farenheit. If it's already in F, it
60
- # returns itself.
61
- def to_F
62
- case self.units
63
- when "F":
64
- return self
65
- when "C":
66
- return self.c2f
67
- when "K":
68
- return self.k2f
69
- end
70
- end
71
-
72
- # Convert the temperature to Celcius. If it's already in C, it
73
- # returns itself.
74
- def to_C
75
- case self.units
76
- when "F":
77
- return self.f2c
78
- when "C":
79
- return self
80
- when "K":
81
- return self.k2c
82
- end
83
- end
84
-
85
- # Convert the temperature to Kelvins. If it's already in K, it
86
- # returns itself.
87
- def to_K
88
- case self.units
89
- when "F":
90
- return self.f2k
91
- when "C":
92
- return self.c2k
93
- when "K":
94
- return self
95
- end
96
- end
97
-
98
- def c2f
99
- num = self * CScale + FOffset
100
- num.units = "F"
101
- return num
102
- end
103
-
104
- def f2c
105
- num = (self - FOffset) / CScale
106
- num.units = "C"
107
- return num
108
- end
109
-
110
- def c2k
111
- num = self + KOffset
112
- num.units = "K"
113
- return num
114
- end
115
-
116
- def k2c
117
- num = self - KOffset
118
- num.units = "C"
119
- return num
120
- end
121
-
122
- def f2k
123
- self.f2c.c2k
124
- end
125
-
126
- def k2f
127
- self.k2c.c2f
128
- end
129
-
130
- # Compute the dewpoint for the temperature given a relative
131
- # humidity. This is using the NOAA approximation for dewpoint
132
- # calculation -
133
- # http://en.wikipedia.org/wiki/Dew_point#Closer_approximation
134
- def dewpoint(rh)
135
- units = self.units
136
- temp = self.to_C
137
- e_sub_s = 6.112 * Math.exp((17.76 * temp) / (temp + 243.5))
138
- e = rh * e_sub_s / 100
139
- dew = 243.5 * Math.log(e / 6.112) / (17.67 - Math.log(e / 6.112))
140
- dew.units = "C"
141
- final = dew.send("to_#{units}")
142
- return final
143
- end
144
-
145
-
146
- end
147
-
148
- class String
149
-
150
- # Parse a string that looks like a temperature into a temperature
151
- # of the right units. It handles strings of the format
152
- #
153
- # 35.1C
154
- # 72K
155
- # -40F
156
- #
157
- # Decimals are support, as are negative numbers. The units must
158
- # be C, K, or F, and not have a space between the numer and the
159
- # units
160
- def to_degrees
161
- if self =~ /^(-?)(\d+)\.(\d+)(F|C|K)$/
162
- tmp = "#{$1}#{$2}.#{$3}".to_f
163
- tmp.units = $4
164
- return tmp
165
- elsif self =~ /^(-?)(\d+)(F|C|K)$/
166
- tmp = "#{$1}#{$2}".to_f
167
- tmp.units = $3
168
- return tmp
169
- end
170
- end
171
-
172
-
12
+ module Temperature
13
+ VERSION = "1.1.0"
173
14
  end
174
-