map_by_method 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
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 }