map_by_method 0.6.0 → 0.7.0

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 ADDED
@@ -0,0 +1,12 @@
1
+ == 0.7.0 2007-08-11
2
+
3
+ * ActiveRecord AssociationProxy support (company.users.map_by_name now works)
4
+ * Refactored svn into trunk/tags/branches
5
+ * Added hoe
6
+ * Added website
7
+
8
+ == 0.6
9
+
10
+ * Removed explicit singularize method.
11
+ * Instead, singularize option only supported if another gem (e.g. activesupport)
12
+ provides a singularize method for strings.
data/Manifest.txt ADDED
@@ -0,0 +1,17 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ install.rb
6
+ lib/map_by_method.rb
7
+ lib/map_by_method/version.rb
8
+ scripts/txt2html
9
+ test/test_ar_association_proxy.rb
10
+ test/test_helper.rb
11
+ test/test_map_by_method.rb
12
+ test/test_multiple_methods.rb
13
+ website/index.html
14
+ website/index.txt
15
+ website/javascripts/rounded_corners_lite.inc.js
16
+ website/stylesheets/screen.css
17
+ website/template.rhtml
data/README.txt ADDED
@@ -0,0 +1,28 @@
1
+ = map_by_method by Dr Nic
2
+
3
+ == Installation
4
+
5
+ gem install map_by_method
6
+
7
+ == Usage
8
+
9
+ > a = ["1", "2", "3"]
10
+ > a.map_by_to_i
11
+ => [1, 2, 3]
12
+
13
+ Can be used with ActiveRecord associations (since 0.7.0)
14
+
15
+ > company = Company.find_by_name "Dr Nic Academy"
16
+ > company.employees.count
17
+ => 1
18
+ > company.employees.map_by_name
19
+ => ["Dr Nic"]
20
+
21
+ Why use this?
22
+
23
+ I think its much easier to type and read than its two equivalents:
24
+
25
+ > company.employees.map { |employee| employee.name }
26
+ or
27
+ > company.employees.map &:name
28
+
data/Rakefile CHANGED
@@ -1,82 +1,125 @@
1
1
  require 'rubygems'
2
2
  require 'rake'
3
3
  require 'rake/clean'
4
+ require 'rake/testtask'
4
5
  require 'rake/packagetask'
5
6
  require 'rake/gempackagetask'
6
7
  require 'rake/rdoctask'
7
8
  require 'rake/contrib/rubyforgepublisher'
8
9
  require 'fileutils'
10
+ require 'hoe'
11
+
9
12
  include FileUtils
10
13
  require File.join(File.dirname(__FILE__), 'lib', 'map_by_method', 'version')
11
14
 
12
15
  AUTHOR = "Dr Nic Williams"
13
16
  EMAIL = "drnicwilliams@gmail.com"
14
- DESCRIPTION = "Replacement for Symbol.to_proc which is much cleaner and prettier"
15
- HOMEPATH = 'http://drnicutilities.rubyforge.org'
16
- RUBYFORGE_PROJECT = "drnicutilities"
17
+ DESCRIPTION = <<-EOS
18
+ Replacement for map {|obj| obj.action} and Symbol.to_proc which is much cleaner and prettier
19
+ NOW WORKS with ActiveRecord Associations!!
20
+ EOS
21
+ GEM_NAME = "map_by_method"
22
+
23
+ @config_file = "~/.rubyforge/user-config.yml"
24
+ @config = nil
25
+ def rubyforge_username
26
+ unless @config
27
+ begin
28
+ @config = YAML.load(File.read(File.expand_path(@config_file)))
29
+ rescue
30
+ puts <<-EOS
31
+ ERROR: No rubyforge config file found: #{@config_file}"
32
+ Run 'rubyforge setup' to prepare your env for access to Rubyforge
33
+ - See http://newgem.rubyforge.org/rubyforge.html for more details
34
+ EOS
35
+ exit
36
+ end
37
+ end
38
+ @rubyforge_username ||= @config["username"]
39
+ end
17
40
 
41
+ RUBYFORGE_PROJECT = 'drnicutilities' # The unix name for your project
42
+ HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
43
+ DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
18
44
 
19
- NAME = "map_by_method"
20
- REV = nil #File.read(".svn/entries")[/committed-rev="(d+)"/, 1] rescue nil
21
- VERS = ENV['VERSION'] || (MapByMethod::VERSION::STRING + (REV ? ".#{REV}" : ""))
22
- CLEAN.include ['**/.*.sw?', '*.gem', '.config']
23
- RDOC_OPTS = ['--quiet', '--title', "map_by_method documentation",
45
+ REV = nil
46
+ # UNCOMMENT IF REQUIRED:
47
+ # REV = `svn info`.each {|line| if line =~ /^Revision:/ then k,v = line.split(': '); break v.chomp; else next; end} rescue nil
48
+ VERS = MapByMethod::VERSION::STRING + (REV ? ".#{REV}" : "")
49
+ CLEAN.include ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store']
50
+ RDOC_OPTS = ['--quiet', '--title', 'find_gem documentation',
24
51
  "--opname", "index.html",
25
52
  "--line-numbers",
26
53
  "--main", "README",
27
54
  "--inline-source"]
28
- BIN_FILES = %w( )
29
55
 
30
- desc "Packages up map_by_method gem."
31
- task :default => [:test]
32
- task :package => [:clean]
56
+ class Hoe
57
+ def extra_deps
58
+ @extra_deps.reject { |x| Array(x).first == 'hoe' }
59
+ end
60
+ end
33
61
 
34
- task :test do
35
- require File.dirname(__FILE__) + '/test/all_tests.rb'
62
+ # Generate all the Rake tasks
63
+ # Run 'rake -T' to see list of generated tasks (from gem root directory)
64
+ hoe = Hoe.new(GEM_NAME, VERS) do |p|
65
+ p.author = AUTHOR
66
+ p.description = DESCRIPTION
67
+ p.email = EMAIL
68
+ p.summary = DESCRIPTION
69
+ p.url = HOMEPATH
70
+ p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
71
+ p.test_globs = ["test/**/test_*.rb"]
72
+ p.clean_globs |= CLEAN #An array of file patterns to delete on clean.
73
+
74
+ # == Optional
75
+ p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
76
+ #p.extra_deps = [] # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
77
+ #p.spec_extras = {} # A hash of extra values to set in the gemspec.
36
78
  end
37
79
 
38
- spec =
39
- Gem::Specification.new do |s|
40
- s.name = NAME
41
- s.version = VERS
42
- s.platform = Gem::Platform::RUBY
43
- s.has_rdoc = true
44
- s.extra_rdoc_files = ["README", "CHANGELOG"]
45
- s.rdoc_options += RDOC_OPTS + ['--exclude', '^(examples|extras)/']
46
- s.summary = DESCRIPTION
47
- s.description = DESCRIPTION
48
- s.author = AUTHOR
49
- s.email = EMAIL
50
- s.homepage = HOMEPATH
51
- s.executables = BIN_FILES
52
- s.autorequire = "map_by_method"
53
- s.rubyforge_project = RUBYFORGE_PROJECT
54
- s.bindir = "bin"
55
- s.require_path = "lib"
56
-
57
- #s.add_dependency('activesupport', '>=1.3.1')
58
- #s.required_ruby_version = '>= 1.8.2'
59
-
60
- s.files = %w(README CHANGELOG Rakefile) +
61
- Dir.glob("{bin,doc,test,lib,templates,extras,website,script}/**/*") +
62
- Dir.glob("ext/**/*.{h,c,rb}") +
63
- Dir.glob("examples/**/*.rb") +
64
- Dir.glob("tools/*.rb")
65
-
66
- # s.extensions = FileList["ext/**/extconf.rb"].to_a
67
- end
80
+ CHANGES = hoe.paragraphs_of('History.txt', 0..1).join("\n\n")
81
+ PATH = (RUBYFORGE_PROJECT == GEM_NAME) ? RUBYFORGE_PROJECT : "#{RUBYFORGE_PROJECT}/#{GEM_NAME}"
82
+ hoe.remote_rdoc_dir = File.join(PATH.gsub(/^#{RUBYFORGE_PROJECT}\/?/,''), 'rdoc')
68
83
 
69
- Rake::GemPackageTask.new(spec) do |p|
70
- p.need_tar = false
71
- p.gem_spec = spec
84
+ desc 'Generate website files'
85
+ task :website_generate do
86
+ Dir['website/**/*.txt'].each do |txt|
87
+ sh %{ ruby scripts/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
88
+ end
72
89
  end
73
90
 
74
- task :install do
75
- name = "#{NAME}-#{VERS}.gem"
76
- sh %{rake package}
77
- sh %{sudo gem install pkg/#{name}}
91
+ desc 'Upload website files to rubyforge'
92
+ task :website_upload do
93
+ host = "#{rubyforge_username}@rubyforge.org"
94
+ remote_dir = "/var/www/gforge-projects/#{PATH}/"
95
+ local_dir = 'website'
96
+ sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}}
78
97
  end
79
98
 
80
- task :uninstall => [:clean] do
81
- sh %{sudo gem uninstall #{NAME}}
99
+ desc 'Generate and upload website files'
100
+ task :website => [:website_generate, :website_upload]
101
+
102
+ desc 'Release the website and new gem version'
103
+ task :deploy => [:check_version, :website, :release] do
104
+ puts "Remember to create SVN tag:"
105
+ puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
106
+ "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
107
+ puts "Suggested comment:"
108
+ puts "Tagging release #{CHANGES}"
109
+ end
110
+
111
+ desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
112
+ task :local_deploy => [:website_generate, :install_gem]
113
+
114
+ task :check_version do
115
+ unless ENV['VERSION']
116
+ puts 'Must pass a VERSION=x.y.z release version'
117
+ exit
118
+ end
119
+ unless ENV['VERSION'] == VERS
120
+ puts "Please update your version.rb to match the release version, currently #{VERS}"
121
+ exit
122
+ end
82
123
  end
124
+
125
+
data/install.rb ADDED
File without changes
data/lib/map_by_method.rb CHANGED
@@ -1,34 +1,50 @@
1
1
  module MapByMethod
2
- def self.included(base)
3
- super
2
+ module ClassMethods
3
+ def map_by_method_regex
4
+ /(map|collect|select|each|reject)(_by)?_([\w\_]+\??)/
5
+ end
6
+ end
7
+
8
+ module InstanceMethods
9
+ alias_method :method_missing_before_map_by_method, :method_missing
4
10
 
5
- base.module_eval <<-EOS
6
- def method_missing(method, *args, &block)
7
- super
8
- rescue NoMethodError
9
- error = $!
10
- begin
11
- re = /(map|collect|select|each|reject)(_by)?_([\\w\\_]+\\??)/
12
- if (match = method.to_s.match(re))
13
- iterator, callmethod = match[1], match[3]
14
- callmethods = callmethod.split('_and_')
15
- result = callmethods.collect do |callmethod|
16
- self.send(iterator) {|item| item.send callmethod}
17
- end
18
- return callmethods.length == 1 ?
19
- result.first :
20
- result.transpose
11
+ def method_missing(method, *args, &block)
12
+ method_missing_before_map_by_method(method, *args, &block)
13
+ rescue NoMethodError
14
+ error = $!
15
+ begin
16
+ if (match = method.to_s.match(self.class.map_by_method_regex))
17
+ iterator, callmethod = match[1], match[3]
18
+ callmethods = callmethod.split('_and_')
19
+ result = callmethods.collect do |callmethod|
20
+ self.send(iterator) {|item| item.send callmethod}
21
21
  end
22
- method_name = method.to_s
23
- @@support_singularize ||= method_name.methods.include? "singularize"
24
- return self.map {|item| item.send method_name.singularize.to_sym} if @@support_singularize
25
- rescue NoMethodError
26
- nil
22
+ return callmethods.length == 1 ?
23
+ result.first :
24
+ result.transpose
27
25
  end
28
- raise error
26
+ method_name = method.to_s
27
+ @@support_singularize ||= method_name.methods.include? "singularize"
28
+ return self.map {|item| item.send method_name.singularize.to_sym} if @@support_singularize
29
+ rescue NoMethodError
30
+ nil
29
31
  end
30
- EOS
32
+ raise error
33
+ end
34
+
35
+ alias_method :"respond_to_before_map_by_method?", :"respond_to?"
36
+ def respond_to?(method)
37
+ return true if respond_to_before_map_by_method?(method)
38
+ method.to_s.match(self.class.map_by_method_regex)
39
+ end
40
+ end
41
+
42
+ def self.included(base)
43
+ super
44
+ base.extend(ClassMethods)
45
+ base.send(:include, InstanceMethods)
31
46
  end
47
+
32
48
  end
33
49
 
34
- Array.send :include, MapByMethod
50
+ Array.send :include, MapByMethod
@@ -1,7 +1,7 @@
1
1
  module MapByMethod #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
- MINOR = 6
4
+ MINOR = 7
5
5
  TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
data/scripts/txt2html ADDED
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'redcloth'
5
+ require 'syntax/convertors/html'
6
+ require 'erb'
7
+ require File.dirname(__FILE__) + '/../lib/map_by_method/version.rb'
8
+
9
+ version = MapByMethod::VERSION::STRING
10
+ download = 'http://rubyforge.org/projects/drnicutilities'
11
+
12
+ class Fixnum
13
+ def ordinal
14
+ # teens
15
+ return 'th' if (10..19).include?(self % 100)
16
+ # others
17
+ case self % 10
18
+ when 1: return 'st'
19
+ when 2: return 'nd'
20
+ when 3: return 'rd'
21
+ else return 'th'
22
+ end
23
+ end
24
+ end
25
+
26
+ class Time
27
+ def pretty
28
+ return "#{mday}#{mday.ordinal} #{strftime('%B')} #{year}"
29
+ end
30
+ end
31
+
32
+ def convert_syntax(syntax, source)
33
+ return Syntax::Convertors::HTML.for_syntax(syntax).convert(source).gsub(%r!^<pre>|</pre>$!,'')
34
+ end
35
+
36
+ if ARGV.length >= 1
37
+ src, template = ARGV
38
+ template ||= File.dirname(__FILE__) + '/../website/template.rhtml'
39
+
40
+ else
41
+ puts("Usage: #{File.split($0).last} source.txt [template.rhtml] > output.html")
42
+ exit!
43
+ end
44
+
45
+ template = ERB.new(File.open(template).read)
46
+
47
+ title = nil
48
+ body = nil
49
+ File.open(src) do |fsrc|
50
+ title_text = fsrc.readline
51
+ body_text = fsrc.read
52
+ syntax_items = []
53
+ body_text.gsub!(%r!<(pre|code)[^>]*?syntax=['"]([^'"]+)[^>]*>(.*?)</\1>!m){
54
+ ident = syntax_items.length
55
+ element, syntax, source = $1, $2, $3
56
+ syntax_items << "<#{element} class=\"syntax\">#{convert_syntax(syntax, source)}</#{element}>"
57
+ "syntax-temp-#{ident}"
58
+ }
59
+ title = RedCloth.new(title_text).to_html.gsub(%r!<.*?>!,'').strip
60
+ body = RedCloth.new(body_text).to_html
61
+ body.gsub!(%r!(?:<pre><code>)?syntax-temp-(\d+)(?:</code></pre>)?!){ syntax_items[$1.to_i] }
62
+ end
63
+ stat = File.stat(src)
64
+ created = stat.ctime
65
+ modified = stat.mtime
66
+
67
+ $stdout << template.result(binding)
@@ -0,0 +1,62 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+ begin
3
+ require 'rubygems'
4
+ require 'active_record'
5
+ gem 'mocha'
6
+ require 'mocha'
7
+ rescue LoadError
8
+ puts "MapByMethod tests require ActiveRecord and Mocha gems, even if you don't use them personally, the tests test them"
9
+ exit 0
10
+ end
11
+
12
+ class Company < ActiveRecord::Base
13
+ end
14
+
15
+ class Employee < ActiveRecord::Base
16
+ end
17
+
18
+ class TestArAssociationProxy < Test::Unit::TestCase
19
+
20
+ def setup
21
+ Company.stubs(:columns).returns([
22
+ stub(:name =>'id', :type => :integer, :default => 1, :type_cast_code => 1, :"number?" => true, :"text?" => false),
23
+ stub(:name =>'name', :type => :string, :default => nil, :"number?" => false, :type_cast_code => nil, :"text?" => true)])
24
+ Company.stubs(:table_name).returns('companies')
25
+ Company.stubs(:primary_key).returns('id')
26
+
27
+ Employee.stubs(:columns).returns([
28
+ stub(:name =>'id', :type => :integer, :default => 1, :type_cast_code => 1, :"number?" => true, :"text?" => false),
29
+ stub(:name =>'company_id', :type => :integer, :default => nil, :"number?" => true, :type_cast_code => nil, :"text?" => false),
30
+ stub(:name =>'name', :type => :string, :default => nil, :"number?" => false, :type_cast_code => nil, :"text?" => true)])
31
+ Employee.stubs(:table_name).returns('employees')
32
+ Employee.stubs(:primary_key).returns('id')
33
+
34
+ connection = stub(:tables => @table_names, :quote => nil)
35
+ ActiveRecord::Base.stubs(:connection).returns(connection)
36
+ Company.stubs(:connection).returns(connection)
37
+ Employee.stubs(:connection).returns(connection)
38
+
39
+ Company.has_many :employees
40
+ Employee.belongs_to :company
41
+
42
+ @company = Company.new :name => "Dr Nic Academy", :id => 1
43
+ @emp1 = Employee.new :name => "Dr Nic", :id => 1, :company_id => 1
44
+ @emp1.stubs(:read_attribute).with("name").returns('Dr Nic')
45
+ @emp2 = Employee.new :name => "Banjo", :id => 2, :company_id => 1
46
+ @emp2.stubs(:read_attribute).with("name").returns('Banjo')
47
+
48
+ @company.stubs(:"new_record?").returns(false)
49
+ Employee.stubs(:find).returns([@emp1, @emp2]) # this will do since only the above data to mock
50
+ end
51
+
52
+ def test_map_by_association_attribute
53
+ expected = ['Dr Nic', 'Banjo']
54
+ assert_equal(expected, @company.employees.map_by_name)
55
+ end
56
+
57
+ def test_normal_map_by_association_attribute
58
+ expected = ['Dr Nic', 'Banjo']
59
+ assert_equal(expected, @company.employees.map {|emp| emp.name})
60
+ end
61
+
62
+ end
@@ -1,6 +1,6 @@
1
1
  require File.dirname(__FILE__) + '/test_helper.rb'
2
2
 
3
- class MapByMethodTest < Test::Unit::TestCase
3
+ class TestMapByMethod < Test::Unit::TestCase
4
4
 
5
5
  def setup
6
6
  end
@@ -1,7 +1,7 @@
1
1
  require File.dirname(__FILE__) + '/test_helper.rb'
2
2
  require 'ostruct'
3
3
 
4
- class MapByMethodTest < Test::Unit::TestCase
4
+ class TestMultipleMethods < Test::Unit::TestCase
5
5
 
6
6
  def setup
7
7
  @data = [
@@ -0,0 +1,120 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <link rel="stylesheet" href="stylesheets/screen.css" type="text/css" media="screen" />
6
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7
+ <title>
8
+ Map By Method
9
+ </title>
10
+ <script src="javascripts/rounded_corners_lite.inc.js" type="text/javascript"></script>
11
+ <style>
12
+
13
+ </style>
14
+ <script type="text/javascript">
15
+ window.onload = function() {
16
+ settings = {
17
+ tl: { radius: 10 },
18
+ tr: { radius: 10 },
19
+ bl: { radius: 10 },
20
+ br: { radius: 10 },
21
+ antiAlias: true,
22
+ autoPad: true,
23
+ validTags: ["div"]
24
+ }
25
+ var versionBox = new curvyCorners(settings, document.getElementById("version"));
26
+ versionBox.applyCornersToAll();
27
+ }
28
+ </script>
29
+ </head>
30
+ <body>
31
+ <div id="main">
32
+ <p><a href="/">&#x21A9; More Dr Nic Utilities</a></p>
33
+ <h1 class=primary>Map By Method</h1>
34
+ <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/drnicutilities"; return false'>
35
+ Get Version
36
+ <a href="http://rubyforge.org/projects/drnicutilities" class="numbers">0.7.0</a>
37
+ </div>
38
+ <h1><code>["1","2","3"]. map_by_to_i =&gt; [1,2,3]</code></h1>
39
+
40
+
41
+ <h2>Installation</h2>
42
+
43
+
44
+ <pre>gem install map_by_method</pre>
45
+
46
+ <h2>Usage</h2>
47
+
48
+
49
+ <pre>
50
+ &gt; a = ["1", "2", "3"]
51
+ &gt; a.map_by_to_i
52
+ =&gt; [1, 2, 3]
53
+ </pre>
54
+ Can be used with ActiveRecord associations (since 0.7.0)
55
+
56
+ <pre>&gt; company = Company.find_by_name "Dr Nic Academy"
57
+ &gt; company.employees.count
58
+ =&gt; 1
59
+ &gt; company.employees.map_by_name
60
+ =&gt; ["Dr Nic"]
61
+ </pre>
62
+
63
+ <p>Why use this?</p>
64
+
65
+
66
+ <p>I think its much easier to type and read than its two equivalents:</p>
67
+
68
+
69
+ <pre>&gt; company.employees.map { |employee| employee.name }
70
+ or
71
+ &gt; company.employees.map &#38;:name
72
+ </pre>
73
+
74
+ <h2>Related articles</h2>
75
+
76
+
77
+ <p><a href="http://drnicwilliams.com/category/ruby/map_by_method">A bunch of examples and releases</a></p>
78
+
79
+
80
+ <h2>Dr Nic&#8217;s Blog</h2>
81
+
82
+
83
+ <p><a href="http://drnicwilliams.com">http://drnicwilliams.com</a> &#8211; for future announcements and
84
+ other stories and things.</p>
85
+
86
+
87
+ <h2>Forum</h2>
88
+
89
+
90
+ <p>Discussion about the Map by Methods is on the Dr Nic Utilities forum:</p>
91
+
92
+
93
+ <p><a href="http://groups.google.com/group/drnicutilities">http://groups.google.com/group/drnicutilities</a></p>
94
+
95
+
96
+ <h2>Licence</h2>
97
+
98
+
99
+ <p>This code is free to use under the terms of the <span class="caps">MIT</span> licence.</p>
100
+
101
+
102
+ <h2>Contact</h2>
103
+
104
+
105
+ <p>Comments are welcome. Send an email to <a href="mailto:drnicwilliams@gmail.com">Dr Nic Williams</a> via the <a href="http://groups.google.com/group/drnicutilities">forum</a></p>
106
+ <p class="coda">
107
+ <a href="mailto:drnicwilliams@gmail.com">Dr Nic</a>, 11th August 2007<br>
108
+ Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
109
+ </p>
110
+ </div>
111
+
112
+ <script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
113
+ </script>
114
+ <script type="text/javascript">
115
+ _uacct = "UA-567811-2";
116
+ urchinTracker();
117
+ </script>
118
+
119
+ </body>
120
+ </html>
data/website/index.txt ADDED
@@ -0,0 +1,56 @@
1
+ h1. Map By Method
2
+
3
+ h1. <code>["1","2","3"]. map_by_to_i => [1,2,3]</code>
4
+
5
+ h2. Installation
6
+
7
+ <pre>gem install map_by_method</pre>
8
+
9
+ h2. Usage
10
+
11
+ <pre>
12
+ > a = ["1", "2", "3"]
13
+ > a.map_by_to_i
14
+ => [1, 2, 3]
15
+ </pre>
16
+ Can be used with ActiveRecord associations (since 0.7.0)
17
+
18
+ <pre>> company = Company.find_by_name "Dr Nic Academy"
19
+ > company.employees.count
20
+ => 1
21
+ > company.employees.map_by_name
22
+ => ["Dr Nic"]
23
+ </pre>
24
+
25
+ Why use this?
26
+
27
+ I think its much easier to type and read than its two equivalents:
28
+
29
+ <pre>> company.employees.map { |employee| employee.name }
30
+ or
31
+ > company.employees.map &:name
32
+ </pre>
33
+
34
+ h2. Related articles
35
+
36
+ "A bunch of examples and releases":http://drnicwilliams.com/category/ruby/map_by_method
37
+
38
+ h2. Dr Nic's Blog
39
+
40
+ "http://drnicwilliams.com":http://drnicwilliams.com - for future announcements and
41
+ other stories and things.
42
+
43
+ h2. Forum
44
+
45
+ Discussion about the Map by Methods is on the Dr Nic Utilities forum:
46
+
47
+ "http://groups.google.com/group/drnicutilities":http://groups.google.com/group/drnicutilities
48
+
49
+ h2. Licence
50
+
51
+ This code is free to use under the terms of the MIT licence.
52
+
53
+ h2. Contact
54
+
55
+ Comments are welcome. Send an email to "Dr Nic Williams":mailto:drnicwilliams@gmail.com via the "forum":http://groups.google.com/group/drnicutilities
56
+
@@ -0,0 +1,285 @@
1
+
2
+ /****************************************************************
3
+ * *
4
+ * curvyCorners *
5
+ * ------------ *
6
+ * *
7
+ * This script generates rounded corners for your divs. *
8
+ * *
9
+ * Version 1.2.9 *
10
+ * Copyright (c) 2006 Cameron Cooke *
11
+ * By: Cameron Cooke and Tim Hutchison. *
12
+ * *
13
+ * *
14
+ * Website: http://www.curvycorners.net *
15
+ * Email: info@totalinfinity.com *
16
+ * Forum: http://www.curvycorners.net/forum/ *
17
+ * *
18
+ * *
19
+ * This library is free software; you can redistribute *
20
+ * it and/or modify it under the terms of the GNU *
21
+ * Lesser General Public License as published by the *
22
+ * Free Software Foundation; either version 2.1 of the *
23
+ * License, or (at your option) any later version. *
24
+ * *
25
+ * This library is distributed in the hope that it will *
26
+ * be useful, but WITHOUT ANY WARRANTY; without even the *
27
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A *
28
+ * PARTICULAR PURPOSE. See the GNU Lesser General Public *
29
+ * License for more details. *
30
+ * *
31
+ * You should have received a copy of the GNU Lesser *
32
+ * General Public License along with this library; *
33
+ * Inc., 59 Temple Place, Suite 330, Boston, *
34
+ * MA 02111-1307 USA *
35
+ * *
36
+ ****************************************************************/
37
+
38
+ var isIE = navigator.userAgent.toLowerCase().indexOf("msie") > -1; var isMoz = document.implementation && document.implementation.createDocument; var isSafari = ((navigator.userAgent.toLowerCase().indexOf('safari')!=-1)&&(navigator.userAgent.toLowerCase().indexOf('mac')!=-1))?true:false; function curvyCorners()
39
+ { if(typeof(arguments[0]) != "object") throw newCurvyError("First parameter of curvyCorners() must be an object."); if(typeof(arguments[1]) != "object" && typeof(arguments[1]) != "string") throw newCurvyError("Second parameter of curvyCorners() must be an object or a class name."); if(typeof(arguments[1]) == "string")
40
+ { var startIndex = 0; var boxCol = getElementsByClass(arguments[1]);}
41
+ else
42
+ { var startIndex = 1; var boxCol = arguments;}
43
+ var curvyCornersCol = new Array(); if(arguments[0].validTags)
44
+ var validElements = arguments[0].validTags; else
45
+ var validElements = ["div"]; for(var i = startIndex, j = boxCol.length; i < j; i++)
46
+ { var currentTag = boxCol[i].tagName.toLowerCase(); if(inArray(validElements, currentTag) !== false)
47
+ { curvyCornersCol[curvyCornersCol.length] = new curvyObject(arguments[0], boxCol[i]);}
48
+ }
49
+ this.objects = curvyCornersCol; this.applyCornersToAll = function()
50
+ { for(var x = 0, k = this.objects.length; x < k; x++)
51
+ { this.objects[x].applyCorners();}
52
+ }
53
+ }
54
+ function curvyObject()
55
+ { this.box = arguments[1]; this.settings = arguments[0]; this.topContainer = null; this.bottomContainer = null; this.masterCorners = new Array(); this.contentDIV = null; var boxHeight = get_style(this.box, "height", "height"); var boxWidth = get_style(this.box, "width", "width"); var borderWidth = get_style(this.box, "borderTopWidth", "border-top-width"); var borderColour = get_style(this.box, "borderTopColor", "border-top-color"); var boxColour = get_style(this.box, "backgroundColor", "background-color"); var backgroundImage = get_style(this.box, "backgroundImage", "background-image"); var boxPosition = get_style(this.box, "position", "position"); var boxPadding = get_style(this.box, "paddingTop", "padding-top"); this.boxHeight = parseInt(((boxHeight != "" && boxHeight != "auto" && boxHeight.indexOf("%") == -1)? boxHeight.substring(0, boxHeight.indexOf("px")) : this.box.scrollHeight)); this.boxWidth = parseInt(((boxWidth != "" && boxWidth != "auto" && boxWidth.indexOf("%") == -1)? boxWidth.substring(0, boxWidth.indexOf("px")) : this.box.scrollWidth)); this.borderWidth = parseInt(((borderWidth != "" && borderWidth.indexOf("px") !== -1)? borderWidth.slice(0, borderWidth.indexOf("px")) : 0)); this.boxColour = format_colour(boxColour); this.boxPadding = parseInt(((boxPadding != "" && boxPadding.indexOf("px") !== -1)? boxPadding.slice(0, boxPadding.indexOf("px")) : 0)); this.borderColour = format_colour(borderColour); this.borderString = this.borderWidth + "px" + " solid " + this.borderColour; this.backgroundImage = ((backgroundImage != "none")? backgroundImage : ""); this.boxContent = this.box.innerHTML; if(boxPosition != "absolute") this.box.style.position = "relative"; this.box.style.padding = "0px"; if(isIE && boxWidth == "auto" && boxHeight == "auto") this.box.style.width = "100%"; if(this.settings.autoPad == true && this.boxPadding > 0)
56
+ this.box.innerHTML = ""; this.applyCorners = function()
57
+ { for(var t = 0; t < 2; t++)
58
+ { switch(t)
59
+ { case 0:
60
+ if(this.settings.tl || this.settings.tr)
61
+ { var newMainContainer = document.createElement("DIV"); newMainContainer.style.width = "100%"; newMainContainer.style.fontSize = "1px"; newMainContainer.style.overflow = "hidden"; newMainContainer.style.position = "absolute"; newMainContainer.style.paddingLeft = this.borderWidth + "px"; newMainContainer.style.paddingRight = this.borderWidth + "px"; var topMaxRadius = Math.max(this.settings.tl ? this.settings.tl.radius : 0, this.settings.tr ? this.settings.tr.radius : 0); newMainContainer.style.height = topMaxRadius + "px"; newMainContainer.style.top = 0 - topMaxRadius + "px"; newMainContainer.style.left = 0 - this.borderWidth + "px"; this.topContainer = this.box.appendChild(newMainContainer);}
62
+ break; case 1:
63
+ if(this.settings.bl || this.settings.br)
64
+ { var newMainContainer = document.createElement("DIV"); newMainContainer.style.width = "100%"; newMainContainer.style.fontSize = "1px"; newMainContainer.style.overflow = "hidden"; newMainContainer.style.position = "absolute"; newMainContainer.style.paddingLeft = this.borderWidth + "px"; newMainContainer.style.paddingRight = this.borderWidth + "px"; var botMaxRadius = Math.max(this.settings.bl ? this.settings.bl.radius : 0, this.settings.br ? this.settings.br.radius : 0); newMainContainer.style.height = botMaxRadius + "px"; newMainContainer.style.bottom = 0 - botMaxRadius + "px"; newMainContainer.style.left = 0 - this.borderWidth + "px"; this.bottomContainer = this.box.appendChild(newMainContainer);}
65
+ break;}
66
+ }
67
+ if(this.topContainer) this.box.style.borderTopWidth = "0px"; if(this.bottomContainer) this.box.style.borderBottomWidth = "0px"; var corners = ["tr", "tl", "br", "bl"]; for(var i in corners)
68
+ { if(i > -1 < 4)
69
+ { var cc = corners[i]; if(!this.settings[cc])
70
+ { if(((cc == "tr" || cc == "tl") && this.topContainer != null) || ((cc == "br" || cc == "bl") && this.bottomContainer != null))
71
+ { var newCorner = document.createElement("DIV"); newCorner.style.position = "relative"; newCorner.style.fontSize = "1px"; newCorner.style.overflow = "hidden"; if(this.backgroundImage == "")
72
+ newCorner.style.backgroundColor = this.boxColour; else
73
+ newCorner.style.backgroundImage = this.backgroundImage; switch(cc)
74
+ { case "tl":
75
+ newCorner.style.height = topMaxRadius - this.borderWidth + "px"; newCorner.style.marginRight = this.settings.tr.radius - (this.borderWidth*2) + "px"; newCorner.style.borderLeft = this.borderString; newCorner.style.borderTop = this.borderString; newCorner.style.left = -this.borderWidth + "px"; break; case "tr":
76
+ newCorner.style.height = topMaxRadius - this.borderWidth + "px"; newCorner.style.marginLeft = this.settings.tl.radius - (this.borderWidth*2) + "px"; newCorner.style.borderRight = this.borderString; newCorner.style.borderTop = this.borderString; newCorner.style.backgroundPosition = "-" + (topMaxRadius + this.borderWidth) + "px 0px"; newCorner.style.left = this.borderWidth + "px"; break; case "bl":
77
+ newCorner.style.height = botMaxRadius - this.borderWidth + "px"; newCorner.style.marginRight = this.settings.br.radius - (this.borderWidth*2) + "px"; newCorner.style.borderLeft = this.borderString; newCorner.style.borderBottom = this.borderString; newCorner.style.left = -this.borderWidth + "px"; newCorner.style.backgroundPosition = "-" + (this.borderWidth) + "px -" + (this.boxHeight + (botMaxRadius + this.borderWidth)) + "px"; break; case "br":
78
+ newCorner.style.height = botMaxRadius - this.borderWidth + "px"; newCorner.style.marginLeft = this.settings.bl.radius - (this.borderWidth*2) + "px"; newCorner.style.borderRight = this.borderString; newCorner.style.borderBottom = this.borderString; newCorner.style.left = this.borderWidth + "px"
79
+ newCorner.style.backgroundPosition = "-" + (botMaxRadius + this.borderWidth) + "px -" + (this.boxHeight + (botMaxRadius + this.borderWidth)) + "px"; break;}
80
+ }
81
+ }
82
+ else
83
+ { if(this.masterCorners[this.settings[cc].radius])
84
+ { var newCorner = this.masterCorners[this.settings[cc].radius].cloneNode(true);}
85
+ else
86
+ { var newCorner = document.createElement("DIV"); newCorner.style.height = this.settings[cc].radius + "px"; newCorner.style.width = this.settings[cc].radius + "px"; newCorner.style.position = "absolute"; newCorner.style.fontSize = "1px"; newCorner.style.overflow = "hidden"; var borderRadius = parseInt(this.settings[cc].radius - this.borderWidth); for(var intx = 0, j = this.settings[cc].radius; intx < j; intx++)
87
+ { if((intx +1) >= borderRadius)
88
+ var y1 = -1; else
89
+ var y1 = (Math.floor(Math.sqrt(Math.pow(borderRadius, 2) - Math.pow((intx+1), 2))) - 1); if(borderRadius != j)
90
+ { if((intx) >= borderRadius)
91
+ var y2 = -1; else
92
+ var y2 = Math.ceil(Math.sqrt(Math.pow(borderRadius,2) - Math.pow(intx, 2))); if((intx+1) >= j)
93
+ var y3 = -1; else
94
+ var y3 = (Math.floor(Math.sqrt(Math.pow(j ,2) - Math.pow((intx+1), 2))) - 1);}
95
+ if((intx) >= j)
96
+ var y4 = -1; else
97
+ var y4 = Math.ceil(Math.sqrt(Math.pow(j ,2) - Math.pow(intx, 2))); if(y1 > -1) this.drawPixel(intx, 0, this.boxColour, 100, (y1+1), newCorner, -1, this.settings[cc].radius); if(borderRadius != j)
98
+ { for(var inty = (y1 + 1); inty < y2; inty++)
99
+ { if(this.settings.antiAlias)
100
+ { if(this.backgroundImage != "")
101
+ { var borderFract = (pixelFraction(intx, inty, borderRadius) * 100); if(borderFract < 30)
102
+ { this.drawPixel(intx, inty, this.borderColour, 100, 1, newCorner, 0, this.settings[cc].radius);}
103
+ else
104
+ { this.drawPixel(intx, inty, this.borderColour, 100, 1, newCorner, -1, this.settings[cc].radius);}
105
+ }
106
+ else
107
+ { var pixelcolour = BlendColour(this.boxColour, this.borderColour, pixelFraction(intx, inty, borderRadius)); this.drawPixel(intx, inty, pixelcolour, 100, 1, newCorner, 0, this.settings[cc].radius, cc);}
108
+ }
109
+ }
110
+ if(this.settings.antiAlias)
111
+ { if(y3 >= y2)
112
+ { if (y2 == -1) y2 = 0; this.drawPixel(intx, y2, this.borderColour, 100, (y3 - y2 + 1), newCorner, 0, 0);}
113
+ }
114
+ else
115
+ { if(y3 >= y1)
116
+ { this.drawPixel(intx, (y1 + 1), this.borderColour, 100, (y3 - y1), newCorner, 0, 0);}
117
+ }
118
+ var outsideColour = this.borderColour;}
119
+ else
120
+ { var outsideColour = this.boxColour; var y3 = y1;}
121
+ if(this.settings.antiAlias)
122
+ { for(var inty = (y3 + 1); inty < y4; inty++)
123
+ { this.drawPixel(intx, inty, outsideColour, (pixelFraction(intx, inty , j) * 100), 1, newCorner, ((this.borderWidth > 0)? 0 : -1), this.settings[cc].radius);}
124
+ }
125
+ }
126
+ this.masterCorners[this.settings[cc].radius] = newCorner.cloneNode(true);}
127
+ if(cc != "br")
128
+ { for(var t = 0, k = newCorner.childNodes.length; t < k; t++)
129
+ { var pixelBar = newCorner.childNodes[t]; var pixelBarTop = parseInt(pixelBar.style.top.substring(0, pixelBar.style.top.indexOf("px"))); var pixelBarLeft = parseInt(pixelBar.style.left.substring(0, pixelBar.style.left.indexOf("px"))); var pixelBarHeight = parseInt(pixelBar.style.height.substring(0, pixelBar.style.height.indexOf("px"))); if(cc == "tl" || cc == "bl"){ pixelBar.style.left = this.settings[cc].radius -pixelBarLeft -1 + "px";}
130
+ if(cc == "tr" || cc == "tl"){ pixelBar.style.top = this.settings[cc].radius -pixelBarHeight -pixelBarTop + "px";}
131
+ switch(cc)
132
+ { case "tr":
133
+ pixelBar.style.backgroundPosition = "-" + Math.abs((this.boxWidth - this.settings[cc].radius + this.borderWidth) + pixelBarLeft) + "px -" + Math.abs(this.settings[cc].radius -pixelBarHeight -pixelBarTop - this.borderWidth) + "px"; break; case "tl":
134
+ pixelBar.style.backgroundPosition = "-" + Math.abs((this.settings[cc].radius -pixelBarLeft -1) - this.borderWidth) + "px -" + Math.abs(this.settings[cc].radius -pixelBarHeight -pixelBarTop - this.borderWidth) + "px"; break; case "bl":
135
+ pixelBar.style.backgroundPosition = "-" + Math.abs((this.settings[cc].radius -pixelBarLeft -1) - this.borderWidth) + "px -" + Math.abs((this.boxHeight + this.settings[cc].radius + pixelBarTop) -this.borderWidth) + "px"; break;}
136
+ }
137
+ }
138
+ }
139
+ if(newCorner)
140
+ { switch(cc)
141
+ { case "tl":
142
+ if(newCorner.style.position == "absolute") newCorner.style.top = "0px"; if(newCorner.style.position == "absolute") newCorner.style.left = "0px"; if(this.topContainer) this.topContainer.appendChild(newCorner); break; case "tr":
143
+ if(newCorner.style.position == "absolute") newCorner.style.top = "0px"; if(newCorner.style.position == "absolute") newCorner.style.right = "0px"; if(this.topContainer) this.topContainer.appendChild(newCorner); break; case "bl":
144
+ if(newCorner.style.position == "absolute") newCorner.style.bottom = "0px"; if(newCorner.style.position == "absolute") newCorner.style.left = "0px"; if(this.bottomContainer) this.bottomContainer.appendChild(newCorner); break; case "br":
145
+ if(newCorner.style.position == "absolute") newCorner.style.bottom = "0px"; if(newCorner.style.position == "absolute") newCorner.style.right = "0px"; if(this.bottomContainer) this.bottomContainer.appendChild(newCorner); break;}
146
+ }
147
+ }
148
+ }
149
+ var radiusDiff = new Array(); radiusDiff["t"] = Math.abs(this.settings.tl.radius - this.settings.tr.radius)
150
+ radiusDiff["b"] = Math.abs(this.settings.bl.radius - this.settings.br.radius); for(z in radiusDiff)
151
+ { if(z == "t" || z == "b")
152
+ { if(radiusDiff[z])
153
+ { var smallerCornerType = ((this.settings[z + "l"].radius < this.settings[z + "r"].radius)? z +"l" : z +"r"); var newFiller = document.createElement("DIV"); newFiller.style.height = radiusDiff[z] + "px"; newFiller.style.width = this.settings[smallerCornerType].radius+ "px"
154
+ newFiller.style.position = "absolute"; newFiller.style.fontSize = "1px"; newFiller.style.overflow = "hidden"; newFiller.style.backgroundColor = this.boxColour; switch(smallerCornerType)
155
+ { case "tl":
156
+ newFiller.style.bottom = "0px"; newFiller.style.left = "0px"; newFiller.style.borderLeft = this.borderString; this.topContainer.appendChild(newFiller); break; case "tr":
157
+ newFiller.style.bottom = "0px"; newFiller.style.right = "0px"; newFiller.style.borderRight = this.borderString; this.topContainer.appendChild(newFiller); break; case "bl":
158
+ newFiller.style.top = "0px"; newFiller.style.left = "0px"; newFiller.style.borderLeft = this.borderString; this.bottomContainer.appendChild(newFiller); break; case "br":
159
+ newFiller.style.top = "0px"; newFiller.style.right = "0px"; newFiller.style.borderRight = this.borderString; this.bottomContainer.appendChild(newFiller); break;}
160
+ }
161
+ var newFillerBar = document.createElement("DIV"); newFillerBar.style.position = "relative"; newFillerBar.style.fontSize = "1px"; newFillerBar.style.overflow = "hidden"; newFillerBar.style.backgroundColor = this.boxColour; newFillerBar.style.backgroundImage = this.backgroundImage; switch(z)
162
+ { case "t":
163
+ if(this.topContainer)
164
+ { if(this.settings.tl.radius && this.settings.tr.radius)
165
+ { newFillerBar.style.height = topMaxRadius - this.borderWidth + "px"; newFillerBar.style.marginLeft = this.settings.tl.radius - this.borderWidth + "px"; newFillerBar.style.marginRight = this.settings.tr.radius - this.borderWidth + "px"; newFillerBar.style.borderTop = this.borderString; if(this.backgroundImage != "")
166
+ newFillerBar.style.backgroundPosition = "-" + (topMaxRadius + this.borderWidth) + "px 0px"; this.topContainer.appendChild(newFillerBar);}
167
+ this.box.style.backgroundPosition = "0px -" + (topMaxRadius - this.borderWidth) + "px";}
168
+ break; case "b":
169
+ if(this.bottomContainer)
170
+ { if(this.settings.bl.radius && this.settings.br.radius)
171
+ { newFillerBar.style.height = botMaxRadius - this.borderWidth + "px"; newFillerBar.style.marginLeft = this.settings.bl.radius - this.borderWidth + "px"; newFillerBar.style.marginRight = this.settings.br.radius - this.borderWidth + "px"; newFillerBar.style.borderBottom = this.borderString; if(this.backgroundImage != "")
172
+ newFillerBar.style.backgroundPosition = "-" + (botMaxRadius + this.borderWidth) + "px -" + (this.boxHeight + (topMaxRadius + this.borderWidth)) + "px"; this.bottomContainer.appendChild(newFillerBar);}
173
+ }
174
+ break;}
175
+ }
176
+ }
177
+ if(this.settings.autoPad == true && this.boxPadding > 0)
178
+ { var contentContainer = document.createElement("DIV"); contentContainer.style.position = "relative"; contentContainer.innerHTML = this.boxContent; contentContainer.className = "autoPadDiv"; var topPadding = Math.abs(topMaxRadius - this.boxPadding); var botPadding = Math.abs(botMaxRadius - this.boxPadding); if(topMaxRadius < this.boxPadding)
179
+ contentContainer.style.paddingTop = topPadding + "px"; if(botMaxRadius < this.boxPadding)
180
+ contentContainer.style.paddingBottom = botMaxRadius + "px"; contentContainer.style.paddingLeft = this.boxPadding + "px"; contentContainer.style.paddingRight = this.boxPadding + "px"; this.contentDIV = this.box.appendChild(contentContainer);}
181
+ }
182
+ this.drawPixel = function(intx, inty, colour, transAmount, height, newCorner, image, cornerRadius)
183
+ { var pixel = document.createElement("DIV"); pixel.style.height = height + "px"; pixel.style.width = "1px"; pixel.style.position = "absolute"; pixel.style.fontSize = "1px"; pixel.style.overflow = "hidden"; var topMaxRadius = Math.max(this.settings["tr"].radius, this.settings["tl"].radius); if(image == -1 && this.backgroundImage != "")
184
+ { pixel.style.backgroundImage = this.backgroundImage; pixel.style.backgroundPosition = "-" + (this.boxWidth - (cornerRadius - intx) + this.borderWidth) + "px -" + ((this.boxHeight + topMaxRadius + inty) -this.borderWidth) + "px";}
185
+ else
186
+ { pixel.style.backgroundColor = colour;}
187
+ if (transAmount != 100)
188
+ setOpacity(pixel, transAmount); pixel.style.top = inty + "px"; pixel.style.left = intx + "px"; newCorner.appendChild(pixel);}
189
+ }
190
+ function insertAfter(parent, node, referenceNode)
191
+ { parent.insertBefore(node, referenceNode.nextSibling);}
192
+ function BlendColour(Col1, Col2, Col1Fraction)
193
+ { var red1 = parseInt(Col1.substr(1,2),16); var green1 = parseInt(Col1.substr(3,2),16); var blue1 = parseInt(Col1.substr(5,2),16); var red2 = parseInt(Col2.substr(1,2),16); var green2 = parseInt(Col2.substr(3,2),16); var blue2 = parseInt(Col2.substr(5,2),16); if(Col1Fraction > 1 || Col1Fraction < 0) Col1Fraction = 1; var endRed = Math.round((red1 * Col1Fraction) + (red2 * (1 - Col1Fraction))); if(endRed > 255) endRed = 255; if(endRed < 0) endRed = 0; var endGreen = Math.round((green1 * Col1Fraction) + (green2 * (1 - Col1Fraction))); if(endGreen > 255) endGreen = 255; if(endGreen < 0) endGreen = 0; var endBlue = Math.round((blue1 * Col1Fraction) + (blue2 * (1 - Col1Fraction))); if(endBlue > 255) endBlue = 255; if(endBlue < 0) endBlue = 0; return "#" + IntToHex(endRed)+ IntToHex(endGreen)+ IntToHex(endBlue);}
194
+ function IntToHex(strNum)
195
+ { base = strNum / 16; rem = strNum % 16; base = base - (rem / 16); baseS = MakeHex(base); remS = MakeHex(rem); return baseS + '' + remS;}
196
+ function MakeHex(x)
197
+ { if((x >= 0) && (x <= 9))
198
+ { return x;}
199
+ else
200
+ { switch(x)
201
+ { case 10: return "A"; case 11: return "B"; case 12: return "C"; case 13: return "D"; case 14: return "E"; case 15: return "F";}
202
+ }
203
+ }
204
+ function pixelFraction(x, y, r)
205
+ { var pixelfraction = 0; var xvalues = new Array(1); var yvalues = new Array(1); var point = 0; var whatsides = ""; var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(x,2))); if ((intersect >= y) && (intersect < (y+1)))
206
+ { whatsides = "Left"; xvalues[point] = 0; yvalues[point] = intersect - y; point = point + 1;}
207
+ var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(y+1,2))); if ((intersect >= x) && (intersect < (x+1)))
208
+ { whatsides = whatsides + "Top"; xvalues[point] = intersect - x; yvalues[point] = 1; point = point + 1;}
209
+ var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(x+1,2))); if ((intersect >= y) && (intersect < (y+1)))
210
+ { whatsides = whatsides + "Right"; xvalues[point] = 1; yvalues[point] = intersect - y; point = point + 1;}
211
+ var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(y,2))); if ((intersect >= x) && (intersect < (x+1)))
212
+ { whatsides = whatsides + "Bottom"; xvalues[point] = intersect - x; yvalues[point] = 0;}
213
+ switch (whatsides)
214
+ { case "LeftRight":
215
+ pixelfraction = Math.min(yvalues[0],yvalues[1]) + ((Math.max(yvalues[0],yvalues[1]) - Math.min(yvalues[0],yvalues[1]))/2); break; case "TopRight":
216
+ pixelfraction = 1-(((1-xvalues[0])*(1-yvalues[1]))/2); break; case "TopBottom":
217
+ pixelfraction = Math.min(xvalues[0],xvalues[1]) + ((Math.max(xvalues[0],xvalues[1]) - Math.min(xvalues[0],xvalues[1]))/2); break; case "LeftBottom":
218
+ pixelfraction = (yvalues[0]*xvalues[1])/2; break; default:
219
+ pixelfraction = 1;}
220
+ return pixelfraction;}
221
+ function rgb2Hex(rgbColour)
222
+ { try{ var rgbArray = rgb2Array(rgbColour); var red = parseInt(rgbArray[0]); var green = parseInt(rgbArray[1]); var blue = parseInt(rgbArray[2]); var hexColour = "#" + IntToHex(red) + IntToHex(green) + IntToHex(blue);}
223
+ catch(e){ alert("There was an error converting the RGB value to Hexadecimal in function rgb2Hex");}
224
+ return hexColour;}
225
+ function rgb2Array(rgbColour)
226
+ { var rgbValues = rgbColour.substring(4, rgbColour.indexOf(")")); var rgbArray = rgbValues.split(", "); return rgbArray;}
227
+ function setOpacity(obj, opacity)
228
+ { opacity = (opacity == 100)?99.999:opacity; if(isSafari && obj.tagName != "IFRAME")
229
+ { var rgbArray = rgb2Array(obj.style.backgroundColor); var red = parseInt(rgbArray[0]); var green = parseInt(rgbArray[1]); var blue = parseInt(rgbArray[2]); obj.style.backgroundColor = "rgba(" + red + ", " + green + ", " + blue + ", " + opacity/100 + ")";}
230
+ else if(typeof(obj.style.opacity) != "undefined")
231
+ { obj.style.opacity = opacity/100;}
232
+ else if(typeof(obj.style.MozOpacity) != "undefined")
233
+ { obj.style.MozOpacity = opacity/100;}
234
+ else if(typeof(obj.style.filter) != "undefined")
235
+ { obj.style.filter = "alpha(opacity:" + opacity + ")";}
236
+ else if(typeof(obj.style.KHTMLOpacity) != "undefined")
237
+ { obj.style.KHTMLOpacity = opacity/100;}
238
+ }
239
+ function inArray(array, value)
240
+ { for(var i = 0; i < array.length; i++){ if (array[i] === value) return i;}
241
+ return false;}
242
+ function inArrayKey(array, value)
243
+ { for(key in array){ if(key === value) return true;}
244
+ return false;}
245
+ function addEvent(elm, evType, fn, useCapture) { if (elm.addEventListener) { elm.addEventListener(evType, fn, useCapture); return true;}
246
+ else if (elm.attachEvent) { var r = elm.attachEvent('on' + evType, fn); return r;}
247
+ else { elm['on' + evType] = fn;}
248
+ }
249
+ function removeEvent(obj, evType, fn, useCapture){ if (obj.removeEventListener){ obj.removeEventListener(evType, fn, useCapture); return true;} else if (obj.detachEvent){ var r = obj.detachEvent("on"+evType, fn); return r;} else { alert("Handler could not be removed");}
250
+ }
251
+ function format_colour(colour)
252
+ { var returnColour = "#ffffff"; if(colour != "" && colour != "transparent")
253
+ { if(colour.substr(0, 3) == "rgb")
254
+ { returnColour = rgb2Hex(colour);}
255
+ else if(colour.length == 4)
256
+ { returnColour = "#" + colour.substring(1, 2) + colour.substring(1, 2) + colour.substring(2, 3) + colour.substring(2, 3) + colour.substring(3, 4) + colour.substring(3, 4);}
257
+ else
258
+ { returnColour = colour;}
259
+ }
260
+ return returnColour;}
261
+ function get_style(obj, property, propertyNS)
262
+ { try
263
+ { if(obj.currentStyle)
264
+ { var returnVal = eval("obj.currentStyle." + property);}
265
+ else
266
+ { if(isSafari && obj.style.display == "none")
267
+ { obj.style.display = ""; var wasHidden = true;}
268
+ var returnVal = document.defaultView.getComputedStyle(obj, '').getPropertyValue(propertyNS); if(isSafari && wasHidden)
269
+ { obj.style.display = "none";}
270
+ }
271
+ }
272
+ catch(e)
273
+ { }
274
+ return returnVal;}
275
+ function getElementsByClass(searchClass, node, tag)
276
+ { var classElements = new Array(); if(node == null)
277
+ node = document; if(tag == null)
278
+ tag = '*'; var els = node.getElementsByTagName(tag); var elsLen = els.length; var pattern = new RegExp("(^|\s)"+searchClass+"(\s|$)"); for (i = 0, j = 0; i < elsLen; i++)
279
+ { if(pattern.test(els[i].className))
280
+ { classElements[j] = els[i]; j++;}
281
+ }
282
+ return classElements;}
283
+ function newCurvyError(errorMessage)
284
+ { return new Error("curvyCorners Error:\n" + errorMessage)
285
+ }
@@ -0,0 +1,138 @@
1
+ body {
2
+ background-color: #4D2E67;
3
+ font-family: "Georgia", sans-serif;
4
+ font-size: 16px;
5
+ line-height: 1.6em;
6
+ padding: 1.6em 0 0 0;
7
+ color: #eee;
8
+ }
9
+ h1, h2, h3, h4, h5, h6 {
10
+ color: #A79712;
11
+ }
12
+ h1 {
13
+ font-family: sans-serif;
14
+ font-weight: normal;
15
+ font-size: 4em;
16
+ line-height: 0.8em;
17
+ letter-spacing: -0.1ex;
18
+ margin: 5px;
19
+ color: #FFEDFA;
20
+ }
21
+ h1.primary {
22
+ color: #A79712;
23
+ }
24
+
25
+ li {
26
+ padding: 0;
27
+ margin: 0;
28
+ list-style-type: square;
29
+ }
30
+ a {
31
+ color: #A79712;
32
+ font-weight: normal;
33
+ text-decoration: underline;
34
+ }
35
+ blockquote {
36
+ font-size: 90%;
37
+ font-style: italic;
38
+ border-left: 1px solid #eee;
39
+ padding-left: 1em;
40
+ }
41
+ .caps {
42
+ font-size: 80%;
43
+ }
44
+
45
+ strong {
46
+ background-color: #D09FDC;
47
+ color: #1B1B1A;
48
+ font-weight: normal;
49
+ }
50
+
51
+ #main {
52
+ width: 45em;
53
+ padding: 0;
54
+ margin: 0 auto;
55
+ }
56
+ .coda {
57
+ text-align: right;
58
+ color: #77f;
59
+ font-size: smaller;
60
+ }
61
+
62
+ table {
63
+ font-size: 90%;
64
+ line-height: 1.4em;
65
+ color: #ff8;
66
+ background-color: #111;
67
+ padding: 2px 10px 2px 10px;
68
+ border-style: dashed;
69
+ }
70
+
71
+ th {
72
+ color: #fff;
73
+ }
74
+
75
+ td {
76
+ padding: 2px 10px 2px 10px;
77
+ }
78
+
79
+ .success {
80
+ color: #0CC52B;
81
+ }
82
+
83
+ .failed {
84
+ color: #E90A1B;
85
+ }
86
+
87
+ .unknown {
88
+ color: #995000;
89
+ }
90
+ pre, code {
91
+ font-family: monospace;
92
+ font-size: 90%;
93
+ line-height: 1.4em;
94
+ color: #ff8;
95
+ background-color: #111;
96
+ padding: 2px 10px 2px 10px;
97
+ }
98
+ .comment { color: #aaa; font-style: italic; }
99
+ .keyword { color: #eff; font-weight: bold; }
100
+ .punct { color: #eee; font-weight: bold; }
101
+ .symbol { color: #0bb; }
102
+ .string { color: #6b4; }
103
+ .ident { color: #ff8; }
104
+ .constant { color: #66f; }
105
+ .regex { color: #ec6; }
106
+ .number { color: #F99; }
107
+ .expr { color: #227; }
108
+
109
+ #version {
110
+ float: right;
111
+ text-align: right;
112
+ font-family: sans-serif;
113
+ font-weight: normal;
114
+ color: #FFEDFA;
115
+ background-color: #A79712;
116
+ padding: 15px 20px 10px 20px;
117
+ margin: 0 auto;
118
+ margin-top: 15px;
119
+ border: 3px solid #FFEDFA;
120
+ }
121
+
122
+ #version .numbers {
123
+ display: block;
124
+ font-size: 4em;
125
+ line-height: 0.8em;
126
+ letter-spacing: -0.1ex;
127
+ }
128
+
129
+ #version a {
130
+ text-decoration: none;
131
+ color: #FFEDFA;
132
+ }
133
+
134
+ .clickable {
135
+ cursor: pointer;
136
+ cursor: hand;
137
+ }
138
+
@@ -0,0 +1,53 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <link rel="stylesheet" href="stylesheets/screen.css" type="text/css" media="screen" />
6
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7
+ <title>
8
+ <%= title %>
9
+ </title>
10
+ <script src="javascripts/rounded_corners_lite.inc.js" type="text/javascript"></script>
11
+ <style>
12
+
13
+ </style>
14
+ <script type="text/javascript">
15
+ window.onload = function() {
16
+ settings = {
17
+ tl: { radius: 10 },
18
+ tr: { radius: 10 },
19
+ bl: { radius: 10 },
20
+ br: { radius: 10 },
21
+ antiAlias: true,
22
+ autoPad: true,
23
+ validTags: ["div"]
24
+ }
25
+ var versionBox = new curvyCorners(settings, document.getElementById("version"));
26
+ versionBox.applyCornersToAll();
27
+ }
28
+ </script>
29
+ </head>
30
+ <body>
31
+ <div id="main">
32
+ <p><a href="/">&#x21A9; More Dr Nic Utilities</a></p>
33
+ <h1 class=primary><%= title %></h1>
34
+ <div id="version" class="clickable" onclick='document.location = "<%= download %>"; return false'>
35
+ Get Version
36
+ <a href="<%= download %>" class="numbers"><%= version %></a>
37
+ </div>
38
+ <%= body %>
39
+ <p class="coda">
40
+ <a href="mailto:drnicwilliams@gmail.com">Dr Nic</a>, <%= modified.pretty %><br>
41
+ Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
42
+ </p>
43
+ </div>
44
+
45
+ <script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
46
+ </script>
47
+ <script type="text/javascript">
48
+ _uacct = "UA-567811-2";
49
+ urchinTracker();
50
+ </script>
51
+
52
+ </body>
53
+ </html>
metadata CHANGED
@@ -1,18 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.8.11
2
+ rubygems_version: 0.9.4.3
3
3
  specification_version: 1
4
4
  name: map_by_method
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.6.0
7
- date: 2006-12-21 00:00:00 +11:00
8
- summary: Replacement for Symbol.to_proc which is much cleaner and prettier
6
+ version: 0.7.0
7
+ date: 2007-08-12 00:00:00 +02:00
8
+ summary: Replacement for map {|obj| obj.action} and Symbol.to_proc which is much cleaner and prettier NOW WORKS with ActiveRecord Associations!!
9
9
  require_paths:
10
10
  - lib
11
11
  email: drnicwilliams@gmail.com
12
12
  homepage: http://drnicutilities.rubyforge.org
13
13
  rubyforge_project: drnicutilities
14
- description: Replacement for Symbol.to_proc which is much cleaner and prettier
15
- autorequire: map_by_method
14
+ description: Replacement for map {|obj| obj.action} and Symbol.to_proc which is much cleaner and prettier NOW WORKS with ActiveRecord Associations!!
15
+ autorequire:
16
16
  default_executable:
17
17
  bindir: bin
18
18
  has_rdoc: true
@@ -25,36 +25,40 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
25
25
  platform: ruby
26
26
  signing_key:
27
27
  cert_chain:
28
+ post_install_message:
28
29
  authors:
29
30
  - Dr Nic Williams
30
31
  files:
31
- - README
32
- - CHANGELOG
32
+ - History.txt
33
+ - Manifest.txt
34
+ - README.txt
33
35
  - Rakefile
34
- - test/all_tests.rb
35
- - test/test_helper.rb
36
- - test/map_by_method_test.rb
37
- - test/multiple_methods_test.rb
36
+ - install.rb
38
37
  - lib/map_by_method.rb
39
- - lib/map_by_method
40
38
  - lib/map_by_method/version.rb
41
- test_files: []
42
-
39
+ - scripts/txt2html
40
+ - test/test_ar_association_proxy.rb
41
+ - test/test_helper.rb
42
+ - test/test_map_by_method.rb
43
+ - test/test_multiple_methods.rb
44
+ - website/index.html
45
+ - website/index.txt
46
+ - website/javascripts/rounded_corners_lite.inc.js
47
+ - website/stylesheets/screen.css
48
+ - website/template.rhtml
49
+ test_files:
50
+ - test/test_ar_association_proxy.rb
51
+ - test/test_helper.rb
52
+ - test/test_map_by_method.rb
53
+ - test/test_multiple_methods.rb
43
54
  rdoc_options:
44
- - --quiet
45
- - --title
46
- - map_by_method documentation
47
- - --opname
48
- - index.html
49
- - --line-numbers
50
55
  - --main
51
- - README
52
- - --inline-source
53
- - --exclude
54
- - ^(examples|extras)/
56
+ - README.txt
55
57
  extra_rdoc_files:
56
- - README
57
- - CHANGELOG
58
+ - History.txt
59
+ - Manifest.txt
60
+ - README.txt
61
+ - website/index.txt
58
62
  executables: []
59
63
 
60
64
  extensions: []
data/CHANGELOG DELETED
@@ -1,4 +0,0 @@
1
- 0.6
2
- Removed explicit singularize method.
3
- Instead, singularize option only supported if another gem (e.g. activesupport)
4
- provides a singularize method for strings.
data/README DELETED
@@ -1,3 +0,0 @@
1
- README for map_by_method
2
- ========================
3
-
data/test/all_tests.rb DELETED
@@ -1 +0,0 @@
1
- Dir['**/*_test.rb'].each { |test_case| require test_case }