nio 0.2.2 → 0.2.3

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/History.txt CHANGED
@@ -1,24 +1,30 @@
1
- == 0.2.2 2008-03-04
2
-
3
- * Minor enhancements
4
- - show_plus can be passed a string (e.g. ' ') that is used as the plus sign;
5
- added new show_exp_plus to control the sign display of the exponent in
6
- scientific notation.
7
-
8
- == 0.2.1 2007-12-15
9
-
10
- * Minor enhancements
11
- - The RepDec maximum number of digits can now be changed, and the default
12
- value has been incremented to 5000 digits (was 2048). With the new value
13
- the minimum value of a IEEE 754 extended number can now be shown as
14
- different from zero.
15
- - Performance optimizations in RepDec#setQ
16
- * Bug corrections
17
- - Fixed a problem in the formatted output of BigDecimals which affected large numbers.
18
- - Fix minor problem with nextfloat
19
-
20
- == 0.2.0 2007-09-22
21
-
22
- * Initial release
23
- - The Nio library has been extracted from and old project
24
- and packaged as a Gem.
1
+ == 0.2.3 2008-12-23
2
+
3
+ * Minor enhancements
4
+ - Compatibility with Ruby 1.9.1.
5
+ - Mr. Bones is used instead of Hoe/newgem for development tasks.
6
+
7
+ == 0.2.2 2008-03-04
8
+
9
+ * Minor enhancements
10
+ - show_plus can be passed a string (e.g. ' ') that is used as the plus sign;
11
+ added new show_exp_plus to control the sign display of the exponent in
12
+ scientific notation.
13
+
14
+ == 0.2.1 2007-12-15
15
+
16
+ * Minor enhancements
17
+ - The RepDec maximum number of digits can now be changed, and the default
18
+ value has been incremented to 5000 digits (was 2048). With the new value
19
+ the minimum value of a IEEE 754 extended number can now be shown as
20
+ different from zero.
21
+ - Performance optimizations in RepDec#setQ
22
+ * Bug corrections
23
+ - Fixed a problem in the formatted output of BigDecimals which affected large numbers.
24
+ - Fix minor problem with nextfloat
25
+
26
+ == 0.2.0 2007-09-22
27
+
28
+ * Initial release
29
+ - The Nio library has been extracted from and old project
30
+ and packaged as a Gem.
data/Manifest.txt CHANGED
@@ -4,8 +4,6 @@ Manifest.txt
4
4
  README.txt
5
5
  SOURCE.txt
6
6
  Rakefile
7
- config/hoe.rb
8
- config/requirements.rb
9
7
  lib/nio.rb
10
8
  lib/nio/version.rb
11
9
  lib/nio/repdec.rb
@@ -14,17 +12,8 @@ lib/nio/tools.rb
14
12
  lib/nio/rtnlzr.rb
15
13
  lib/nio/fmt.rb
16
14
  lib/nio/sugar.rb
17
- script/destroy
18
- script/destroy.cmd
19
- script/generate
20
- script/generate.cmd
21
- script/txt2html
22
- script/txt2html.cmd
23
15
  setup.rb
24
16
  tasks/nuweb.rake
25
- tasks/deployment.rake
26
- tasks/environment.rake
27
- tasks/website.rake
28
17
  test/data.yaml
29
18
  test/test_helper.rb
30
19
  test/test_tools.rb
data/Rakefile CHANGED
@@ -1,4 +1,34 @@
1
- require 'config/requirements'
2
- require 'config/hoe' # setup Hoe + all gem configuration
3
-
4
- Dir['tasks/**/*.rake'].each { |rake| load rake }
1
+ # Look in the tasks/setup.rb file for the various options that can be
2
+ # configured in this Rakefile. The .rake files in the tasks directory
3
+ # are where the options are used.
4
+
5
+ begin
6
+ require 'bones'
7
+ Bones.setup
8
+ rescue LoadError
9
+ load 'tasks/setup.rb'
10
+ end
11
+
12
+ ensure_in_path 'lib'
13
+ #require 'nio'
14
+ require File.join(File.dirname(__FILE__),'source/lib/nio/version')
15
+
16
+ task :default => 'spec:run'
17
+
18
+
19
+ PROJ.name = 'nio'
20
+ PROJ.description = "Numeric input/output"
21
+ PROJ.authors = 'Javier Goizueta'
22
+ PROJ.email = 'javier@goizueta.info'
23
+ PROJ.version = Nio::VERSION::STRING
24
+ PROJ.rubyforge.name = 'nio'
25
+ PROJ.url = "http://#{PROJ.rubyforge.name}.rubyforge.org"
26
+ PROJ.rdoc.opts = [
27
+ "--main", "README.txt",
28
+ '--title', 'Nio Documentation',
29
+ "--opname", "index.html",
30
+ "--line-numbers",
31
+ "--inline-source"
32
+ ]
33
+
34
+ # EOF
data/SOURCE.txt CHANGED
@@ -1,31 +1,31 @@
1
- =Notes on the source code
2
-
3
- The Ruby code in this project is generated from the source code
4
- in the directory "source" by the Rake task *tangle*.
5
-
6
- You can get the updated source code from the SVN repository
7
- at Rubyforge (svn://rubyforge.org/var/svn/nio/trunk)
8
- or from the "nio-source" package releases from the project.
9
-
10
- The nuweb source files have extension .w
11
-
12
- There's also a rake task named *weave* which generates
13
- a documented form of the source code in PDF format,
14
- which is saved to the directory source/pdf.
15
-
16
- This tasks requires the program nuweb which converts
17
- the nuweb sources (files with extension .w) in
18
- directory source to either ruby files or
19
- LaTeX files for the documentated source.
20
- For the weave task latex and dvipdfm are also necessary.
21
-
22
- You can get the PDF files corresponding to each realese
23
- in the "nio-source-pdf" packages.
24
-
25
- The necessary nuweb tool is available here for windows:
26
- http://perso.wanadoo.es/jgoizueta/dev/tools/nuweb-win32.zip
27
-
28
- For other systems the source code and an necessary patch
29
- can be obtained here:
30
- http://www.goizueta.info/javier/index.html?pg=dev/req.en.html
31
-
1
+ =Notes on the source code
2
+
3
+ The Ruby code in this project is generated from the source code
4
+ in the directory "source" by the Rake task *nuweb:tangle*.
5
+
6
+ You can get the updated source code from the SVN repository
7
+ at Rubyforge (svn://rubyforge.org/var/svn/nio/trunk)
8
+ or from the "nio-source" package releases from the project.
9
+
10
+ The nuweb source files have extension .w
11
+
12
+ There's also a rake task named *nuweb:weave* which generates
13
+ a documented form of the source code in PDF format,
14
+ which is saved to the directory source/pdf.
15
+
16
+ This tasks requires the program nuweb which converts
17
+ the nuweb sources (files with extension .w) in
18
+ directory source to either ruby files or
19
+ LaTeX files for the documentated source.
20
+ For the weave task latex and dvipdfm are also necessary.
21
+
22
+ You can get the PDF files corresponding to each realese
23
+ in the "nio-source-pdf" packages.
24
+
25
+ The necessary nuweb tool is available here for windows:
26
+ http://perso.wanadoo.es/jgoizueta/dev/tools/nuweb-win32.zip
27
+
28
+ For other systems the source code and an necessary patch
29
+ can be obtained here:
30
+ http://www.goizueta.info/javier/index.html?pg=dev/req.en.html
31
+
data/lib/nio/flttol.rb CHANGED
@@ -295,7 +295,7 @@ module Nio
295
295
  # and returns it as an object of the specified class (by default, Integer)
296
296
  def apprx_i(x,result=Integer)
297
297
  r = x.round
298
- return equals?(x,r) ? r.prec(result) : x
298
+ return equals?(x,r) ? Nio.numeric_cast(r,result) : x
299
299
  end
300
300
 
301
301
 
@@ -510,7 +510,7 @@ module Nio
510
510
  # and returns it as an object of the specified class (by default, Integer)
511
511
  def apprx_i(x,result=Integer)
512
512
  r = x.round
513
- return equals?(x,r) ? r.prec(result) : x
513
+ return equals?(x,r) ? Nio.numeric_cast(r,result) : x
514
514
  end
515
515
 
516
516
 
@@ -654,4 +654,16 @@ module Nio
654
654
  x
655
655
  end
656
656
 
657
+ def numeric_cast(value, type)
658
+ if value.respond_to?(:prec)
659
+ value.prec(type)
660
+ else
661
+ if type.kind_of?(BigDecimal)
662
+ BigDec(value)
663
+ else
664
+ Object.send type.to_s, value
665
+ end
666
+ end
667
+ end
668
+
657
669
  end
data/lib/nio/fmt.rb CHANGED
@@ -1849,7 +1849,10 @@ class BigDecimal
1849
1849
  end
1850
1850
  if !converted
1851
1851
  if fmt.get_base==10
1852
- txt = x.to_s
1852
+ # Don't use x.to_s because of bugs in BigDecimal in Ruby 1.9 revisions 20359-20797
1853
+ # x.to_s('F') is not affected by that problem, but produces innecesary long strings
1854
+ sgn,ds,b,e = x.split
1855
+ txt = "#{sgn<0 ? '-' : ''}0.#{ds}E#{e}"
1853
1856
 
1854
1857
  sign = '+'
1855
1858
  if txt[0,1]=='-'
data/lib/nio/rtnlzr.rb CHANGED
@@ -342,7 +342,7 @@ module Nio
342
342
  num_class ||= f.class
343
343
  return mth.ip(f),1 if mth.fp(f)==0
344
344
 
345
- one = 1.prec(num_class)
345
+ one = Nio.numeric_cast(1, num_class)
346
346
 
347
347
  sign = f<0
348
348
  f = -f if sign
@@ -359,7 +359,7 @@ module Nio
359
359
  end
360
360
 
361
361
 
362
- f1,f2 = [a,b].collect{|x| mth.abs(mth.rnd(x*f)/x.prec(num_class)-f)}
362
+ f1,f2 = [a,b].collect{|x| mth.abs(mth.rnd(x*f)/Nio.numeric_cast(x, num_class)-f)}
363
363
 
364
364
  a = f1>f2 ? b : a
365
365
 
data/lib/nio/version.rb CHANGED
@@ -2,7 +2,7 @@ module Nio #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 2
5
- TINY = 2
5
+ TINY = 3
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
data/tasks/ann.rake ADDED
@@ -0,0 +1,80 @@
1
+
2
+ begin
3
+ require 'bones/smtp_tls'
4
+ rescue LoadError
5
+ require 'net/smtp'
6
+ end
7
+ require 'time'
8
+
9
+ namespace :ann do
10
+
11
+ # A prerequisites task that all other tasks depend upon
12
+ task :prereqs
13
+
14
+ file PROJ.ann.file do
15
+ ann = PROJ.ann
16
+ puts "Generating #{ann.file}"
17
+ File.open(ann.file,'w') do |fd|
18
+ fd.puts("#{PROJ.name} version #{PROJ.version}")
19
+ fd.puts(" by #{Array(PROJ.authors).first}") if PROJ.authors
20
+ fd.puts(" #{PROJ.url}") if PROJ.url.valid?
21
+ fd.puts(" (the \"#{PROJ.release_name}\" release)") if PROJ.release_name
22
+ fd.puts
23
+ fd.puts("== DESCRIPTION")
24
+ fd.puts
25
+ fd.puts(PROJ.description)
26
+ fd.puts
27
+ fd.puts(PROJ.changes.sub(%r/^.*$/, '== CHANGES'))
28
+ fd.puts
29
+ ann.paragraphs.each do |p|
30
+ fd.puts "== #{p.upcase}"
31
+ fd.puts
32
+ fd.puts paragraphs_of(PROJ.readme_file, p).join("\n\n")
33
+ fd.puts
34
+ end
35
+ fd.puts ann.text if ann.text
36
+ end
37
+ end
38
+
39
+ desc "Create an announcement file"
40
+ task :announcement => ['ann:prereqs', PROJ.ann.file]
41
+
42
+ desc "Send an email announcement"
43
+ task :email => ['ann:prereqs', PROJ.ann.file] do
44
+ ann = PROJ.ann
45
+ from = ann.email[:from] || Array(PROJ.authors).first || PROJ.email
46
+ to = Array(ann.email[:to])
47
+
48
+ ### build a mail header for RFC 822
49
+ rfc822msg = "From: #{from}\n"
50
+ rfc822msg << "To: #{to.join(',')}\n"
51
+ rfc822msg << "Subject: [ANN] #{PROJ.name} #{PROJ.version}"
52
+ rfc822msg << " (#{PROJ.release_name})" if PROJ.release_name
53
+ rfc822msg << "\n"
54
+ rfc822msg << "Date: #{Time.new.rfc822}\n"
55
+ rfc822msg << "Message-Id: "
56
+ rfc822msg << "<#{"%.8f" % Time.now.to_f}@#{ann.email[:domain]}>\n\n"
57
+ rfc822msg << File.read(ann.file)
58
+
59
+ params = [:server, :port, :domain, :acct, :passwd, :authtype].map do |key|
60
+ ann.email[key]
61
+ end
62
+
63
+ params[3] = PROJ.email if params[3].nil?
64
+
65
+ if params[4].nil?
66
+ STDOUT.write "Please enter your e-mail password (#{params[3]}): "
67
+ params[4] = STDIN.gets.chomp
68
+ end
69
+
70
+ ### send email
71
+ Net::SMTP.start(*params) {|smtp| smtp.sendmail(rfc822msg, from, to)}
72
+ end
73
+ end # namespace :ann
74
+
75
+ desc 'Alias to ann:announcement'
76
+ task :ann => 'ann:announcement'
77
+
78
+ CLOBBER << PROJ.ann.file
79
+
80
+ # EOF
data/tasks/bones.rake ADDED
@@ -0,0 +1,20 @@
1
+
2
+ if HAVE_BONES
3
+
4
+ namespace :bones do
5
+
6
+ desc 'Show the PROJ open struct'
7
+ task :debug do |t|
8
+ atr = if t.application.top_level_tasks.length == 2
9
+ t.application.top_level_tasks.pop
10
+ end
11
+
12
+ if atr then Bones::Debug.show_attr(PROJ, atr)
13
+ else Bones::Debug.show PROJ end
14
+ end
15
+
16
+ end # namespace :bones
17
+
18
+ end # HAVE_BONES
19
+
20
+ # EOF
data/tasks/gem.rake ADDED
@@ -0,0 +1,192 @@
1
+
2
+ require 'find'
3
+ require 'rake/packagetask'
4
+ require 'rubygems/user_interaction'
5
+ require 'rubygems/builder'
6
+
7
+ module Bones
8
+ class GemPackageTask < Rake::PackageTask
9
+ # Ruby GEM spec containing the metadata for this package. The
10
+ # name, version and package_files are automatically determined
11
+ # from the GEM spec and don't need to be explicitly provided.
12
+ #
13
+ attr_accessor :gem_spec
14
+
15
+ # Tasks from the Bones gem directory
16
+ attr_reader :bones_files
17
+
18
+ # Create a GEM Package task library. Automatically define the gem
19
+ # if a block is given. If no block is supplied, then +define+
20
+ # needs to be called to define the task.
21
+ #
22
+ def initialize(gem_spec)
23
+ init(gem_spec)
24
+ yield self if block_given?
25
+ define if block_given?
26
+ end
27
+
28
+ # Initialization tasks without the "yield self" or define
29
+ # operations.
30
+ #
31
+ def init(gem)
32
+ super(gem.name, gem.version)
33
+ @gem_spec = gem
34
+ @package_files += gem_spec.files if gem_spec.files
35
+ @bones_files = []
36
+
37
+ local_setup = File.join(Dir.pwd, %w[tasks setup.rb])
38
+ if !test(?e, local_setup)
39
+ Dir.glob(::Bones.path(%w[lib bones tasks *])).each {|fn| bones_files << fn}
40
+ gem_spec.files = (gem_spec.files +
41
+ bones_files.map {|fn| File.join('tasks', File.basename(fn))}).sort
42
+ end
43
+ end
44
+
45
+ # Create the Rake tasks and actions specified by this
46
+ # GemPackageTask. (+define+ is automatically called if a block is
47
+ # given to +new+).
48
+ #
49
+ def define
50
+ super
51
+ task :prereqs
52
+ task :package => ['gem:prereqs', "#{package_dir_path}/#{gem_file}"]
53
+ file "#{package_dir_path}/#{gem_file}" => [package_dir_path] + package_files + bones_files do
54
+ when_writing("Creating GEM") {
55
+ chdir(package_dir_path) do
56
+ Gem::Builder.new(gem_spec).build
57
+ verbose(true) {
58
+ mv gem_file, "../#{gem_file}"
59
+ }
60
+ end
61
+ }
62
+ end
63
+
64
+ file package_dir_path => bones_files do
65
+ mkdir_p package_dir rescue nil
66
+ bones_files.each do |fn|
67
+ base_fn = File.join('tasks', File.basename(fn))
68
+ f = File.join(package_dir_path, base_fn)
69
+ fdir = File.dirname(f)
70
+ mkdir_p(fdir) if !File.exist?(fdir)
71
+ if File.directory?(fn)
72
+ mkdir_p(f)
73
+ else
74
+ raise "file name conflict for '#{base_fn}' (conflicts with '#{fn}')" if test(?e, f)
75
+ safe_ln(fn, f)
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ def gem_file
82
+ if @gem_spec.platform == Gem::Platform::RUBY
83
+ "#{package_name}.gem"
84
+ else
85
+ "#{package_name}-#{@gem_spec.platform}.gem"
86
+ end
87
+ end
88
+ end # class GemPackageTask
89
+ end # module Bones
90
+
91
+ namespace :gem do
92
+
93
+ PROJ.gem._spec = Gem::Specification.new do |s|
94
+ s.name = PROJ.name
95
+ s.version = PROJ.version
96
+ s.summary = PROJ.summary
97
+ s.authors = Array(PROJ.authors)
98
+ s.email = PROJ.email
99
+ s.homepage = Array(PROJ.url).first
100
+ s.rubyforge_project = PROJ.rubyforge.name
101
+
102
+ s.description = PROJ.description
103
+
104
+ PROJ.gem.dependencies.each do |dep|
105
+ s.add_dependency(*dep)
106
+ end
107
+
108
+ PROJ.gem.development_dependencies.each do |dep|
109
+ s.add_development_dependency(*dep)
110
+ end
111
+
112
+ s.files = PROJ.gem.files
113
+ s.executables = PROJ.gem.executables.map {|fn| File.basename(fn)}
114
+ s.extensions = PROJ.gem.files.grep %r/extconf\.rb$/
115
+
116
+ s.bindir = 'bin'
117
+ dirs = Dir["{#{PROJ.libs.join(',')}}"]
118
+ s.require_paths = dirs unless dirs.empty?
119
+
120
+ incl = Regexp.new(PROJ.rdoc.include.join('|'))
121
+ excl = PROJ.rdoc.exclude.dup.concat %w[\.rb$ ^(\.\/|\/)?ext]
122
+ excl = Regexp.new(excl.join('|'))
123
+ rdoc_files = PROJ.gem.files.find_all do |fn|
124
+ case fn
125
+ when excl; false
126
+ when incl; true
127
+ else false end
128
+ end
129
+ s.rdoc_options = PROJ.rdoc.opts + ['--main', PROJ.rdoc.main]
130
+ s.extra_rdoc_files = rdoc_files
131
+ s.has_rdoc = true
132
+
133
+ if test ?f, PROJ.test.file
134
+ s.test_file = PROJ.test.file
135
+ else
136
+ s.test_files = PROJ.test.files.to_a
137
+ end
138
+
139
+ # Do any extra stuff the user wants
140
+ PROJ.gem.extras.each do |msg, val|
141
+ case val
142
+ when Proc
143
+ val.call(s.send(msg))
144
+ else
145
+ s.send "#{msg}=", val
146
+ end
147
+ end
148
+ end # Gem::Specification.new
149
+
150
+ Bones::GemPackageTask.new(PROJ.gem._spec) do |pkg|
151
+ pkg.need_tar = PROJ.gem.need_tar
152
+ pkg.need_zip = PROJ.gem.need_zip
153
+ end
154
+
155
+ desc 'Show information about the gem'
156
+ task :debug => 'gem:prereqs' do
157
+ puts PROJ.gem._spec.to_ruby
158
+ end
159
+
160
+ desc 'Install the gem'
161
+ task :install => [:clobber, 'gem:package'] do
162
+ sh "#{SUDO} #{GEM} install --local pkg/#{PROJ.gem._spec.full_name}"
163
+
164
+ # use this version of the command for rubygems > 1.0.0
165
+ #sh "#{SUDO} #{GEM} install --no-update-sources pkg/#{PROJ.gem._spec.full_name}"
166
+ end
167
+
168
+ desc 'Uninstall the gem'
169
+ task :uninstall do
170
+ installed_list = Gem.source_index.find_name(PROJ.name)
171
+ if installed_list and installed_list.collect { |s| s.version.to_s}.include?(PROJ.version) then
172
+ sh "#{SUDO} #{GEM} uninstall --version '#{PROJ.version}' --ignore-dependencies --executables #{PROJ.name}"
173
+ end
174
+ end
175
+
176
+ desc 'Reinstall the gem'
177
+ task :reinstall => [:uninstall, :install]
178
+
179
+ desc 'Cleanup the gem'
180
+ task :cleanup do
181
+ sh "#{SUDO} #{GEM} cleanup #{PROJ.gem._spec.name}"
182
+ end
183
+ end # namespace :gem
184
+
185
+
186
+ desc 'Alias to gem:package'
187
+ task :gem => 'gem:package'
188
+
189
+ task :clobber => 'gem:clobber_package'
190
+ remove_desc_for_task 'gem:clobber_package'
191
+
192
+ # EOF