Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Initial import

  • Loading branch information...
commit cf71d27b6bfdd2684e12271947a51aa0432d8337 0 parents
@stympy authored
4 History.txt
@@ -0,0 +1,4 @@
+== 0.1.0 2007-11-15
+
+* 1 major enhancement:
+ * Initial release
20 License.txt
@@ -0,0 +1,20 @@
+Copyright (c) 2007 Benjamin Curtis
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 Manifest.txt
@@ -0,0 +1,24 @@
+History.txt
+License.txt
+Manifest.txt
+README.txt
+Rakefile
+config/hoe.rb
+config/requirements.rb
+lib/faker.rb
+lib/faker/version.rb
+log/debug.log
+script/destroy
+script/generate
+script/txt2html
+setup.rb
+tasks/deployment.rake
+tasks/environment.rake
+tasks/website.rake
+test/test_faker.rb
+test/test_helper.rb
+website/index.html
+website/index.txt
+website/javascripts/rounded_corners_lite.inc.js
+website/stylesheets/screen.css
+website/template.rhtml
16 README.txt
@@ -0,0 +1,16 @@
+Faker
+=====
+
+A port of Perl's Data::Faker library that generates fake data.
+
+Current generators:
+* Names: Full (default), first, and last
+* Phone numbers
+
+Usage
+=====
+> Faker::Name
+=> Christophe Bartell
+
+> Faker::Name.first
+=>
4 Rakefile
@@ -0,0 +1,4 @@
+require 'config/requirements'
+require 'config/hoe' # setup Hoe + all gem configuration
+
+Dir['tasks/**/*.rake'].each { |rake| load rake }
71 config/hoe.rb
@@ -0,0 +1,71 @@
+require 'faker/version'
+
+AUTHOR = 'Benjamin Curtis' # can also be an array of Authors
+EMAIL = "benjamin.curtis@gmail.com"
+DESCRIPTION = "A port of Perl's Data::Faker - Generates fake names, phone numbers, etc."
+GEM_NAME = 'faker' # what ppl will type to install your gem
+RUBYFORGE_PROJECT = 'faker' # The unix name for your project
+HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
+DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
+
+@config_file = "~/.rubyforge/user-config.yml"
+@config = nil
+RUBYFORGE_USERNAME = "unknown"
+def rubyforge_username
+ unless @config
+ begin
+ @config = YAML.load(File.read(File.expand_path(@config_file)))
+ rescue
+ puts <<-EOS
+ERROR: No rubyforge config file found: #{@config_file}
+Run 'rubyforge setup' to prepare your env for access to Rubyforge
+ - See http://newgem.rubyforge.org/rubyforge.html for more details
+ EOS
+ exit
+ end
+ end
+ RUBYFORGE_USERNAME.replace @config["username"]
+end
+
+
+REV = nil
+# UNCOMMENT IF REQUIRED:
+# REV = `svn info`.each {|line| if line =~ /^Revision:/ then k,v = line.split(': '); break v.chomp; else next; end} rescue nil
+VERS = Faker::VERSION::STRING + (REV ? ".#{REV}" : "")
+RDOC_OPTS = ['--quiet', '--title', 'faker documentation',
+ "--opname", "index.html",
+ "--line-numbers",
+ "--main", "README",
+ "--inline-source"]
+
+class Hoe
+ def extra_deps
+ @extra_deps.reject! { |x| Array(x).first == 'hoe' }
+ @extra_deps
+ end
+end
+
+# Generate all the Rake tasks
+# Run 'rake -T' to see list of generated tasks (from gem root directory)
+hoe = Hoe.new(GEM_NAME, VERS) do |p|
+ p.author = AUTHOR
+ p.description = DESCRIPTION
+ p.email = EMAIL
+ p.summary = DESCRIPTION
+ p.url = HOMEPATH
+ p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
+ p.test_globs = ["test/**/test_*.rb"]
+ p.clean_globs |= ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store'] #An array of file patterns to delete on clean.
+
+ # == Optional
+ p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
+ #p.extra_deps = [] # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
+
+ #p.spec_extras = {} # A hash of extra values to set in the gemspec.
+
+end
+
+CHANGES = hoe.paragraphs_of('History.txt', 0..1).join("\\n\\n")
+PATH = (RUBYFORGE_PROJECT == GEM_NAME) ? RUBYFORGE_PROJECT : "#{RUBYFORGE_PROJECT}/#{GEM_NAME}"
+hoe.remote_rdoc_dir = File.join(PATH.gsub(/^#{RUBYFORGE_PROJECT}\/?/,''), 'rdoc')
+hoe.rsync_args = '-av --delete --ignore-errors'
17 config/requirements.rb
@@ -0,0 +1,17 @@
+require 'fileutils'
+include FileUtils
+
+require 'rubygems'
+%w[rake hoe newgem rubigen].each do |req_gem|
+ begin
+ require req_gem
+ rescue LoadError
+ puts "This Rakefile requires the '#{req_gem}' RubyGem."
+ puts "Installation: gem install #{req_gem} -y"
+ exit
+ end
+end
+
+$:.unshift(File.join(File.dirname(__FILE__), %w[.. lib]))
+
+require 'faker'
6 lib/extensions/array.rb
@@ -0,0 +1,6 @@
+# Thank you facets!
+class Array
+ def at_rand
+ self.at(rand(self.length))
+ end
+end
14 lib/faker.rb
@@ -0,0 +1,14 @@
+$:.unshift File.dirname(__FILE__)
+
+require 'faker/name'
+require 'faker/phone_number'
+require 'faker/company'
+require 'faker/address'
+
+require 'extensions/array'
+
+module Faker
+ def self.numerify(number_string)
+ number_string.gsub(/#/) { rand(10).to_s }
+ end
+end
40 lib/faker/address.rb
@@ -0,0 +1,40 @@
+module Faker
+ class Address
+ class << self
+ def zip_code
+ Faker.numerify(['#####', '#####-####'].at_rand)
+ end
+
+ def us_state
+ ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorado', 'Connecticut', 'Delaware', 'Florida', 'Georgia', 'Hawaii', 'Idaho', 'Illinois', 'Indiana', 'Iowa', 'Kansas', 'Kentucky', 'Louisiana', 'Maine', 'Maryland', 'Massachusetts', 'Michigan', 'Minnesota', 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Hampshire', 'New Jersey', 'New Mexico', 'New York', 'North Carolina', 'North Dakota', 'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania', 'Rhode Island', 'South Carolina', 'South Dakota', 'Tennessee', 'Texas', 'Utah', 'Vermont', 'Virginia', 'Washington', 'West Virginia', 'Wisconsin', 'Wyoming'].at_rand
+ end
+
+ def us_state_abbr
+ %w(AL AK AS AZ AR CA CO CT DE DC FM FL GA GU HI ID IL IN IA KS KY LA ME MH MD MA MI MN MS MO MT NE NV NH NJ NM NY NC ND MP OH OK OR PW PA PR RI SC SD TN TX UT VT VI VA WA WV WI WY AE AA AP).at_rand
+ end
+
+ def street_suffix
+ %w(Alley Avenue Branch Bridge Brook Brooks Burg Burgs Bypass Camp Canyon Cape Causeway Center Centers Circle Circles Cliff Cliffs Club Common Corner Corners Course Court Courts Cove Coves Creek Crescent Crest Crossing Crossroad Curve Dale Dam Divide Drive Drive Drives Estate Estates Expressway Extension Extensions Fall Falls Ferry Field Fields Flat Flats Ford Fords Forest Forge Forges Fork Forks Fort Freeway Garden Gardens Gateway Glen Glens Green Greens Grove Groves Harbor Harbors Haven Heights Highway Hill Hills Hollow Inlet Inlet Island Island Islands Islands Isle Isle Junction Junctions Key Keys Knoll Knolls Lake Lakes Land Landing Lane Light Lights Loaf Lock Locks Locks Lodge Lodge Loop Mall Manor Manors Meadow Meadows Mews Mill Mills Mission Mission Motorway Mount Mountain Mountain Mountains Mountains Neck Orchard Oval Overpass Park Parks Parkway Parkways Pass Passage Path Pike Pine Pines Place Plain Plains Plains Plaza Plaza Point Points Port Port Ports Ports Prairie Prairie Radial Ramp Ranch Rapid Rapids Rest Ridge Ridges River Road Road Roads Roads Route Row Rue Run Shoal Shoals Shore Shores Skyway Spring Springs Springs Spur Spurs Square Square Squares Squares Station Station Stravenue Stravenue Stream Stream Street Street Streets Summit Summit Terrace Throughway Trace Track Trafficway Trail Trail Tunnel Tunnel Turnpike Turnpike Underpass Union Unions Valley Valleys Via Viaduct View Views Village Village Villages Ville Vista Vista Walk Walks Wall Way Ways Well Wells).at_rand
+ end
+
+ def street_name
+ [
+ Proc.new { [Name.last_name, street_suffix].join(' ') },
+ Proc.new { [Name.first_name, street_suffix].join(' ') }
+ ].at_rand.call
+ end
+
+ def street_address
+ Faker.numerify([
+ Proc.new { '##### %s' % street_name },
+ Proc.new { '##### %s' % street_name },
+ Proc.new { '##### %s' % street_name },
+ Proc.new { '##### %s' % street_name },
+ Proc.new { '##### %s Apt. ###' % street_name },
+ Proc.new { '##### %s Suite ###' % street_name }
+ ].at_rand.call)
+ end
+
+ end
+ end
+end
19 lib/faker/company.rb
@@ -0,0 +1,19 @@
+module Faker
+ class Company
+ class << self
+ def name
+ Formats.at_rand.call
+ end
+
+ def suffix
+ %w(Inc and\ Sons LLC Group).at_rand
+ end
+ end
+
+ Formats = [
+ Proc.new { [ Name.last_name, suffix ].join(' ') },
+ Proc.new { [ Name.last_name, Name.last_name ].join('-') },
+ Proc.new { "%s, %s and %s" % [ Name.last_name, Name.last_name, Name.last_name ] }
+ ]
+ end
+end
38 lib/faker/name.rb
@@ -0,0 +1,38 @@
+module Faker
+ class Name
+ class << self
+ def name
+ Formats.at_rand.call.join(' ')
+ end
+
+ def first_name
+ %w(Aaliyah Aaron Abagail Abbey Abbie Abbigail Abby Abdiel Abdul Abdullah Abe Abel Abelardo Abigail Abigale Abigayle Abner Abraham Ada Adah Adalberto Adaline Adam Adan Addie Addison Adela Adelbert Adele Adelia Adeline Adell Adella Adelle Aditya Adolf Adolfo Adolph Adolphus Adonis Adrain Adrian Adriana Adrianna Adriel Adrien Adrienne Afton Aglae Agnes Agustin Agustina Ahmad Ahmed Aida Aidan Aiden Aileen Aimee Aisha Aiyana Akeem Al Alaina Alan Alana Alanis Alanna Alayna Alba Albert Alberta Albertha Alberto Albin Albina Alda Alden Alec Aleen Alejandra Alejandrin Alek Alena Alene Alessandra Alessandro Alessia Aletha Alex Alexa Alexander Alexandra Alexandre Alexandrea Alexandria Alexandrine Alexandro Alexane Alexanne Alexie Alexis Alexys Alexzander Alf Alfonso Alfonzo Alford Alfred Alfreda Alfredo Ali Alia Alice Alicia Alisa Alisha Alison Alivia Aliya Aliyah Aliza Alize Allan Allen Allene Allie Allison Ally Alphonso Alta Althea Alva Alvah Alvena Alvera Alverta Alvina Alvis Alyce Alycia Alysa Alysha Alyson Alysson Amalia Amanda Amani Amara Amari Amaya Amber Ambrose Amelia Amelie Amely America Americo Amie Amina Amir Amira Amiya Amos Amparo Amy Amya Ana Anabel Anabelle Anahi Anais Anastacio Anastasia Anderson Andre Andreane Andreanne Andres Andrew Andy Angel Angela Angelica Angelina Angeline Angelita Angelo Angie Angus Anibal Anika Anissa Anita Aniya Aniyah Anjali Anna Annabel Annabell Annabelle Annalise Annamae Annamarie Anne Annetta Annette Annie Ansel Ansley Anthony Antoinette Antone Antonetta Antonette Antonia Antonietta Antonina Antonio Antwan Antwon Anya April Ara Araceli Aracely Arch Archibald Ardella Arden Ardith Arely Ari Ariane Arianna Aric Ariel Arielle Arjun Arlene Arlie Arlo Armand Armando Armani Arnaldo Arne Arno Arnold Arnoldo Arnulfo Aron Art Arthur Arturo Arvel Arvid Arvilla Aryanna Asa Asha Ashlee Ashleigh Ashley Ashly Ashlynn Ashton Ashtyn Asia Assunta Astrid Athena Aubree Aubrey Audie Audra Audreanne Audrey August Augusta Augustine Augustus Aurelia Aurelie Aurelio Aurore Austen Austin Austyn Autumn Ava Avery Avis Axel Ayana Ayden Ayla Aylin Baby Bailee Bailey Barbara Barney Baron Barrett Barry Bart Bartholome Barton Baylee Beatrice Beau Beaulah Bell Bella Belle Ben Benedict Benjamin Bennett Bennie Benny Benton Berenice Bernadette Bernadine Bernard Bernardo Berneice Bernhard Bernice Bernie Berniece Bernita Berry Bert Berta Bertha Bertram Bertrand Beryl Bessie Beth Bethany Bethel Betsy Bette Bettie Betty Bettye Beulah Beverly Bianka Bill Billie Billy Birdie Blair Blaise Blake Blanca Blanche Blaze Bo Bobbie Bobby Bonita Bonnie Boris Boyd Brad Braden Bradford Bradley Bradly Brady Braeden Brain Brandi Brando Brandon Brandt Brandy Brandyn Brannon Branson Brant Braulio Braxton Brayan Breana Breanna Breanne Brenda Brendan Brenden Brendon Brenna Brennan Brennon Brent Bret Brett Bria Brian Briana Brianne Brice Bridget Bridgette Bridie Brielle Brigitte Brionna Brisa Britney Brittany Brock Broderick Brody Brook Brooke Brooklyn Brooks Brown Bruce Bryana Bryce Brycen Bryon Buck Bud Buddy Buford Bulah Burdette Burley Burnice Buster Cade Caden Caesar Caitlyn Cale Caleb Caleigh Cali Calista Callie Camden Cameron Camila Camilla Camille Camren Camron Camryn Camylle Candace Candelario Candice Candida Candido Cara Carey Carissa Carlee Carleton Carley Carli Carlie Carlo Carlos Carlotta Carmel Carmela Carmella Carmelo Carmen Carmine Carol Carolanne Carole Carolina Caroline Carolyn Carolyne Carrie Carroll Carson Carter Cary Casandra Casey Casimer Casimir Casper Cassandra Cassandre Cassidy Cassie Catalina Caterina Catharine Catherine Cathrine Cathryn Cathy Cayla Ceasar Cecelia Cecil Cecile Cecilia Cedrick Celestine Celestino Celia Celine Cesar Chad Chadd Chadrick Chaim Chance Chandler Chanel Chanelle Charity Charlene Charles Charley Charlie Charlotte Chase Chasity Chauncey Chaya Chaz Chelsea Chelsey Chelsie Chesley Chester Chet Cheyanne Cheyenne Chloe Chris Christ Christa Christelle Christian Christiana Christina Christine Christop Christophe Christopher Christy Chyna Ciara Cicero Cielo Cierra Cindy Citlalli Clair Claire Clara Clarabelle Clare Clarissa Clark Claud Claude Claudia Claudie Claudine Clay Clemens Clement Clementina Clementine Clemmie Cleo Cleora Cleta Cletus Cleve Cleveland Clifford Clifton Clint Clinton Clotilde Clovis Cloyd Clyde Coby Cody Colby Cole Coleman Colin Colleen Collin Colt Colten Colton Columbus Concepcion Conner Connie Connor Conor Conrad Constance Constantin Consuelo Cooper Cora Coralie Corbin Cordelia Cordell Cordia Cordie Corene Corine Cornelius Cornell Corrine Cortez Cortney Cory Coty Courtney Coy Craig Crawford Creola Cristal Cristian Cristina Cristobal Cristopher Cruz Crystal Crystel Cullen Curt Curtis Cydney Cynthia Cyril Cyrus Dagmar Dahlia Daija Daisha Daisy Dakota Dale Dallas Dallin Dalton Damaris Dameon Damian Damien Damion Damon Dan Dana Dandre Dane D'angelo Dangelo Danial Daniela Daniella Danielle Danika Dannie Danny Dante Danyka Daphne Daphnee Daphney Darby Daren Darian Dariana Darien Dario Darion Darius Darlene Daron Darrel Darrell Darren Darrick Darrin Darrion Darron Darryl Darwin Daryl Dashawn Dasia Dave David Davin Davion Davon Davonte Dawn Dawson Dax Dayana Dayna Dayne Dayton Dean Deangelo Deanna Deborah Declan Dedric Dedrick Dee Deion Deja Dejah Dejon Dejuan Delaney Delbert Delfina Delia Delilah Dell Della Delmer Delores Delpha Delphia Delphine Delta Demarco Demarcus Demario Demetris Demetrius Demond Dena Denis Dennis Deon Deondre Deontae Deonte Dereck Derek Derick Deron Derrick Deshaun Deshawn Desiree Desmond Dessie Destany Destin Destinee Destiney Destini Destiny Devan Devante Deven Devin Devon Devonte Devyn Dewayne Dewitt Dexter Diamond Diana Dianna Diego Dillan Dillon Dimitri Dina Dino Dion Dixie Dock Dolly Dolores Domenic Domenica Domenick Domenico Domingo Dominic Dominique Don Donald Donato Donavon Donna Donnell Donnie Donny Dora Dorcas Dorian Doris Dorothea Dorothy Dorris Dortha Dorthy Doug Douglas Dovie Doyle Drake Drew Duane Dudley Dulce Duncan Durward Dustin Dusty Dwight Dylan Earl Earlene Earline Earnest Earnestine Easter Easton Ebba Ebony Ed Eda Edd Eddie Eden Edgar Edgardo Edison Edmond Edmund Edna Eduardo Edward Edwardo Edwin Edwina Edyth Edythe Effie Efrain Efren Eileen Einar Eino Eladio Elaina Elbert Elda Eldon Eldora Eldred Eldridge Eleanora Eleanore Eleazar Electa Elena Elenor Elenora Eleonore Elfrieda Eli Elian Eliane Elias Eliezer Elijah Elinor Elinore Elisa Elisabeth Elise Eliseo Elisha Elissa Eliza Elizabeth Ella Ellen Ellie Elliot Elliott Ellis Ellsworth Elmer Elmira Elmo Elmore Elna Elnora Elody Eloisa Eloise Elouise Eloy Elroy Elsa Else Elsie Elta Elton Elva Elvera Elvie Elvis Elwin Elwyn Elyse Elyssa Elza Emanuel Emelia Emelie Emely Emerald Emerson Emery Emie Emil Emile Emilia Emiliano Emilie Emilio Emily Emma Emmalee Emmanuel Emmanuelle Emmet Emmett Emmie Emmitt Emmy Emory Ena Enid Enoch Enola Enos Enrico Enrique Ephraim Era Eriberto Eric Erica Erich Erick Ericka Erik Erika Erin Erling Erna Ernest Ernestina Ernestine Ernesto Ernie Ervin Erwin Eryn Esmeralda Esperanza Esta Esteban Estefania Estel Estell Estella Estelle Estevan Esther Estrella Etha Ethan Ethel Ethelyn Ethyl Ettie Eudora Eugene Eugenia Eula Eulah Eulalia Euna Eunice Eusebio Eva Evalyn Evan Evangeline Evans Eve Eveline Evelyn Everardo Everett Everette Evert Evie Ewald Ewell Ezekiel Ezequiel Ezra Fabian Fabiola Fae Fannie Fanny Fatima Faustino Fausto Favian Fay Faye Federico Felicia Felicita Felicity Felipa Felipe Felix Felton Fermin Fern Fernando Ferne Fidel Filiberto Filomena Finn Fiona Flavie Flavio Fleta Fletcher Flo Florence Florencio Florian Florida Florine Flossie Floy Floyd Ford Forest Forrest Foster Frances Francesca Francesco Francis Francisca Francisco Franco Frank Frankie Franz Fred Freda Freddie Freddy Frederic Frederick Frederik Frederique Fredrick Fredy Freeda Freeman Freida Frida Frieda Friedrich Fritz Furman Gabe Gabriel Gabriella Gabrielle Gaetano Gage Gail Gardner Garett Garfield Garland Garnet Garnett Garret Garrett Garrick Garrison Garry Garth Gaston Gavin Gay Gayle Gaylord Gene General Genesis Genevieve Gennaro Genoveva Geo Geoffrey George Georgette Georgiana Georgianna Geovanni Geovanny Geovany Gerald Geraldine Gerard Gerardo Gerda Gerhard Germaine German Gerry Gerson Gertrude Gia Gianni Gideon Gilbert Gilberto Gilda Giles Gillian Gina Gino Giovani Giovanna Giovanni Giovanny Gisselle Giuseppe Gladyce Gladys Glen Glenda Glenna Glennie Gloria Godfrey Golda Golden Gonzalo Gordon Grace Gracie Graciela Grady Graham Grant Granville Grayce Grayson Green Greg Gregg Gregoria Gregorio Gregory Greta Gretchen Greyson Griffin Grover Guadalupe Gudrun Guido Guillermo Guiseppe Gunnar Gunner Gus Gussie Gust Gustave Guy Gwen Gwendolyn Hadley Hailee Hailey Hailie Hal Haleigh Haley Halie Halle Hallie Hank Hanna Hannah Hans Hardy Harley Harmon Harmony Harold Harrison Harry Harvey Haskell Hassan Hassie Hattie Haven Hayden Haylee Hayley Haylie Hazel Hazle Heath Heather Heaven Heber Hector Heidi Helen Helena Helene Helga Hellen Helmer Heloise Henderson Henri Henriette Henry Herbert Herman Hermann Hermina Herminia Herminio Hershel Herta Hertha Hester Hettie Hilario Hilbert Hilda Hildegard Hillard Hillary Hilma Hilton Hipolito Hiram Hobart Holden Hollie Hollis Holly Hope Horace Horacio Hortense Hosea Houston Howard Howell Hoyt Hubert Hudson Hugh Hulda Humberto Hunter Hyman Ian Ibrahim Icie Ida Idell Idella Ignacio Ignatius Ike Ila Ilene Iliana Ima Imani Imelda Immanuel Imogene Ines Irma Irving Irwin Isaac Isabel Isabell Isabella Isabelle Isac Isadore Isai Isaiah Isaias Isidro Ismael Isobel Isom Israel Issac Itzel Iva Ivah Ivory Ivy Izabella Izaiah Jabari Jace Jacey Jacinthe Jacinto Jack Jackeline Jackie Jacklyn Jackson Jacky Jaclyn Jacquelyn Jacques Jacynthe Jada Jade Jaden Jadon Jadyn Jaeden Jaida Jaiden Jailyn Jaime Jairo Jakayla Jake Jakob Jaleel Jalen Jalon Jalyn Jamaal Jamal Jamar Jamarcus Jamel Jameson Jamey Jamie Jamil Jamir Jamison Jammie Jan Jana Janae Jane Janelle Janessa Janet Janice Janick Janie Janis Janiya Jannie Jany Jaquan Jaquelin Jaqueline Jared Jaren Jarod Jaron Jarred Jarrell Jarret Jarrett Jarrod Jarvis Jasen Jasmin Jason Jasper Jaunita Javier Javon Javonte Jay Jayce Jaycee Jayda Jayde Jayden Jaydon Jaylan Jaylen Jaylin Jaylon Jayme Jayne Jayson Jazlyn Jazmin Jazmyn Jazmyne Jean Jeanette Jeanie Jeanne Jed Jedediah Jedidiah Jeff Jefferey Jeffery Jeffrey Jeffry Jena Jenifer Jennie Jennifer Jennings Jennyfer Jensen Jerad Jerald Jeramie Jeramy Jerel Jeremie Jeremy Jermain Jermaine Jermey Jerod Jerome Jeromy Jerrell Jerrod Jerrold Jerry Jess Jesse Jessica Jessie Jessika Jessy Jessyca Jesus Jett Jettie Jevon Jewel Jewell Jillian Jimmie Jimmy Jo Joan Joana Joanie Joanne Joannie Joanny Joany Joaquin Jocelyn Jodie Jody Joe Joel Joelle Joesph Joey Johan Johann Johanna Johathan John Johnathan Johnathon Johnnie Johnny Johnpaul Johnson Jolie Jon Jonas Jonatan Jonathan Jonathon Jordan Jordane Jordi Jordon Jordy Jordyn Jorge Jose Josefa Josefina Joseph Josephine Josh Joshua Joshuah Josiah Josiane Josianne Josie Josue Jovan Jovani Jovanny Jovany Joy Joyce Juana Juanita Judah Judd Jude Judge Judson Judy Jules Julia Julian Juliana Julianne Julie Julien Juliet Julio Julius June Junior Junius Justen Justice Justina Justine Juston Justus Justyn Juvenal Juwan Kacey Kaci Kacie Kade Kaden Kadin Kaela Kaelyn Kaia Kailee Kailey Kailyn Kaitlin Kaitlyn Kale Kaleb Kaleigh Kaley Kali Kallie Kameron Kamille Kamren Kamron Kamryn Kane Kara Kareem Karelle Karen Kari Kariane Karianne Karina Karine Karl Karlee Karley Karli Karlie Karolann Karson Kasandra Kasey Kassandra Katarina Katelin Katelyn Katelynn Katharina Katherine Katheryn Kathleen Kathlyn Kathryn Kathryne Katlyn Katlynn Katrina Katrine Kattie Kavon Kay Kaya Kaycee Kayden Kayla Kaylah Kaylee Kayleigh Kayley Kayli Kaylie Kaylin Keagan Keanu Keara Keaton Keegan Keeley Keely Keenan Keira Keith Kellen Kelley Kelli Kellie Kelly Kelsi Kelsie Kelton Kelvin Ken Kendall Kendra Kendrick Kenna Kennedi Kennedy Kenneth Kennith Kenny Kenton Kenya Kenyatta Kenyon Keon Keshaun Keshawn Keven Kevin Kevon Keyon Keyshawn Khalid Khalil Kian Kiana Kianna Kiara Kiarra Kiel Kiera Kieran Kiley Kim Kimberly King Kip Kira Kirk Kirsten Kirstin Kitty Kobe Koby Kody Kolby Kole Korbin Korey Kory Kraig Kris Krista Kristian Kristin Kristina Kristofer Kristoffer Kristopher Kristy Krystal Krystel Krystina Kurt Kurtis Kyla Kyle Kylee Kyleigh Kyler Kylie Kyra Lacey Lacy Ladarius Lafayette Laila Laisha Lamar Lambert Lamont Lance Landen Lane Laney Larissa Laron Larry Larue Laura Laurel Lauren Laurence Lauretta Lauriane Laurianne Laurie Laurine Laury Lauryn Lavada Lavern Laverna Laverne Lavina Lavinia Lavon Lavonne Lawrence Lawson Layla Layne Lazaro Lea Leann Leanna Leanne Leatha Leda Lee Leif Leila Leilani Lela Lelah Leland Lelia Lempi Lemuel Lenna Lennie Lenny Lenora Lenore Leo Leola Leon Leonard Leonardo Leone Leonel Leonie Leonor Leonora Leopold Leopoldo Leora Lera Lesley Leslie Lesly Lessie Lester Leta Letha Letitia Levi Lew Lewis Lexi Lexie Lexus Lia Liam Liana Libbie Libby Lila Lilian Liliana Liliane Lilla Lillian Lilliana Lillie Lilly Lily Lilyan Lina Lincoln Linda Lindsay Lindsey Linnea Linnie Linwood Lionel Lisa Lisandro Lisette Litzy Liza Lizeth Lizzie Llewellyn Lloyd Logan Lois Lola Lolita Loma Lon London Lonie Lonnie Lonny Lonzo Lora Loraine Loren Lorena Lorenz Lorenza Lorenzo Lori Lorine Lorna Lottie Lou Louie Louisa Lourdes Louvenia Lowell Loy Loyal Loyce Lucas Luciano Lucie Lucienne Lucile Lucinda Lucio Lucious Lucius Lucy Ludie Ludwig Lue Luella Luigi Luis Luisa Lukas Lula Lulu Luna Lupe Lura Lurline Luther Luz Lyda Lydia Lyla Lynn Lyric Lysanne Mabel Mabelle Mable Mac Macey Maci Macie Mack Mackenzie Macy Madaline Madalyn Maddison Madeline Madelyn Madelynn Madge Madie Madilyn Madisen Madison Madisyn Madonna Madyson Mae Maegan Maeve Mafalda Magali Magdalen Magdalena Maggie Magnolia Magnus Maia Maida Maiya Major Makayla Makenna Makenzie Malachi Malcolm Malika Malinda Mallie Mallory Malvina Mandy Manley Manuel Manuela Mara Marc Marcel Marcelina Marcelino Marcella Marcelle Marcellus Marcelo Marcia Marco Marcos Marcus Margaret Margarete Margarett Margaretta Margarette Margarita Marge Margie Margot Margret Marguerite Maria Mariah Mariam Marian Mariana Mariane Marianna Marianne Mariano Maribel Marie Mariela Marielle Marietta Marilie Marilou Marilyne Marina Mario Marion Marisa Marisol Maritza Marjolaine Marjorie Marjory Mark Markus Marlee Marlen Marlene Marley Marlin Marlon Marques Marquis Marquise Marshall Marta Martin Martina Martine Marty Marvin Mary Maryam Maryjane Maryse Mason Mateo Mathew Mathias Mathilde Matilda Matilde Matt Matteo Mattie Maud Maude Maudie Maureen Maurice Mauricio Maurine Maverick Mavis Max Maxie Maxime Maximilian Maximillia Maximillian Maximo Maximus Maxine Maxwell May Maya Maybell Maybelle Maye Maymie Maynard Mayra Mazie Mckayla Mckenna Mckenzie Meagan Meaghan Meda Megane Meggie Meghan Mekhi Melany Melba Melisa Melissa Mellie Melody Melvin Melvina Melyna Melyssa Mercedes Meredith Merl Merle Merlin Merritt Mertie Mervin Meta Mia Micaela Micah Michael Michaela Michale Micheal Michel Michele Michelle Miguel Mikayla Mike Mikel Milan Miles Milford Miller Millie Milo Milton Mina Minerva Minnie Miracle Mireille Mireya Misael Missouri Misty Mitchel Mitchell Mittie Modesta Modesto Mohamed Mohammad Mohammed Moises Mollie Molly Mona Monica Monique Monroe Monserrat Monserrate Montana Monte Monty Morgan Moriah Morris Mortimer Morton Mose Moses Moshe Mossie Mozell Mozelle Muhammad Muriel Murl Murphy Murray Mustafa Mya Myah Mylene Myles Myra Myriam Myrl Myrna Myron Myrtice Myrtie Myrtis Myrtle Nadia Nakia Name Nannie Naomi Naomie Napoleon Narciso Nash Nasir Nat Natalia Natalie Natasha Nathan Nathanael Nathanial Nathaniel Nathen Nayeli Neal Ned Nedra Neha Neil Nelda Nella Nelle Nellie Nels Nelson Neoma Nestor Nettie Neva Newell Newton Nia Nicholas Nicholaus Nichole Nick Nicklaus Nickolas Nico Nicola Nicolas Nicole Nicolette Nigel Nikita Nikki Nikko Niko Nikolas Nils Nina Noah Noble Noe Noel Noelia Noemi Noemie Noemy Nola Nolan Nona Nora Norbert Norberto Norene Norma Norris Norval Norwood Nova Novella Nya Nyah Nyasia Obie Oceane Ocie Octavia Oda Odell Odessa Odie Ofelia Okey Ola Olaf Ole Olen Oleta Olga Olin Oliver Ollie Oma Omari Omer Ona Onie Opal Ophelia Ora Oral Oran Oren Orie Orin Orion Orland Orlando Orlo Orpha Orrin Orval Orville Osbaldo Osborne Oscar Osvaldo Oswald Oswaldo Otha Otho Otilia Otis Ottilie Ottis Otto Ova Owen Ozella Pablo Paige Palma Pamela Pansy Paolo Paris Parker Pascale Pasquale Pat Patience Patricia Patrick Patsy Pattie Paul Paula Pauline Paxton Payton Pearl Pearlie Pearline Pedro Peggie Penelope Percival Percy Perry Pete Peter Petra Peyton Philip Phoebe Phyllis Pierce Pierre Pietro Pink Pinkie Piper Polly Porter Precious Presley Preston Price Prince Princess Priscilla Providenci Prudence Queen Queenie Quentin Quincy Quinn Quinten Quinton Rachael Rachel Rachelle Rae Raegan Rafael Rafaela Raheem Rahsaan Rahul Raina Raleigh Ralph Ramiro Ramon Ramona Randal Randall Randi Randy Ransom Raoul Raphael Raphaelle Raquel Rashad Rashawn Rasheed Raul Raven Ray Raymond Raymundo Reagan Reanna Reba Rebeca Rebecca Rebeka Rebekah Reece Reed Reese Regan Reggie Reginald Reid Reilly Reina Reinhold Remington Rene Renee Ressie Reta Retha Retta Reuben Reva Rex Rey Reyes Reymundo Reyna Reynold Rhea Rhett Rhianna Rhiannon Rhoda Ricardo Richard Richie Richmond Rick Rickey Rickie Ricky Rico Rigoberto Riley Rita River Robb Robbie Robert Roberta Roberto Robin Robyn Rocio Rocky Rod Roderick Rodger Rodolfo Rodrick Rodrigo Roel Rogelio Roger Rogers Rolando Rollin Roma Romaine Roman Ron Ronaldo Ronny Roosevelt Rory Rosa Rosalee Rosalia Rosalind Rosalinda Rosalyn Rosamond Rosanna Rosario Roscoe Rose Rosella Roselyn Rosemarie Rosemary Rosendo Rosetta Rosie Rosina Roslyn Ross Rossie Rowan Rowena Rowland Roxane Roxanne Roy Royal Royce Rozella Ruben Rubie Ruby Rubye Rudolph Rudy Rupert Russ Russel Russell Rusty Ruth Ruthe Ruthie Ryan Ryann Ryder Rylan Rylee Ryleigh Ryley Sabina Sabrina Sabryna Sadie Sadye Sage Saige Sallie Sally Salma Salvador Salvatore Sam Samanta Samantha Samara Samir Sammie Sammy Samson Sandra Sandrine Sandy Sanford Santa Santiago Santina Santino Santos Sarah Sarai Sarina Sasha Saul Savanah Savanna Savannah Savion Scarlett Schuyler Scot Scottie Scotty Seamus Sean Sebastian Sedrick Selena Selina Selmer Serena Serenity Seth Shad Shaina Shakira Shana Shane Shanel Shanelle Shania Shanie Shaniya Shanna Shannon Shanny Shanon Shany Sharon Shaun Shawn Shawna Shaylee Shayna Shayne Shea Sheila Sheldon Shemar Sheridan Sherman Sherwood Shirley Shyann Shyanne Sibyl Sid Sidney Sienna Sierra Sigmund Sigrid Sigurd Silas Sim Simeon Simone Sincere Sister Skye Skyla Skylar Sofia Soledad Solon Sonia Sonny Sonya Sophia Sophie Spencer Stacey Stacy Stan Stanford Stanley Stanton Stefan Stefanie Stella Stephan Stephania Stephanie Stephany Stephen Stephon Sterling Steve Stevie Stewart Stone Stuart Summer Sunny Susan Susana Susanna Susie Suzanne Sven Syble Sydnee Sydney Sydni Sydnie Sylvan Sylvester Sylvia Tabitha Tad Talia Talon Tamara Tamia Tania Tanner Tanya Tara Taryn Tate Tatum Tatyana Taurean Tavares Taya Taylor Teagan Ted Telly Terence Teresa Terrance Terrell Terrence Terrill Terry Tess Tessie Tevin Thad Thaddeus Thalia Thea Thelma Theo Theodora Theodore Theresa Therese Theresia Theron Thomas Thora Thurman Tia Tiana Tianna Tiara Tierra Tiffany Tillman Timmothy Timmy Timothy Tina Tito Titus Tobin Toby Tod Tom Tomas Tomasa Tommie Toney Toni Tony Torey Torrance Torrey Toy Trace Tracey Tracy Travis Travon Tre Tremaine Tremayne Trent Trenton Tressa Tressie Treva Trever Trevion Trevor Trey Trinity Trisha Tristian Tristin Triston Troy Trudie Trycia Trystan Turner Twila Tyler Tyra Tyree Tyreek Tyrel Tyrell Tyrese Tyrique Tyshawn Tyson Ubaldo Ulices Ulises Una Unique Urban Uriah Uriel Ursula Vada Valentin Valentina Valentine Valerie Vallie Van Vance Vanessa Vaughn Veda Velda Vella Velma Velva Vena Verda Verdie Vergie Verla Verlie Vern Verna Verner Vernice Vernie Vernon Verona Veronica Vesta Vicenta Vicente Vickie Vicky Victor Victoria Vida Vidal Vilma Vince Vincent Vincenza Vincenzo Vinnie Viola Violet Violette Virgie Virgil Virginia Virginie Vita Vito Viva Vivian Viviane Vivianne Vivien Vivienne Vladimir Wade Waino Waldo Walker Wallace Walter Walton Wanda Ward Warren Watson Wava Waylon Wayne Webster Weldon Wellington Wendell Wendy Werner Westley Weston Whitney Wilber Wilbert Wilburn Wiley Wilford Wilfred Wilfredo Wilfrid Wilhelm Wilhelmine Will Willa Willard William Willie Willis Willow Willy Wilma Wilmer Wilson Wilton Winfield Winifred Winnifred Winona Winston Woodrow Wyatt Wyman Xander Xavier Xzavier Yadira Yasmeen Yasmin Yasmine Yazmin Yesenia Yessenia Yolanda Yoshiko Yvette Yvonne Zachariah Zachary Zachery Zack Zackary Zackery Zakary Zander Zane Zaria Zechariah Zelda Zella Zelma Zena Zetta Zion Zita Zoe Zoey Zoie Zoila Zola Zora Zula).at_rand
+ end
+
+ def last_name
+ %w(Abbott Abernathy Abshire Adams Altenwerth Anderson Ankunding Armstrong Auer Aufderhar Bahringer Bailey Balistreri Barrows Bartell Bartoletti Barton Bashirian Batz Bauch Baumbach Bayer Beahan Beatty Bechtelar Becker Bednar Beer Beier Berge Bergnaum Bergstrom Bernhard Bernier Bins Blanda Blick Block Bode Boehm Bogan Bogisich Borer Bosco Botsford Boyer Boyle Bradtke Brakus Braun Breitenberg Brekke Brown Bruen Buckridge Carroll Carter Cartwright Casper Cassin Champlin Christiansen Cole Collier Collins Conn Connelly Conroy Considine Corkery Cormier Corwin Cremin Crist Crona Cronin Crooks Cruickshank Cummerata Cummings Dach D'Amore Daniel Dare Daugherty Davis Deckow Denesik Dibbert Dickens Dicki Dickinson Dietrich Donnelly Dooley Douglas Doyle DuBuque Durgan Ebert Effertz Eichmann Emard Emmerich Erdman Ernser Fadel Fahey Farrell Fay Feeney Feest Feil Ferry Fisher Flatley Frami Franecki Friesen Fritsch Funk Gaylord Gerhold Gerlach Gibson Gislason Gleason Gleichner Glover Goldner Goodwin Gorczany Gottlieb Goyette Grady Graham Grant Green Greenfelder Greenholt Grimes Gulgowski Gusikowski Gutkowski Gutmann Haag Hackett Hagenes Hahn Haley Halvorson Hamill Hammes Hand Hane Hansen Harber Harris Hartmann Harvey Hauck Hayes Heaney Heathcote Hegmann Heidenreich Heller Herman Hermann Hermiston Herzog Hessel Hettinger Hickle Hilll Hills Hilpert Hintz Hirthe Hodkiewicz Hoeger Homenick Hoppe Howe Howell Hudson Huel Huels Hyatt Jacobi Jacobs Jacobson Jakubowski Jaskolski Jast Jenkins Jerde Jewess Johns Johnson Johnston Jones Kassulke Kautzer Keebler Keeling Kemmer Kerluke Kertzmann Kessler Kiehn Kihn Kilback King Kirlin Klein Kling Klocko Koch Koelpin Koepp Kohler Konopelski Koss Kovacek Kozey Krajcik Kreiger Kris Kshlerin Kub Kuhic Kuhlman Kuhn Kulas Kunde Kunze Kuphal Kutch Kuvalis Labadie Lakin Lang Langosh Langworth Larkin Larson Leannon Lebsack Ledner Leffler Legros Lehner Lemke Lesch Leuschke Lind Lindgren Littel Little Lockman Lowe Lubowitz Lueilwitz Luettgen Lynch Macejkovic Maggio Mann Mante Marks Marquardt Marvin Mayer Mayert McClure McCullough McDermott McGlynn McKenzie McLaughlin Medhurst Mertz Metz Miller Mills Mitchell Moen Mohr Monahan Moore Morar Morissette Mosciski Mraz Mueller Muller Murazik Murphy Murray Nader Nicolas Nienow Nikolaus Nitzsche Nolan Oberbrunner O'Connell O'Conner O'Hara O'Keefe O'Kon Okuneva Olson Ondricka O'Reilly Orn Ortiz Osinski Pacocha Padberg Pagac Parisian Parker Paucek Pfannerstill Pfeffer Pollich Pouros Powlowski Predovic Price Prohaska Prosacco Purdy Quigley Quitzon Rath Ratke Rau Raynor Reichel Reichert Reilly Reinger Rempel Renner Reynolds Rice Rippin Ritchie Robel Roberts Rodriguez Rogahn Rohan Rolfson Romaguera Roob Rosenbaum Rowe Ruecker Runolfsdottir Runolfsson Runte Russel Rutherford Ryan Sanford Satterfield Sauer Sawayn Schaden Schaefer Schamberger Schiller Schimmel Schinner Schmeler Schmidt Schmitt Schneider Schoen Schowalter Schroeder Schulist Schultz Schumm Schuppe Schuster Senger Shanahan Shields Simonis Sipes Skiles Smith Smitham Spencer Spinka Sporer Stamm Stanton Stark Stehr Steuber Stiedemann Stokes Stoltenberg Stracke Streich Stroman Strosin Swaniawski Swift Terry Thiel Thompson Tillman Torp Torphy Towne Toy Trantow Tremblay Treutel Tromp Turcotte Turner Ullrich Upton Vandervort Veum Volkman Von VonRueden Waelchi Walker Walsh Walter Ward Waters Watsica Weber Wehner Weimann Weissnat Welch West White Wiegand Wilderman Wilkinson Will Williamson Willms Windler Wintheiser Wisoky Wisozk Witting Wiza Wolf Wolff Wuckert Wunsch Wyman Yost Yundt Zboncak Zemlak Ziemann Zieme Zulauf).at_rand
+ end
+
+ def prefix
+ %w(Mr. Mrs. Ms. Miss Dr.).at_rand
+ end
+
+ def suffix
+ %w(Jr. Sr. I II III IV V MD DDS PhD DVM).at_rand
+ end
+ end
+
+ Formats = [
+ Proc.new { [ prefix, first_name, last_name ] },
+ Proc.new { [ first_name, last_name, suffix ] },
+ Proc.new { [ first_name, last_name ] },
+ Proc.new { [ first_name, last_name ] },
+ Proc.new { [ first_name, last_name ] },
+ Proc.new { [ first_name, last_name ] },
+ Proc.new { [ first_name, last_name ] },
+ Proc.new { [ first_name, last_name ] },
+ Proc.new { [ first_name, last_name ] },
+ Proc.new { [ first_name, last_name ] }
+ ]
+ end
+end
33 lib/faker/phone_number.rb
@@ -0,0 +1,33 @@
+module Faker
+ class PhoneNumber
+ class << self
+ def phone_number
+ Faker.numerify(Formats.at_rand)
+ end
+ end
+
+
+ Formats = [
+ '###-###-####',
+ '(###)###-####',
+ '1-###-###-####',
+ '###.###.####',
+ '###-###-####',
+ '(###)###-####',
+ '1-###-###-####',
+ '###.###.####',
+ '###-###-#### x###',
+ '(###)###-#### x###',
+ '1-###-###-#### x###',
+ '###.###.#### x###',
+ '###-###-#### x####',
+ '(###)###-#### x####',
+ '1-###-###-#### x####',
+ '###.###.#### x####',
+ '###-###-#### x#####',
+ '(###)###-#### x#####',
+ '1-###-###-#### x#####',
+ '###.###.#### x#####'
+ ]
+ end
+end
9 lib/faker/version.rb
@@ -0,0 +1,9 @@
+module Faker #:nodoc:
+ module VERSION #:nodoc:
+ MAJOR = 0
+ MINOR = 1
+ TINY = 0
+
+ STRING = [MAJOR, MINOR, TINY].join('.')
+ end
+end
14 script/destroy
@@ -0,0 +1,14 @@
+#!/usr/bin/env ruby
+APP_ROOT = File.join(File.dirname(__FILE__), '..')
+
+begin
+ require 'rubigen'
+rescue LoadError
+ require 'rubygems'
+ require 'rubigen'
+end
+require 'rubigen/scripts/destroy'
+
+ARGV.shift if ['--help', '-h'].include?(ARGV[0])
+RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
+RubiGen::Scripts::Destroy.new.run(ARGV)
14 script/generate
@@ -0,0 +1,14 @@
+#!/usr/bin/env ruby
+APP_ROOT = File.join(File.dirname(__FILE__), '..')
+
+begin
+ require 'rubigen'
+rescue LoadError
+ require 'rubygems'
+ require 'rubigen'
+end
+require 'rubigen/scripts/generate'
+
+ARGV.shift if ['--help', '-h'].include?(ARGV[0])
+RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
+RubiGen::Scripts::Generate.new.run(ARGV)
74 script/txt2html
@@ -0,0 +1,74 @@
+#!/usr/bin/env ruby
+
+require 'rubygems'
+begin
+ require 'newgem'
+rescue LoadError
+ puts "\n\nGenerating the website requires the newgem RubyGem"
+ puts "Install: gem install newgem\n\n"
+ exit(1)
+end
+require 'redcloth'
+require 'syntax/convertors/html'
+require 'erb'
+require File.dirname(__FILE__) + '/../lib/faker/version.rb'
+
+version = Faker::VERSION::STRING
+download = 'http://rubyforge.org/projects/faker'
+
+class Fixnum
+ def ordinal
+ # teens
+ return 'th' if (10..19).include?(self % 100)
+ # others
+ case self % 10
+ when 1: return 'st'
+ when 2: return 'nd'
+ when 3: return 'rd'
+ else return 'th'
+ end
+ end
+end
+
+class Time
+ def pretty
+ return "#{mday}#{mday.ordinal} #{strftime('%B')} #{year}"
+ end
+end
+
+def convert_syntax(syntax, source)
+ return Syntax::Convertors::HTML.for_syntax(syntax).convert(source).gsub(%r!^<pre>|</pre>$!,'')
+end
+
+if ARGV.length >= 1
+ src, template = ARGV
+ template ||= File.join(File.dirname(__FILE__), '/../website/template.rhtml')
+
+else
+ puts("Usage: #{File.split($0).last} source.txt [template.rhtml] > output.html")
+ exit!
+end
+
+template = ERB.new(File.open(template).read)
+
+title = nil
+body = nil
+File.open(src) do |fsrc|
+ title_text = fsrc.readline
+ body_text = fsrc.read
+ syntax_items = []
+ body_text.gsub!(%r!<(pre|code)[^>]*?syntax=['"]([^'"]+)[^>]*>(.*?)</\1>!m){
+ ident = syntax_items.length
+ element, syntax, source = $1, $2, $3
+ syntax_items << "<#{element} class='syntax'>#{convert_syntax(syntax, source)}</#{element}>"
+ "syntax-temp-#{ident}"
+ }
+ title = RedCloth.new(title_text).to_html.gsub(%r!<.*?>!,'').strip
+ body = RedCloth.new(body_text).to_html
+ body.gsub!(%r!(?:<pre><code>)?syntax-temp-(\d+)(?:</code></pre>)?!){ syntax_items[$1.to_i] }
+end
+stat = File.stat(src)
+created = stat.ctime
+modified = stat.mtime
+
+$stdout << template.result(binding)
1,585 setup.rb
@@ -0,0 +1,1585 @@
+#
+# setup.rb
+#
+# Copyright (c) 2000-2005 Minero Aoki
+#
+# This program is free software.
+# You can distribute/modify this program under the terms of
+# the GNU LGPL, Lesser General Public License version 2.1.
+#
+
+unless Enumerable.method_defined?(:map) # Ruby 1.4.6
+ module Enumerable
+ alias map collect
+ end
+end
+
+unless File.respond_to?(:read) # Ruby 1.6
+ def File.read(fname)
+ open(fname) {|f|
+ return f.read
+ }
+ end
+end
+
+unless Errno.const_defined?(:ENOTEMPTY) # Windows?
+ module Errno
+ class ENOTEMPTY
+ # We do not raise this exception, implementation is not needed.
+ end
+ end
+end
+
+def File.binread(fname)
+ open(fname, 'rb') {|f|
+ return f.read
+ }
+end
+
+# for corrupted Windows' stat(2)
+def File.dir?(path)
+ File.directory?((path[-1,1] == '/') ? path : path + '/')
+end
+
+
+class ConfigTable
+
+ include Enumerable
+
+ def initialize(rbconfig)
+ @rbconfig = rbconfig
+ @items = []
+ @table = {}
+ # options
+ @install_prefix = nil
+ @config_opt = nil
+ @verbose = true
+ @no_harm = false
+ end
+
+ attr_accessor :install_prefix
+ attr_accessor :config_opt
+
+ attr_writer :verbose
+
+ def verbose?
+ @verbose
+ end
+
+ attr_writer :no_harm
+
+ def no_harm?
+ @no_harm
+ end
+
+ def [](key)
+ lookup(key).resolve(self)
+ end
+
+ def []=(key, val)
+ lookup(key).set val
+ end
+
+ def names
+ @items.map {|i| i.name }
+ end
+
+ def each(&block)
+ @items.each(&block)
+ end
+
+ def key?(name)
+ @table.key?(name)
+ end
+
+ def lookup(name)
+ @table[name] or setup_rb_error "no such config item: #{name}"
+ end
+
+ def add(item)
+ @items.push item
+ @table[item.name] = item
+ end
+
+ def remove(name)
+ item = lookup(name)
+ @items.delete_if {|i| i.name == name }
+ @table.delete_if {|name, i| i.name == name }
+ item
+ end
+
+ def load_script(path, inst = nil)
+ if File.file?(path)
+ MetaConfigEnvironment.new(self, inst).instance_eval File.read(path), path
+ end
+ end
+
+ def savefile
+ '.config'
+ end
+
+ def load_savefile
+ begin
+ File.foreach(savefile()) do |line|
+ k, v = *line.split(/=/, 2)
+ self[k] = v.strip
+ end
+ rescue Errno::ENOENT
+ setup_rb_error $!.message + "\n#{File.basename($0)} config first"
+ end
+ end
+
+ def save
+ @items.each {|i| i.value }
+ File.open(savefile(), 'w') {|f|
+ @items.each do |i|
+ f.printf "%s=%s\n", i.name, i.value if i.value? and i.value
+ end
+ }
+ end
+
+ def load_standard_entries
+ standard_entries(@rbconfig).each do |ent|
+ add ent
+ end
+ end
+
+ def standard_entries(rbconfig)
+ c = rbconfig
+
+ rubypath = File.join(c['bindir'], c['ruby_install_name'] + c['EXEEXT'])
+
+ major = c['MAJOR'].to_i
+ minor = c['MINOR'].to_i
+ teeny = c['TEENY'].to_i
+ version = "#{major}.#{minor}"
+
+ # ruby ver. >= 1.4.4?
+ newpath_p = ((major >= 2) or
+ ((major == 1) and
+ ((minor >= 5) or
+ ((minor == 4) and (teeny >= 4)))))
+
+ if c['rubylibdir']
+ # V > 1.6.3
+ libruby = "#{c['prefix']}/lib/ruby"
+ librubyver = c['rubylibdir']
+ librubyverarch = c['archdir']
+ siteruby = c['sitedir']
+ siterubyver = c['sitelibdir']
+ siterubyverarch = c['sitearchdir']
+ elsif newpath_p
+ # 1.4.4 <= V <= 1.6.3
+ libruby = "#{c['prefix']}/lib/ruby"
+ librubyver = "#{c['prefix']}/lib/ruby/#{version}"
+ librubyverarch = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
+ siteruby = c['sitedir']
+ siterubyver = "$siteruby/#{version}"
+ siterubyverarch = "$siterubyver/#{c['arch']}"
+ else
+ # V < 1.4.4
+ libruby = "#{c['prefix']}/lib/ruby"
+ librubyver = "#{c['prefix']}/lib/ruby/#{version}"
+ librubyverarch = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
+ siteruby = "#{c['prefix']}/lib/ruby/#{version}/site_ruby"
+ siterubyver = siteruby
+ siterubyverarch = "$siterubyver/#{c['arch']}"
+ end
+ parameterize = lambda {|path|
+ path.sub(/\A#{Regexp.quote(c['prefix'])}/, '$prefix')
+ }
+
+ if arg = c['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg }
+ makeprog = arg.sub(/'/, '').split(/=/, 2)[1]
+ else
+ makeprog = 'make'
+ end
+
+ [
+ ExecItem.new('installdirs', 'std/site/home',
+ 'std: install under libruby; site: install under site_ruby; home: install under $HOME')\
+ {|val, table|
+ case val
+ when 'std'
+ table['rbdir'] = '$librubyver'
+ table['sodir'] = '$librubyverarch'
+ when 'site'
+ table['rbdir'] = '$siterubyver'
+ table['sodir'] = '$siterubyverarch'
+ when 'home'
+ setup_rb_error '$HOME was not set' unless ENV['HOME']
+ table['prefix'] = ENV['HOME']
+ table['rbdir'] = '$libdir/ruby'
+ table['sodir'] = '$libdir/ruby'
+ end
+ },
+ PathItem.new('prefix', 'path', c['prefix'],
+ 'path prefix of target environment'),
+ PathItem.new('bindir', 'path', parameterize.call(c['bindir']),
+ 'the directory for commands'),
+ PathItem.new('libdir', 'path', parameterize.call(c['libdir']),
+ 'the directory for libraries'),
+ PathItem.new('datadir', 'path', parameterize.call(c['datadir']),
+ 'the directory for shared data'),
+ PathItem.new('mandir', 'path', parameterize.call(c['mandir']),
+ 'the directory for man pages'),
+ PathItem.new('sysconfdir', 'path', parameterize.call(c['sysconfdir']),
+ 'the directory for system configuration files'),
+ PathItem.new('localstatedir', 'path', parameterize.call(c['localstatedir']),
+ 'the directory for local state data'),
+ PathItem.new('libruby', 'path', libruby,
+ 'the directory for ruby libraries'),
+ PathItem.new('librubyver', 'path', librubyver,
+ 'the directory for standard ruby libraries'),
+ PathItem.new('librubyverarch', 'path', librubyverarch,
+ 'the directory for standard ruby extensions'),
+ PathItem.new('siteruby', 'path', siteruby,
+ 'the directory for version-independent aux ruby libraries'),
+ PathItem.new('siterubyver', 'path', siterubyver,
+ 'the directory for aux ruby libraries'),
+ PathItem.new('siterubyverarch', 'path', siterubyverarch,
+ 'the directory for aux ruby binaries'),
+ PathItem.new('rbdir', 'path', '$siterubyver',
+ 'the directory for ruby scripts'),
+ PathItem.new('sodir', 'path', '$siterubyverarch',
+ 'the directory for ruby extentions'),
+ PathItem.new('rubypath', 'path', rubypath,
+ 'the path to set to #! line'),
+ ProgramItem.new('rubyprog', 'name', rubypath,
+ 'the ruby program using for installation'),
+ ProgramItem.new('makeprog', 'name', makeprog,
+ 'the make program to compile ruby extentions'),
+ SelectItem.new('shebang', 'all/ruby/never', 'ruby',
+ 'shebang line (#!) editing mode'),
+ BoolItem.new('without-ext', 'yes/no', 'no',
+ 'does not compile/install ruby extentions')
+ ]
+ end
+ private :standard_entries
+
+ def load_multipackage_entries
+ multipackage_entries().each do |ent|
+ add ent
+ end
+ end
+
+ def multipackage_entries
+ [
+ PackageSelectionItem.new('with', 'name,name...', '', 'ALL',
+ 'package names that you want to install'),
+ PackageSelectionItem.new('without', 'name,name...', '', 'NONE',
+ 'package names that you do not want to install')
+ ]
+ end
+ private :multipackage_entries
+
+ ALIASES = {
+ 'std-ruby' => 'librubyver',
+ 'stdruby' => 'librubyver',
+ 'rubylibdir' => 'librubyver',
+ 'archdir' => 'librubyverarch',
+ 'site-ruby-common' => 'siteruby', # For backward compatibility
+ 'site-ruby' => 'siterubyver', # For backward compatibility
+ 'bin-dir' => 'bindir',
+ 'bin-dir' => 'bindir',
+ 'rb-dir' => 'rbdir',
+ 'so-dir' => 'sodir',
+ 'data-dir' => 'datadir',
+ 'ruby-path' => 'rubypath',
+ 'ruby-prog' => 'rubyprog',
+ 'ruby' => 'rubyprog',
+ 'make-prog' => 'makeprog',
+ 'make' => 'makeprog'
+ }
+
+ def fixup
+ ALIASES.each do |ali, name|
+ @table[ali] = @table[name]
+ end
+ @items.freeze
+ @table.freeze
+ @options_re = /\A--(#{@table.keys.join('|')})(?:=(.*))?\z/
+ end
+
+ def parse_opt(opt)
+ m = @options_re.match(opt) or setup_rb_error "config: unknown option #{opt}"
+ m.to_a[1,2]
+ end
+
+ def dllext
+ @rbconfig['DLEXT']
+ end
+
+ def value_config?(name)
+ lookup(name).value?
+ end
+
+ class Item
+ def initialize(name, template, default, desc)
+ @name = name.freeze
+ @template = template
+ @value = default
+ @default = default
+ @description = desc
+ end
+
+ attr_reader :name
+ attr_reader :description
+
+ attr_accessor :default
+ alias help_default default
+
+ def help_opt
+ "--#{@name}=#{@template}"
+ end
+
+ def value?
+ true
+ end
+
+ def value
+ @value
+ end
+
+ def resolve(table)
+ @value.gsub(%r<\$([^/]+)>) { table[$1] }
+ end
+
+ def set(val)
+ @value = check(val)
+ end
+
+ private
+
+ def check(val)
+ setup_rb_error "config: --#{name} requires argument" unless val
+ val
+ end
+ end
+
+ class BoolItem < Item
+ def config_type
+ 'bool'
+ end
+
+ def help_opt
+ "--#{@name}"
+ end
+
+ private
+
+ def check(val)
+ return 'yes' unless val
+ case val
+ when /\Ay(es)?\z/i, /\At(rue)?\z/i then 'yes'
+ when /\An(o)?\z/i, /\Af(alse)\z/i then 'no'
+ else
+ setup_rb_error "config: --#{@name} accepts only yes/no for argument"
+ end
+ end
+ end
+
+ class PathItem < Item
+ def config_type
+ 'path'
+ end
+
+ private
+
+ def check(path)
+ setup_rb_error "config: --#{@name} requires argument" unless path
+ path[0,1] == '$' ? path : File.expand_path(path)
+ end
+ end
+
+ class ProgramItem < Item
+ def config_type
+ 'program'
+ end
+ end
+
+ class SelectItem < Item
+ def initialize(name, selection, default, desc)
+ super
+ @ok = selection.split('/')
+ end
+
+ def config_type
+ 'select'
+ end
+
+ private
+
+ def check(val)
+ unless @ok.include?(val.strip)
+ setup_rb_error "config: use --#{@name}=#{@template} (#{val})"
+ end
+ val.strip
+ end
+ end
+
+ class ExecItem < Item
+ def initialize(name, selection, desc, &block)
+ super name, selection, nil, desc
+ @ok = selection.split('/')
+ @action = block
+ end
+
+ def config_type
+ 'exec'
+ end
+
+ def value?
+ false
+ end
+
+ def resolve(table)
+ setup_rb_error "$#{name()} wrongly used as option value"
+ end
+
+ undef set
+
+ def evaluate(val, table)
+ v = val.strip.downcase
+ unless @ok.include?(v)
+ setup_rb_error "invalid option --#{@name}=#{val} (use #{@template})"
+ end
+ @action.call v, table
+ end
+ end
+
+ class PackageSelectionItem < Item
+ def initialize(name, template, default, help_default, desc)
+ super name, template, default, desc
+ @help_default = help_default
+ end
+
+ attr_reader :help_default
+
+ def config_type
+ 'package'
+ end
+
+ private
+
+ def check(val)
+ unless File.dir?("packages/#{val}")
+ setup_rb_error "config: no such package: #{val}"
+ end
+ val
+ end
+ end
+
+ class MetaConfigEnvironment
+ def initialize(config, installer)
+ @config = config
+ @installer = installer
+ end
+
+ def config_names
+ @config.names
+ end
+
+ def config?(name)
+ @config.key?(name)
+ end
+
+ def bool_config?(name)
+ @config.lookup(name).config_type == 'bool'
+ end
+
+ def path_config?(name)
+ @config.lookup(name).config_type == 'path'
+ end
+
+ def value_config?(name)
+ @config.lookup(name).config_type != 'exec'
+ end
+
+ def add_config(item)
+ @config.add item
+ end
+
+ def add_bool_config(name, default, desc)
+ @config.add BoolItem.new(name, 'yes/no', default ? 'yes' : 'no', desc)
+ end
+
+ def add_path_config(name, default, desc)
+ @config.add PathItem.new(name, 'path', default, desc)
+ end
+
+ def set_config_default(name, default)
+ @config.lookup(name).default = default
+ end
+
+ def remove_config(name)
+ @config.remove(name)
+ end
+
+ # For only multipackage
+ def packages
+ raise '[setup.rb fatal] multi-package metaconfig API packages() called for single-package; contact application package vendor' unless @installer
+ @installer.packages
+ end
+
+ # For only multipackage
+ def declare_packages(list)
+ raise '[setup.rb fatal] multi-package metaconfig API declare_packages() called for single-package; contact application package vendor' unless @installer
+ @installer.packages = list
+ end
+ end
+
+end # class ConfigTable
+
+
+# This module requires: #verbose?, #no_harm?
+module FileOperations
+
+ def mkdir_p(dirname, prefix = nil)
+ dirname = prefix + File.expand_path(dirname) if prefix
+ $stderr.puts "mkdir -p #{dirname}" if verbose?
+ return if no_harm?
+
+ # Does not check '/', it's too abnormal.
+ dirs = File.expand_path(dirname).split(%r<(?=/)>)
+ if /\A[a-z]:\z/i =~ dirs[0]
+ disk = dirs.shift
+ dirs[0] = disk + dirs[0]
+ end
+ dirs.each_index do |idx|
+ path = dirs[0..idx].join('')
+ Dir.mkdir path unless File.dir?(path)
+ end
+ end
+
+ def rm_f(path)
+ $stderr.puts "rm -f #{path}" if verbose?
+ return if no_harm?
+ force_remove_file path
+ end
+
+ def rm_rf(path)
+ $stderr.puts "rm -rf #{path}" if verbose?
+ return if no_harm?
+ remove_tree path
+ end
+
+ def remove_tree(path)
+ if File.symlink?(path)
+ remove_file path
+ elsif File.dir?(path)
+ remove_tree0 path
+ else
+ force_remove_file path
+ end
+ end
+
+ def remove_tree0(path)
+ Dir.foreach(path) do |ent|
+ next if ent == '.'
+ next if ent == '..'
+ entpath = "#{path}/#{ent}"
+ if File.symlink?(entpath)
+ remove_file entpath
+ elsif File.dir?(entpath)
+ remove_tree0 entpath
+ else
+ force_remove_file entpath
+ end
+ end
+ begin
+ Dir.rmdir path
+ rescue Errno::ENOTEMPTY
+ # directory may not be empty
+ end
+ end
+
+ def move_file(src, dest)
+ force_remove_file dest
+ begin
+ File.rename src, dest
+ rescue
+ File.open(dest, 'wb') {|f|
+ f.write File.binread(src)
+ }
+ File.chmod File.stat(src).mode, dest
+ File.unlink src
+ end
+ end
+
+ def force_remove_file(path)
+ begin
+ remove_file path
+ rescue
+ end
+ end
+
+ def remove_file(path)
+ File.chmod 0777, path
+ File.unlink path
+ end
+
+ def install(from, dest, mode, prefix = nil)
+ $stderr.puts "install #{from} #{dest}" if verbose?
+ return if no_harm?
+
+ realdest = prefix ? prefix + File.expand_path(dest) : dest
+ realdest = File.join(realdest, File.basename(from)) if File.dir?(realdest)
+ str = File.binread(from)
+ if diff?(str, realdest)
+ verbose_off {
+ rm_f realdest if File.exist?(realdest)
+ }
+ File.open(realdest, 'wb') {|f|
+ f.write str
+ }
+ File.chmod mode, realdest
+
+ File.open("#{objdir_root()}/InstalledFiles", 'a') {|f|
+ if prefix
+ f.puts realdest.sub(prefix, '')
+ else
+ f.puts realdest
+ end
+ }
+ end
+ end
+
+ def diff?(new_content, path)
+ return true unless File.exist?(path)
+ new_content != File.binread(path)
+ end
+
+ def command(*args)
+ $stderr.puts args.join(' ') if verbose?
+ system(*args) or raise RuntimeError,
+ "system(#{args.map{|a| a.inspect }.join(' ')}) failed"
+ end
+
+ def ruby(*args)
+ command config('rubyprog'), *args
+ end
+
+ def make(task = nil)
+ command(*[config('makeprog'), task].compact)
+ end
+
+ def extdir?(dir)
+ File.exist?("#{dir}/MANIFEST") or File.exist?("#{dir}/extconf.rb")
+ end
+
+ def files_of(dir)
+ Dir.open(dir) {|d|
+ return d.select {|ent| File.file?("#{dir}/#{ent}") }
+ }
+ end
+
+ DIR_REJECT = %w( . .. CVS SCCS RCS CVS.adm .svn )
+
+ def directories_of(dir)
+ Dir.open(dir) {|d|
+ return d.select {|ent| File.dir?("#{dir}/#{ent}") } - DIR_REJECT
+ }
+ end
+
+end
+
+
+# This module requires: #srcdir_root, #objdir_root, #relpath
+module HookScriptAPI
+
+ def get_config(key)
+ @config[key]
+ end
+
+ alias config get_config
+
+ # obsolete: use metaconfig to change configuration
+ def set_config(key, val)
+ @config[key] = val
+ end
+
+ #
+ # srcdir/objdir (works only in the package directory)
+ #
+
+ def curr_srcdir
+ "#{srcdir_root()}/#{relpath()}"
+ end
+
+ def curr_objdir
+ "#{objdir_root()}/#{relpath()}"
+ end
+
+ def srcfile(path)
+ "#{curr_srcdir()}/#{path}"
+ end
+
+ def srcexist?(path)
+ File.exist?(srcfile(path))
+ end
+
+ def srcdirectory?(path)
+ File.dir?(srcfile(path))
+ end
+
+ def srcfile?(path)
+ File.file?(srcfile(path))
+ end
+
+ def srcentries(path = '.')
+ Dir.open("#{curr_srcdir()}/#{path}") {|d|
+ return d.to_a - %w(. ..)
+ }
+ end
+
+ def srcfiles(path = '.')
+ srcentries(path).select {|fname|
+ File.file?(File.join(curr_srcdir(), path, fname))
+ }
+ end
+
+ def srcdirectories(path = '.')
+ srcentries(path).select {|fname|
+ File.dir?(File.join(curr_srcdir(), path, fname))
+ }
+ end
+
+end
+
+
+class ToplevelInstaller
+
+ Version = '3.4.1'
+ Copyright = 'Copyright (c) 2000-2005 Minero Aoki'
+
+ TASKS = [
+ [ 'all', 'do config, setup, then install' ],
+ [ 'config', 'saves your configurations' ],
+ [ 'show', 'shows current configuration' ],
+ [ 'setup', 'compiles ruby extentions and others' ],
+ [ 'install', 'installs files' ],
+ [ 'test', 'run all tests in test/' ],
+ [ 'clean', "does `make clean' for each extention" ],
+ [ 'distclean',"does `make distclean' for each extention" ]
+ ]
+
+ def ToplevelInstaller.invoke
+ config = ConfigTable.new(load_rbconfig())
+ config.load_standard_entries
+ config.load_multipackage_entries if multipackage?
+ config.fixup
+ klass = (multipackage?() ? ToplevelInstallerMulti : ToplevelInstaller)
+ klass.new(File.dirname($0), config).invoke
+ end
+
+ def ToplevelInstaller.multipackage?
+ File.dir?(File.dirname($0) + '/packages')
+ end
+
+ def ToplevelInstaller.load_rbconfig
+ if arg = ARGV.detect {|arg| /\A--rbconfig=/ =~ arg }
+ ARGV.delete(arg)
+ load File.expand_path(arg.split(/=/, 2)[1])
+ $".push 'rbconfig.rb'
+ else
+ require 'rbconfig'
+ end
+ ::Config::CONFIG
+ end
+
+ def initialize(ardir_root, config)
+ @ardir = File.expand_path(ardir_root)
+ @config = config
+ # cache
+ @valid_task_re = nil
+ end
+
+ def config(key)
+ @config[key]
+ end
+
+ def inspect
+ "#<#{self.class} #{__id__()}>"
+ end
+
+ def invoke
+ run_metaconfigs
+ case task = parsearg_global()
+ when nil, 'all'
+ parsearg_config
+ init_installers
+ exec_config
+ exec_setup
+ exec_install
+ else
+ case task
+ when 'config', 'test'
+ ;
+ when 'clean', 'distclean'
+ @config.load_savefile if File.exist?(@config.savefile)
+ else
+ @config.load_savefile
+ end
+ __send__ "parsearg_#{task}"
+ init_installers
+ __send__ "exec_#{task}"
+ end
+ end
+
+ def run_metaconfigs
+ @config.load_script "#{@ardir}/metaconfig"
+ end
+
+ def init_installers
+ @installer = Installer.new(@config, @ardir, File.expand_path('.'))
+ end
+
+ #
+ # Hook Script API bases
+ #
+
+ def srcdir_root
+ @ardir
+ end
+
+ def objdir_root
+ '.'
+ end
+
+ def relpath
+ '.'
+ end
+
+ #
+ # Option Parsing
+ #
+
+ def parsearg_global
+ while arg = ARGV.shift
+ case arg
+ when /\A\w+\z/
+ setup_rb_error "invalid task: #{arg}" unless valid_task?(arg)
+ return arg
+ when '-q', '--quiet'
+ @config.verbose = false
+ when '--verbose'
+ @config.verbose = true
+ when '--help'
+ print_usage $stdout
+ exit 0
+ when '--version'
+ puts "#{File.basename($0)} version #{Version}"
+ exit 0
+ when '--copyright'
+ puts Copyright
+ exit 0
+ else
+ setup_rb_error "unknown global option '#{arg}'"
+ end
+ end
+ nil
+ end
+
+ def valid_task?(t)
+ valid_task_re() =~ t
+ end
+
+ def valid_task_re
+ @valid_task_re ||= /\A(?:#{TASKS.map {|task,desc| task }.join('|')})\z/
+ end
+
+ def parsearg_no_options
+ unless ARGV.empty?
+ task = caller(0).first.slice(%r<`parsearg_(\w+)'>, 1)
+ setup_rb_error "#{task}: unknown options: #{ARGV.join(' ')}"
+ end
+ end
+
+ alias parsearg_show parsearg_no_options
+ alias parsearg_setup parsearg_no_options
+ alias parsearg_test parsearg_no_options
+ alias parsearg_clean parsearg_no_options
+ alias parsearg_distclean parsearg_no_options
+
+ def parsearg_config
+ evalopt = []
+ set = []
+ @config.config_opt = []
+ while i = ARGV.shift
+ if /\A--?\z/ =~ i
+ @config.config_opt = ARGV.dup
+ break
+ end
+ name, value = *@config.parse_opt(i)
+ if @config.value_config?(name)
+ @config[name] = value
+ else
+ evalopt.push [name, value]
+ end
+ set.push name
+ end
+ evalopt.each do |name, value|
+ @config.lookup(name).evaluate value, @config
+ end
+ # Check if configuration is valid
+ set.each do |n|
+ @config[n] if @config.value_config?(n)
+ end
+ end
+
+ def parsearg_install
+ @config.no_harm = false
+ @config.install_prefix = ''
+ while a = ARGV.shift
+ case a
+ when '--no-harm'
+ @config.no_harm = true
+ when /\A--prefix=/
+ path = a.split(/=/, 2)[1]
+ path = File.expand_path(path) unless path[0,1] == '/'
+ @config.install_prefix = path
+ else
+ setup_rb_error "install: unknown option #{a}"
+ end
+ end
+ end
+
+ def print_usage(out)
+ out.puts 'Typical Installation Procedure:'
+ out.puts " $ ruby #{File.basename $0} config"
+ out.puts " $ ruby #{File.basename $0} setup"
+ out.puts " # ruby #{File.basename $0} install (may require root privilege)"
+ out.puts
+ out.puts 'Detailed Usage:'
+ out.puts " ruby #{File.basename $0} <global option>"
+ out.puts " ruby #{File.basename $0} [<global options>] <task> [<task options>]"
+
+ fmt = " %-24s %s\n"
+ out.puts
+ out.puts 'Global options:'
+ out.printf fmt, '-q,--quiet', 'suppress message outputs'
+ out.printf fmt, ' --verbose', 'output messages verbosely'
+ out.printf fmt, ' --help', 'print this message'
+ out.printf fmt, ' --version', 'print version and quit'
+ out.printf fmt, ' --copyright', 'print copyright and quit'
+ out.puts
+ out.puts 'Tasks:'
+ TASKS.each do |name, desc|
+ out.printf fmt, name, desc
+ end
+
+ fmt = " %-24s %s [%s]\n"
+ out.puts
+ out.puts 'Options for CONFIG or ALL:'
+ @config.each do |item|
+ out.printf fmt, item.help_opt, item.description, item.help_default
+ end
+ out.printf fmt, '--rbconfig=path', 'rbconfig.rb to load',"running ruby's"
+ out.puts
+ out.puts 'Options for INSTALL:'
+ out.printf fmt, '--no-harm', 'only display what to do if given', 'off'
+ out.printf fmt, '--prefix=path', 'install path prefix', ''
+ out.puts
+ end
+
+ #
+ # Task Handlers
+ #
+
+ def exec_config
+ @installer.exec_config
+ @config.save # must be final
+ end
+
+ def exec_setup
+ @installer.exec_setup
+ end
+
+ def exec_install
+ @installer.exec_install
+ end
+
+ def exec_test
+ @installer.exec_test
+ end
+
+ def exec_show
+ @config.each do |i|
+ printf "%-20s %s\n", i.name, i.value if i.value?
+ end
+ end
+
+ def exec_clean
+ @installer.exec_clean
+ end
+
+ def exec_distclean
+ @installer.exec_distclean
+ end
+
+end # class ToplevelInstaller
+
+
+class ToplevelInstallerMulti < ToplevelInstaller
+
+ include FileOperations
+
+ def initialize(ardir_root, config)
+ super
+ @packages = directories_of("#{@ardir}/packages")
+ raise 'no package exists' if @packages.empty?
+ @root_installer = Installer.new(@config, @ardir, File.expand_path('.'))
+ end
+
+ def run_metaconfigs
+ @config.load_script "#{@ardir}/metaconfig", self
+ @packages.each do |name|
+ @config.load_script "#{@ardir}/packages/#{name}/metaconfig"
+ end
+ end
+
+ attr_reader :packages
+
+ def packages=(list)
+ raise 'package list is empty' if list.empty?
+ list.each do |name|
+ raise "directory packages/#{name} does not exist"\
+ unless File.dir?("#{@ardir}/packages/#{name}")
+ end
+ @packages = list
+ end
+
+ def init_installers
+ @installers = {}
+ @packages.each do |pack|
+ @installers[pack] = Installer.new(@config,
+ "#{@ardir}/packages/#{pack}",
+ "packages/#{pack}")
+ end
+ with = extract_selection(config('with'))
+ without = extract_selection(config('without'))
+ @selected = @installers.keys.select {|name|
+ (with.empty? or with.include?(name)) \
+ and not without.include?(name)
+ }
+ end
+
+ def extract_selection(list)
+ a = list.split(/,/)
+ a.each do |name|
+ setup_rb_error "no such package: #{name}" unless @installers.key?(name)
+ end
+ a
+ end
+
+ def print_usage(f)
+ super
+ f.puts 'Inluded packages:'
+ f.puts ' ' + @packages.sort.join(' ')
+ f.puts
+ end
+
+ #
+ # Task Handlers
+ #
+
+ def exec_config
+ run_hook 'pre-config'
+ each_selected_installers {|inst| inst.exec_config }
+ run_hook 'post-config'
+ @config.save # must be final
+ end
+
+ def exec_setup
+ run_hook 'pre-setup'
+ each_selected_installers {|inst| inst.exec_setup }
+ run_hook 'post-setup'
+ end
+
+ def exec_install
+ run_hook 'pre-install'
+ each_selected_installers {|inst| inst.exec_install }
+ run_hook 'post-install'
+ end
+
+ def exec_test
+ run_hook 'pre-test'
+ each_selected_installers {|inst| inst.exec_test }
+ run_hook 'post-test'
+ end
+
+ def exec_clean
+ rm_f @config.savefile
+ run_hook 'pre-clean'
+ each_selected_installers {|inst| inst.exec_clean }
+ run_hook 'post-clean'
+ end
+
+ def exec_distclean
+ rm_f @config.savefile
+ run_hook 'pre-distclean'
+ each_selected_installers {|inst| inst.exec_distclean }
+ run_hook 'post-distclean'
+ end
+
+ #
+ # lib
+ #
+
+ def each_selected_installers
+ Dir.mkdir 'packages' unless File.dir?('packages')
+ @selected.each do |pack|
+ $stderr.puts "Processing the package `#{pack}' ..." if verbose?
+ Dir.mkdir "packages/#{pack}" unless File.dir?("packages/#{pack}")
+ Dir.chdir "packages/#{pack}"
+ yield @installers[pack]
+ Dir.chdir '../..'
+ end
+ end
+
+ def run_hook(id)
+ @root_installer.run_hook id
+ end
+
+ # module FileOperations requires this
+ def verbose?
+ @config.verbose?
+ end
+
+ # module FileOperations requires this
+ def no_harm?
+ @config.no_harm?
+ end
+
+end # class ToplevelInstallerMulti
+
+
+class Installer
+
+ FILETYPES = %w( bin lib ext data conf man )
+
+ include FileOperations
+ include HookScriptAPI
+
+ def initialize(config, srcroot, objroot)
+ @config = config
+ @srcdir = File.expand_path(srcroot)
+ @objdir = File.expand_path(objroot)
+ @currdir = '.'
+ end
+
+ def inspect
+ "#<#{self.class} #{File.basename(@srcdir)}>"
+ end
+
+ def noop(rel)
+ end
+
+ #
+ # Hook Script API base methods
+ #
+
+ def srcdir_root
+ @srcdir
+ end
+
+ def objdir_root
+ @objdir
+ end
+
+ def relpath
+ @currdir
+ end
+
+ #
+ # Config Access
+ #
+
+ # module FileOperations requires this
+ def verbose?
+ @config.verbose?
+ end
+
+ # module FileOperations requires this
+ def no_harm?
+ @config.no_harm?
+ end
+
+ def verbose_off
+ begin
+ save, @config.verbose = @config.verbose?, false
+ yield
+ ensure
+ @config.verbose = save
+ end
+ end
+
+ #
+ # TASK config
+ #
+
+ def exec_config
+ exec_task_traverse 'config'
+ end
+
+ alias config_dir_bin noop
+ alias config_dir_lib noop
+
+ def config_dir_ext(rel)
+ extconf if extdir?(curr_srcdir())
+ end
+
+ alias config_dir_data noop
+ alias config_dir_conf noop
+ alias config_dir_man noop
+
+ def extconf
+ ruby "#{curr_srcdir()}/extconf.rb", *@config.config_opt
+ end
+
+ #
+ # TASK setup
+ #
+
+ def exec_setup
+ exec_task_traverse 'setup'
+ end
+
+ def setup_dir_bin(rel)
+ files_of(curr_srcdir()).each do |fname|
+ update_shebang_line "#{curr_srcdir()}/#{fname}"
+ end
+ end
+
+ alias setup_dir_lib noop
+
+ def setup_dir_ext(rel)
+ make if extdir?(curr_srcdir())
+ end
+
+ alias setup_dir_data noop
+ alias setup_dir_conf noop
+ alias setup_dir_man noop
+
+ def update_shebang_line(path)
+ return if no_harm?
+ return if config('shebang') == 'never'
+ old = Shebang.load(path)
+ if old
+ $stderr.puts "warning: #{path}: Shebang line includes too many args. It is not portable and your program may not work." if old.args.size > 1
+ new = new_shebang(old)
+ return if new.to_s == old.to_s
+ else
+ return unless config('shebang') == 'all'
+ new = Shebang.new(config('rubypath'))
+ end
+ $stderr.puts "updating shebang: #{File.basename(path)}" if verbose?
+ open_atomic_writer(path) {|output|
+ File.open(path, 'rb') {|f|
+ f.gets if old # discard
+ output.puts new.to_s
+ output.print f.read
+ }
+ }
+ end
+
+ def new_shebang(old)
+ if /\Aruby/ =~ File.basename(old.cmd)
+ Shebang.new(config('rubypath'), old.args)
+ elsif File.basename(old.cmd) == 'env' and old.args.first == 'ruby'
+ Shebang.new(config('rubypath'), old.args[1..-1])
+ else
+ return old unless config('shebang') == 'all'
+ Shebang.new(config('rubypath'))
+ end
+ end
+
+ def open_atomic_writer(path, &block)
+ tmpfile = File.basename(path) + '.tmp'
+ begin
+ File.open(tmpfile, 'wb', &block)
+ File.rename tmpfile, File.basename(path)
+ ensure
+ File.unlink tmpfile if File.exist?(tmpfile)
+ end
+ end
+
+ class Shebang
+ def Shebang.load(path)
+ line = nil
+ File.open(path) {|f|
+ line = f.gets
+ }
+ return nil unless /\A#!/ =~ line
+ parse(line)
+ end
+
+ def Shebang.parse(line)
+ cmd, *args = *line.strip.sub(/\A\#!/, '').split(' ')
+ new(cmd, args)
+ end
+
+ def initialize(cmd, args = [])
+ @cmd = cmd
+ @args = args
+ end
+
+ attr_reader :cmd
+ attr_reader :args
+
+ def to_s
+ "#! #{@cmd}" + (@args.empty? ? '' : " #{@args.join(' ')}")
+ end
+ end
+
+ #
+ # TASK install
+ #
+
+ def exec_install
+ rm_f 'InstalledFiles'
+ exec_task_traverse 'install'
+ end
+
+ def install_dir_bin(rel)
+ install_files targetfiles(), "#{config('bindir')}/#{rel}", 0755
+ end
+
+ def install_dir_lib(rel)
+ install_files libfiles(), "#{config('rbdir')}/#{rel}", 0644
+ end
+
+ def install_dir_ext(rel)
+ return unless extdir?(curr_srcdir())
+ install_files rubyextentions('.'),
+ "#{config('sodir')}/#{File.dirname(rel)}",
+ 0555
+ end
+
+ def install_dir_data(rel)
+ install_files targetfiles(), "#{config('datadir')}/#{rel}", 0644
+ end
+
+ def install_dir_conf(rel)
+ # FIXME: should not remove current config files
+ # (rename previous file to .old/.org)
+ install_files targetfiles(), "#{config('sysconfdir')}/#{rel}", 0644
+ end
+
+ def install_dir_man(rel)
+ install_files targetfiles(), "#{config('mandir')}/#{rel}", 0644
+ end
+
+ def install_files(list, dest, mode)
+ mkdir_p dest, @config.install_prefix
+ list.each do |fname|
+ install fname, dest, mode, @config.install_prefix
+ end
+ end
+
+ def libfiles
+ glob_reject(%w(*.y *.output), targetfiles())
+ end
+
+ def rubyextentions(dir)
+ ents = glob_select("*.#{@config.dllext}", targetfiles())
+ if ents.empty?
+ setup_rb_error "no ruby extention exists: 'ruby #{$0} setup' first"
+ end
+ ents
+ end
+
+ def targetfiles
+ mapdir(existfiles() - hookfiles())
+ end
+
+ def mapdir(ents)
+ ents.map {|ent|
+ if File.exist?(ent)
+ then ent # objdir
+ else "#{curr_srcdir()}/#{ent}" # srcdir
+ end
+ }
+ end
+
+ # picked up many entries from cvs-1.11.1/src/ignore.c
+ JUNK_FILES = %w(
+ core RCSLOG tags TAGS .make.state
+ .nse_depinfo #* .#* cvslog.* ,* .del-* *.olb
+ *~ *.old *.bak *.BAK *.orig *.rej _$* *$
+
+ *.org *.in .*
+ )
+
+ def existfiles
+ glob_reject(JUNK_FILES, (files_of(curr_srcdir()) | files_of('.')))
+ end
+
+ def hookfiles
+ %w( pre-%s post-%s pre-%s.rb post-%s.rb ).map {|fmt|
+ %w( config setup install clean ).map {|t| sprintf(fmt, t) }
+ }.flatten
+ end
+
+ def glob_select(pat, ents)
+ re = globs2re([pat])
+ ents.select {|ent| re =~ ent }
+ end
+
+ def glob_reject(pats, ents)
+ re = globs2re(pats)
+ ents.reject {|ent| re =~ ent }
+ end
+
+ GLOB2REGEX = {
+ '.' => '\.',
+ '$' => '\$',
+ '#' => '\#',
+ '*' => '.*'
+ }
+
+ def globs2re(pats)
+ /\A(?:#{
+ pats.map {|pat| pat.gsub(/[\.\$\#\*]/) {|ch| GLOB2REGEX[ch] } }.join('|')
+ })\z/
+ end
+
+ #
+ # TASK test
+ #
+
+ TESTDIR = 'test'
+
+ def exec_test
+ unless File.directory?('test')
+ $stderr.puts 'no test in this package' if verbose?
+ return
+ end
+ $stderr.puts 'Running tests...' if verbose?
+ begin
+ require 'test/unit'
+ rescue LoadError
+ setup_rb_error 'test/unit cannot loaded. You need Ruby 1.8 or later to invoke this task.'
+ end
+ runner = Test::Unit::AutoRunner.new(true)
+ runner.to_run << TESTDIR
+ runner.run
+ end
+
+ #
+ # TASK clean
+ #
+
+ def exec_clean
+ exec_task_traverse 'clean'
+ rm_f @config.savefile
+ rm_f 'InstalledFiles'
+ end
+
+ alias clean_dir_bin noop
+ alias clean_dir_lib noop
+ alias clean_dir_data noop
+ alias clean_dir_conf noop
+ alias clean_dir_man noop
+
+ def clean_dir_ext(rel)
+ return unless extdir?(curr_srcdir())
+ make 'clean' if File.file?('Makefile')
+ end
+
+ #
+ # TASK distclean
+ #
+
+ def exec_distclean
+ exec_task_traverse 'distclean'
+ rm_f @config.savefile
+ rm_f 'InstalledFiles'
+ end
+
+ alias distclean_dir_bin noop
+ alias distclean_dir_lib noop
+
+ def distclean_dir_ext(rel)
+ return unless extdir?(curr_srcdir())
+ make 'distclean' if File.file?('Makefile')
+ end
+
+ alias distclean_dir_data noop
+ alias distclean_dir_conf noop
+ alias distclean_dir_man noop
+
+ #
+ # Traversing
+ #
+
+ def exec_task_traverse(task)
+ run_hook "pre-#{task}"
+ FILETYPES.each do |type|
+ if type == 'ext' and config('without-ext') == 'yes'
+ $stderr.puts 'skipping ext/* by user option' if verbose?
+ next
+ end
+ traverse task, type, "#{task}_dir_#{type}"
+ end
+ run_hook "post-#{task}"
+ end
+
+ def traverse(task, rel, mid)
+ dive_into(rel) {
+ run_hook "pre-#{task}"
+ __send__ mid, rel.sub(%r[\A.*?(?:/|\z)], '')
+ directories_of(curr_srcdir()).each do |d|
+ traverse task, "#{rel}/#{d}", mid
+ end
+ run_hook "post-#{task}"
+ }
+ end
+
+ def dive_into(rel)
+ return unless File.dir?("#{@srcdir}/#{rel}")
+
+ dir = File.basename(rel)
+ Dir.mkdir dir unless File.dir?(dir)
+ prevdir = Dir.pwd
+ Dir.chdir dir
+ $stderr.puts '---> ' + rel if verbose?
+ @currdir = rel
+ yield
+ Dir.chdir prevdir
+ $stderr.puts '<--- ' + rel if verbose?
+ @currdir = File.dirname(rel)
+ end
+
+ def run_hook(id)
+ path = [ "#{curr_srcdir()}/#{id}",
+ "#{curr_srcdir()}/#{id}.rb" ].detect {|cand| File.file?(cand) }
+ return unless path
+ begin
+ instance_eval File.read(path), path, 1
+ rescue
+ raise if $DEBUG
+ setup_rb_error "hook #{path} failed:\n" + $!.message
+ end
+ end
+
+end # class Installer
+
+
+class SetupError < StandardError; end
+
+def setup_rb_error(msg)
+ raise SetupError, msg
+end
+
+if $0 == __FILE__
+ begin
+ ToplevelInstaller.invoke
+ rescue SetupError
+ raise if $DEBUG
+ $stderr.puts $!.message
+ $stderr.puts "Try 'ruby #{$0} --help' for detailed usage."
+ exit 1
+ end
+end
34 tasks/deployment.rake
@@ -0,0 +1,34 @@
+desc 'Release the website and new gem version'
+task :deploy => [:check_version, :website, :release] do
+ puts "Remember to create SVN tag:"
+ puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
+ "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
+ puts "Suggested comment:"
+ puts "Tagging release #{CHANGES}"
+end
+
+desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
+task :local_deploy => [:website_generate, :install_gem]
+
+task :check_version do
+ unless ENV['VERSION']
+ puts 'Must pass a VERSION=x.y.z release version'
+ exit
+ end
+ unless ENV['VERSION'] == VERS
+ puts "Please update your version.rb to match the release version, currently #{VERS}"
+ exit
+ end
+end
+
+desc 'Install the package as a gem, without generating documentation(ri/rdoc)'
+task :install_gem_no_doc => [:clean, :package] do
+ sh "#{'sudo ' unless Hoe::WINDOZE }gem install pkg/*.gem --no-rdoc --no-ri"
+end
+
+namespace :manifest do
+ desc 'Recreate Manifest.txt to include ALL files'
+ task :refresh do
+ `rake check_manifest | patch -p0 > Manifest.txt`
+ end
+end
7 tasks/environment.rake
@@ -0,0 +1,7 @@
+task :ruby_env do
+ RUBY_APP = if RUBY_PLATFORM =~ /java/
+ "jruby"
+ else
+ "ruby"
+ end unless defined? RUBY_APP
+end
17 tasks/website.rake
@@ -0,0 +1,17 @@
+desc 'Generate website files'
+task :website_generate => :ruby_env do
+ (Dir['website/**/*.txt'] - Dir['website/version*.txt']).each do |txt|
+ sh %{ #{RUBY_APP} script/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
+ end
+end
+
+desc 'Upload website files to rubyforge'
+task :website_upload do
+ host = "#{rubyforge_username}@rubyforge.org"
+ remote_dir = "/var/www/gforge-projects/#{PATH}/"
+ local_dir = 'website'
+ sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}}
+end
+
+desc 'Generate and upload website files'
+task :website => [:website_generate, :website_upload, :publish_docs]
11 test/test_faker.rb
@@ -0,0 +1,11 @@
+require File.dirname(__FILE__) + '/test_helper.rb'
+
+class TestFaker < Test::Unit::TestCase
+
+ def setup
+ end
+
+ def test_truth
+ assert true
+ end
+end
2  test/test_helper.rb
@@ -0,0 +1,2 @@
+require 'test/unit'
+require File.dirname(__FILE__) + '/../lib/faker'
90 website/index.html
@@ -0,0 +1,90 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <link rel="stylesheet" href="stylesheets/screen.css" type="text/css" media="screen" />
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <title>
+ faker
+ </title>
+ <script src="javascripts/rounded_corners_lite.inc.js" type="text/javascript"></script>
+<style>
+
+</style>
+ <script type="text/javascript">
+ window.onload = function() {
+ settings = {
+ tl: { radius: 10 },
+ tr: { radius: 10 },
+ bl: { radius: 10 },
+ br: { radius: 10 },
+ antiAlias: true,
+ autoPad: true,
+ validTags: ["div"]
+ }
+ var versionBox = new curvyCorners(settings, document.getElementById("version"));
+ versionBox.applyCornersToAll();
+ }
+ </script>
+</head>
+<body>
+<div id="main">
+
+ <h1>faker</h1>
+ <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/faker"; return false'>
+ <p>Get Version</p>
+ <a href="http://rubyforge.org/projects/faker" class="numbers">0.1.0</a>
+ </div>
+ <h1>&#x2192; &#8216;faker&#8217;</h1>
+
+
+ <h2>What</h2>
+
+
+ <h2>Installing</h2>
+
+
+ <p><pre class='syntax'><span class="ident">sudo</span> <span class="ident">gem</span> <span class="ident">install</span> <span class="ident">faker</span></pre></p>
+
+
+ <h2>Usage</h2>
+
+
+ <p>Faker::Name.name #=&gt; &#8220;Bob Hope&#8221;</p>
+
+
+ <h2>Forum</h2>
+
+
+ <p><a href="http://groups.google.com/group/ruby-faker">http://groups.google.com/group/ruby-faker</a></p>
+
+
+ <h2>How to submit patches</h2>
+
+
+ <p>Read the <a href="http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/">8 steps for fixing other people&#8217;s code</a> and for section <a href="http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/#8b-google-groups">8b: Submit patch to Google Groups</a>, use the Google Group above.</p>
+
+
+ <p>The trunk repository is <code>svn://rubyforge.org/var/svn/faker/trunk</code> for anonymous access.</p>
+
+
+ <h2>License</h2>
+
+
+ <p>This code is free to use under the terms of the <span class="caps">MIT</span> license.</p>
+
+
+ <h2>Contact</h2>
+
+
+ <p>Comments are welcome. Send an email to <a href="mailto:benjamin.curtis@gmail.com">Benjamin Curtis</a> via the <a href="http://groups.google.com/group/faker">forum</a></p>
+ <p class="coda">
+ <a href="http://www.bencurtis.com/">Benjamin Curtis</a>, 21st November 2007<br>
+ Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
+ </p>
+</div>
+
+<!-- insert site tracking codes here, like Google Urchin -->
+
+</body>
+</html>
33 website/index.txt
@@ -0,0 +1,33 @@
+h1. faker
+
+h2. What
+
+Faker is used to easily generate fake data: names, addresses, phone numbers, etc.
+
+h2. Installing
+
+<pre syntax="ruby">sudo gem install faker</pre>
+
+h2. Usage
+
+Faker::Name.name #=> "Bob Hope"
+
+h2. Forum
+
+"http://groups.google.com/group/ruby-faker":http://groups.google.com/group/ruby-faker
+
+
+h2. How to submit patches
+
+Read the "8 steps for fixing other people's code":http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/ and for section "8b: Submit patch to Google Groups":http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/#8b-google-groups, use the Google Group above.
+
+The trunk repository is <code>svn://rubyforge.org/var/svn/faker/trunk</code> for anonymous access.
+
+h2. License
+
+This code is free to use under the terms of the MIT license.
+
+h2. Contact
+
+Comments are welcome. Send an email to Benjamin Curtis via the "forum":http://groups.google.com/group/ruby-faker
+
285 website/javascripts/rounded_corners_lite.inc.js
@@ -0,0 +1,285 @@
+
+ /****************************************************************
+ * *
+ * curvyCorners *
+ * ------------ *
+ * *
+ * This script generates rounded corners for your divs. *
+ * *
+ * Version 1.2.9 *
+ * Copyright (c) 2006 Cameron Cooke *
+ * By: Cameron Cooke and Tim Hutchison. *
+ * *
+ * *
+ * Website: http://www.curvycorners.net *
+ * Email: info@totalinfinity.com *
+ * Forum: http://www.curvycorners.net/forum/ *
+ * *
+ * *
+ * This library is free software; you can redistribute *
+ * it and/or modify it under the terms of the GNU *
+ * Lesser General Public License as published by the *
+ * Free Software Foundation; either version 2.1 of the *
+ * License, or (at your option) any later version. *
+ * *
+ * This library is distributed in the hope that it will *
+ * be useful, but WITHOUT ANY WARRANTY; without even the *
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A *
+ * PARTICULAR PURPOSE. See the GNU Lesser General Public *
+ * License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser *
+ * General Public License along with this library; *
+ * Inc., 59 Temple Place, Suite 330, Boston, *
+ * MA 02111-1307 USA *
+ * *
+ ****************************************************************/
+
+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()
+{ 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")
+{ var startIndex = 0; var boxCol = getElementsByClass(arguments[1]);}
+else
+{ var startIndex = 1; var boxCol = arguments;}
+var curvyCornersCol = new Array(); if(arguments[0].validTags)
+var validElements = arguments[0].validTags; else
+var validElements = ["div"]; for(var i = startIndex, j = boxCol.length; i < j; i++)
+{ var currentTag = boxCol[i].tagName.toLowerCase(); if(inArray(validElements, currentTag) !== false)
+{ curvyCornersCol[curvyCornersCol.length] = new curvyObject(arguments[0], boxCol[i]);}
+}
+this.objects = curvyCornersCol; this.applyCornersToAll = function()
+{ for(var x = 0, k = this.objects.length; x < k; x++)
+{ this.objects[x].applyCorners();}
+}
+}
+function curvyObject()
+{ 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)
+this.box.innerHTML = ""; this.applyCorners = function()
+{ for(var t = 0; t < 2; t++)
+{ switch(t)
+{ case 0:
+if(this.settings.tl || this.settings.tr)
+{ 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);}
+break; case 1:
+if(this.settings.bl || this.settings.br)
+{ 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);}
+break;}
+}
+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)
+{ if(i > -1 < 4)
+{ var cc = corners[i]; if(!this.settings[cc])
+{ if(((cc == "tr" || cc == "tl") && this.topContainer != null) || ((cc == "br" || cc == "bl") && this.bottomContainer != null))
+{ var newCorner = document.createElement("DIV"); newCorner.style.position = "relative"; newCorner.style.fontSize = "1px"; newCorner.style.overflow = "hidden"; if(this.backgroundImage == "")
+newCorner.style.backgroundColor = this.boxColour; else
+newCorner.style.backgroundImage = this.backgroundImage; switch(cc)
+{ case "tl":
+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":
+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":
+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":
+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"
+newCorner.style.backgroundPosition = "-" + (botMaxRadius + this.borderWidth) + "px -" + (this.boxHeight + (botMaxRadius + this.borderWidth)) + "px"; break;}
+}
+}
+else
+{ if(this.masterCorners[this.settings[cc].radius])
+{ var newCorner = this.masterCorners[this.settings[cc].radius].cloneNode(true);}
+else
+{ 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++)
+{ if((intx +1) >= borderRadius)
+var y1 = -1; else
+var y1 = (Math.floor(Math.sqrt(Math.pow(borderRadius, 2) - Math.pow((intx+1), 2))) - 1); if(borderRadius != j)
+{ if((intx) >= borderRadius)
+var y2 = -1; else
+var y2 = Math.ceil(Math.sqrt(Math.pow(borderRadius,2) - Math.pow(intx, 2))); if((intx+1) >= j)
+var y3 = -1; else
+var y3 = (Math.floor(Math.sqrt(Math.pow(j ,2) - Math.pow((intx+1), 2))) - 1);}
+if((intx) >= j)
+var y4 = -1; else