hosemonkey 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in hosemonkey.gemspec
4
+ gemspec
data/README ADDED
File without changes
@@ -0,0 +1,10 @@
1
+ require 'rspec/core/rake_task'
2
+ require "bundler/gem_tasks"
3
+
4
+ task :default => :spec
5
+
6
+ desc "Run all specs"
7
+ RSpec::Core::RakeTask.new(:spec) do |t|
8
+ t.rspec_opts = %w{--colour --format progress}
9
+ t.pattern = 'spec/*_spec.rb'
10
+ end
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "hosemonkey/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "hosemonkey"
7
+ s.version = Hosemonkey::VERSION
8
+ s.authors = ["Rob Lyon"]
9
+ s.email = ["rlyon@uidaho.edu"]
10
+ s.homepage = ""
11
+ s.summary = %q{Write a gem summary}
12
+ s.description = %q{Write a gem description}
13
+
14
+ s.rubyforge_project = "hosemonkey"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ s.add_development_dependency "rake"
23
+ s.add_development_dependency "rspec"
24
+ s.add_development_dependency "mocha"
25
+
26
+ s.add_runtime_dependency "nokogiri"
27
+ end
@@ -0,0 +1,10 @@
1
+ require "nokogiri"
2
+ require "hosemonkey/version"
3
+
4
+ module Hosemonkey
5
+
6
+ end
7
+
8
+ Dir[File.join('./lib/hosemonkey/ext', '*.rb')].each do |ext|
9
+ require ext
10
+ end
@@ -0,0 +1,6 @@
1
+ class Array
2
+ # From rails active_support
3
+ def extract_options!
4
+ last.is_a?(::Hash) ? pop : {}
5
+ end
6
+ end
@@ -0,0 +1,17 @@
1
+ module Hosemonkey
2
+ module Boolean
3
+ Mapping = {
4
+ true => true,
5
+ 'true' => true,
6
+ '1' => true,
7
+ 1 => true,
8
+ false => false,
9
+ 'false' => false,
10
+ '0' => false,
11
+ 0 => false,
12
+ nil => nil
13
+ }
14
+ end
15
+ end
16
+
17
+ class Boolean ; include Hosemonkey::Boolean ; end
@@ -0,0 +1,21 @@
1
+ class Date
2
+ # From active support
3
+ def advance(options)
4
+ options = options.dup
5
+ d = self
6
+ d = d >> options.delete(:years) * 12 if options[:years]
7
+ d = d >> options.delete(:months) if options[:months]
8
+ d = d + options.delete(:weeks) * 7 if options[:weeks]
9
+ d = d + options.delete(:days) if options[:days]
10
+ d
11
+ end
12
+
13
+ # From active support
14
+ def change(options)
15
+ ::Date.new(
16
+ options[:year] || self.year,
17
+ options[:month] || self.month,
18
+ options[:day] || self.day
19
+ )
20
+ end
21
+ end
@@ -0,0 +1,25 @@
1
+ module Hosemonkey
2
+ module Fixnum
3
+ def days
4
+ ::Time.now + (60 * 60 * 24 * self)
5
+ end
6
+
7
+ def hours
8
+ ::Time.now + (60 * 60 * self)
9
+ end
10
+
11
+ def weeks
12
+ ::Time.now + (60 * 60 * 24 * 7 * self)
13
+ end
14
+
15
+ def months
16
+ ::Time.now.advance(:months => self)
17
+ end
18
+
19
+ def years
20
+ ::Time.now.advance(:years => self)
21
+ end
22
+ end
23
+ end
24
+
25
+ class Fixnum ; include Hosemonkey::Fixnum ; end
@@ -0,0 +1,97 @@
1
+ class Hash
2
+ def stringify_keys
3
+ keys.each do |key|
4
+ self[(key.to_s rescue key) || key] = delete(key)
5
+ end
6
+ self
7
+ end
8
+
9
+ # From rails active_support. Destructively convert all keys to symbols as long as they respond to to_sym
10
+ def symbolize_keys!
11
+ keys.each do |key|
12
+ self[(key.to_sym rescue key) || key] = delete(key)
13
+ end
14
+ self
15
+ end
16
+
17
+ # From rails active_support. Return a new hash with all keys converted to symbols
18
+ def symbolize_keys
19
+ dup.symbolize_keys!
20
+ end
21
+
22
+ def include_only?(*args)
23
+ self.each do |key,value|
24
+ unless args.include?(key)
25
+ return false
26
+ end
27
+ end
28
+ return true
29
+ end
30
+
31
+ def include_only(*args)
32
+ self.each do |key,value|
33
+ unless args.include?(key)
34
+ raise "Unknown Argument"
35
+ end
36
+ end
37
+ end
38
+
39
+ class << self
40
+ # https://gist.github.com/819999
41
+ def from_xml_string(xml)
42
+ begin
43
+ result = Nokogiri::XML(xml) do |config|
44
+ config.strict.noent
45
+ end
46
+ return { result.root.name => xml_node_to_hash(result.root)}
47
+ rescue Exception => e
48
+ raise "Could not parse xml: #{e}"
49
+ end
50
+ end
51
+
52
+ # https://gist.github.com/819999
53
+ def xml_node_to_hash(node)
54
+ # If we are at the root of the document, start the hash
55
+ if node.element?
56
+ result_hash = {}
57
+ if node.attributes != {}
58
+ attributes = {}
59
+ node.attributes.keys.each do |key|
60
+ attributes[node.attributes[key].name] = node.attributes[key].value
61
+ end
62
+ end
63
+ if node.children.size > 0
64
+ node.children.each do |child|
65
+ result = xml_node_to_hash(child)
66
+
67
+ if child.name == "text"
68
+ unless child.next_sibling || child.previous_sibling
69
+ return result unless attributes
70
+ result_hash[child.name] = result
71
+ end
72
+ elsif result_hash[child.name]
73
+
74
+ if result_hash[child.name].is_a?(Object::Array)
75
+ result_hash[child.name] << result
76
+ else
77
+ result_hash[child.name] = [result_hash[child.name]] << result
78
+ end
79
+ else
80
+ result_hash[child.name] = result
81
+ end
82
+ end
83
+ if attributes
84
+ #add code to remove non-data attributes e.g. xml schema, namespace here
85
+ #if there is a collision then node content supersets attributes
86
+ result_hash = attributes.merge(result_hash)
87
+ end
88
+ return result_hash
89
+ else
90
+ return attributes
91
+ end
92
+ else
93
+ return node.content.to_s
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,61 @@
1
+ class String
2
+ # def uncamelize
3
+ # uncameled = self.each_char.inject("") do |result,c|
4
+ # unless "#{c}" =~ /^[A-Z]$/
5
+ # result << "#{c}"
6
+ # else
7
+ # result << "_" unless result.empty?
8
+ # result << "#{c}".downcase
9
+ # end
10
+ # end
11
+ # uncameled
12
+ # end
13
+
14
+ def camelize
15
+ cap_next_char = true
16
+ cameled = self.each_char.inject("") do |result, c|
17
+ unless "#{c}" =~ /^[-_]$/
18
+ unless cap_next_char
19
+ result << "#{c}"
20
+ else
21
+ result << "#{c}".upcase
22
+ cap_next_char = false
23
+ end
24
+ else
25
+ cap_next_char = true
26
+ end
27
+ result
28
+ end
29
+ end
30
+
31
+ class << self
32
+ def hex(args = { :length => 24, :case => :upper })
33
+ unless args.include_only?( :length, :case )
34
+ raise "Invalid parameters in random"
35
+ end
36
+
37
+ h = (((0..args[:length]).map{rand(256).chr}*"").unpack("H*")[0][0,args[:length]])
38
+
39
+ if args[:case] == :lower
40
+ h.downcase
41
+ else
42
+ h.upcase
43
+ end
44
+ end
45
+
46
+ def random(args = { :length => 24, :charset => :all })
47
+ unless args.include_only?( :length, :charset )
48
+ raise "Invalid parameters in random"
49
+ end
50
+
51
+ if args[:charset] == :alpha
52
+ chars = ('a'..'z').to_a + ('A'..'Z').to_a
53
+ elsif args[:charset] == :alnum_upper
54
+ chars = ('A'..'Z').to_a + ('0'..'9').to_a
55
+ else
56
+ chars = ('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a
57
+ end
58
+ (0...args[:length]).collect { chars[Kernel.rand(chars.length)] }.join
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,119 @@
1
+ module Hosemonkey
2
+ module Time
3
+ # Copied directly from ActiveSupport
4
+ COMMON_YEAR_DAYS_IN_MONTH = [nil, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
5
+ # Copied directly from ActiveSupport
6
+ DAYS_INTO_WEEK = {
7
+ :monday => 0,
8
+ :tuesday => 1,
9
+ :wednesday => 2,
10
+ :thursday => 3,
11
+ :friday => 4,
12
+ :saturday => 5,
13
+ :sunday => 6
14
+ }
15
+
16
+ # Copied directly from ActiveSupport
17
+ # Return the number of days in the given month.
18
+ # If no year is specified, it will use the current year.
19
+ def days_in_month(month, year = now.year)
20
+ if month == 2 && ::Date.gregorian_leap?(year)
21
+ 29
22
+ else
23
+ COMMON_YEAR_DAYS_IN_MONTH[month]
24
+ end
25
+ end
26
+
27
+ # Copied directly from ActiveSupport
28
+ # Uses Date to provide precise Time calculations for years, months, and days.
29
+ # The +options+ parameter takes a hash with any of these keys: <tt>:years</tt>,
30
+ # <tt>:months</tt>, <tt>:weeks</tt>, <tt>:days</tt>, <tt>:hours</tt>,
31
+ # <tt>:minutes</tt>, <tt>:seconds</tt>.
32
+ def advance(options)
33
+ unless options[:weeks].nil?
34
+ options[:weeks], partial_weeks = options[:weeks].divmod(1)
35
+ options[:days] = options.fetch(:days, 0) + 7 * partial_weeks
36
+ end
37
+
38
+ unless options[:days].nil?
39
+ options[:days], partial_days = options[:days].divmod(1)
40
+ options[:hours] = options.fetch(:hours, 0) + 24 * partial_days
41
+ end
42
+
43
+ d = to_date.advance(options)
44
+ time_advanced_by_date = change(:year => d.year, :month => d.month, :day => d.day)
45
+ seconds_to_advance = \
46
+ options.fetch(:seconds, 0) +
47
+ options.fetch(:minutes, 0) * 60 +
48
+ options.fetch(:hours, 0) * 3600
49
+
50
+ if seconds_to_advance.zero?
51
+ time_advanced_by_date
52
+ else
53
+ time_advanced_by_date.since(seconds_to_advance)
54
+ end
55
+ end
56
+
57
+ # Copied directly from ActiveSupport
58
+ # Returns a new Time where one or more of the elements have been changed according to the +options+ parameter. The time options
59
+ # (hour, min, sec, usec) reset cascadingly, so if only the hour is passed, then minute, sec, and usec is set to 0. If the hour and
60
+ # minute is passed, then sec and usec is set to 0.
61
+ def change(options)
62
+ ::Time.send(
63
+ utc? ? :utc_time : :local_time,
64
+ options.fetch(:year, year),
65
+ options.fetch(:month, month),
66
+ options.fetch(:day, day),
67
+ options.fetch(:hour, hour),
68
+ options.fetch(:min, options[:hour] ? 0 : min),
69
+ options.fetch(:sec, (options[:hour] || options[:min]) ? 0 : sec),
70
+ options.fetch(:usec, (options[:hour] || options[:min] || options[:sec]) ? 0 : Rational(nsec, 1000))
71
+ )
72
+ end
73
+
74
+ def to_z
75
+ self.gmtime.strftime("%Y-%m-%dT%H:%M:%S.000Z")
76
+ end
77
+
78
+ def to_web
79
+ self.gmtime.strftime("%a, %d %b %Y %H:%M:%S %z")
80
+ end
81
+
82
+ def to_short
83
+ self.gmtime.strftime("%Y%m")
84
+ end
85
+ end
86
+ end
87
+
88
+
89
+ class Time
90
+ include Hosemonkey::Time
91
+ class << self
92
+ # Copied directly from ActiveSupport
93
+ # Wraps class method +time_with_datetime_fallback+ with +utc_or_local+ set to <tt>:utc</tt>.
94
+ def utc_time(*args)
95
+ time_with_datetime_fallback(:utc, *args)
96
+ end
97
+
98
+ # Wraps class method +time_with_datetime_fallback+ with +utc_or_local+ set to <tt>:local</tt>.
99
+ def local_time(*args)
100
+ time_with_datetime_fallback(:local, *args)
101
+ end
102
+ # Copied directly from ActiveSupport
103
+ # Returns a new Time if requested year can be accommodated by Ruby's Time class
104
+ # (i.e., if year is within either 1970..2038 or 1902..2038, depending on system architecture);
105
+ # otherwise returns a DateTime.
106
+ def time_with_datetime_fallback(utc_or_local, year, month=1, day=1, hour=0, min=0, sec=0, usec=0)
107
+ time = ::Time.send(utc_or_local, year, month, day, hour, min, sec, usec)
108
+
109
+ # This check is needed because Time.utc(y) returns a time object in the 2000s for 0 <= y <= 138.
110
+ if time.year == year
111
+ time
112
+ else
113
+ ::DateTime.civil_from_format(utc_or_local, year, month, day, hour, min, sec)
114
+ end
115
+ rescue
116
+ ::DateTime.civil_from_format(utc_or_local, year, month, day, hour, min, sec)
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,3 @@
1
+ module Hosemonkey
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,28 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe "Fixnum monkey: " do
4
+ it "days should return n number of days in the future" do
5
+ Time.stubs(:now).returns(Time.mktime(1970,1,1,0,0,0))
6
+ 10.days.should == Time.mktime(1970,1,11,0,0,0)
7
+ end
8
+
9
+ it "hours should return n number of hours in the future" do
10
+ Time.stubs(:now).returns(Time.mktime(1970,1,1,0,0,0))
11
+ 10.hours.should == Time.mktime(1970,1,1,10,0,0)
12
+ end
13
+
14
+ it "weeks should return n number of weeks in the future" do
15
+ Time.stubs(:now).returns(Time.mktime(1970,1,1,0,0,0))
16
+ 2.weeks.should == Time.mktime(1970,1,15,0,0,0)
17
+ end
18
+
19
+ it "months should return n number of months in the future" do
20
+ Time.stubs(:now).returns(Time.mktime(1970,1,1,0,0,0))
21
+ 15.months.should == Time.mktime(1971,4,1,0,0,0)
22
+ end
23
+
24
+ it "years should return n number of years in the future" do
25
+ Time.stubs(:now).returns(Time.mktime(1970,1,1,0,0,0))
26
+ 15.years.should == Time.mktime(1985,1,1,0,0,0)
27
+ end
28
+ end
@@ -0,0 +1,75 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe "Hash monkey: include_only?" do
4
+ it "should return true if only the provided keys are found in the hash" do
5
+ h = {:a => 0, :b => 1, :c => 2}
6
+ {}.include_only?(:a).should be_true
7
+ h.include_only?(:a).should be_false
8
+ h.include_only?(:a, :b).should be_false
9
+ h.include_only?(:a, :b, :c).should be_true
10
+ h.include_only?(:a, :b, :c, :d).should be_true
11
+ end
12
+ end
13
+
14
+
15
+ describe "Hash monkey: stringify keys" do
16
+ it "should turn symbols into key" do
17
+ h = {:a => 0, :b => 1, :c => 2}
18
+ h.stringify_keys
19
+ h.keys.size.should == 3
20
+ h.has_key?(:a).should be_false
21
+ h.has_key?(:b).should be_false
22
+ h.has_key?(:c).should be_false
23
+ h.has_key?('a').should be_true
24
+ h.has_key?('b').should be_true
25
+ h.has_key?('c').should be_true
26
+ end
27
+ end
28
+
29
+ describe "Hash monkey: include_only" do
30
+ it "shouldn't raise exception if only the provided keys are found in the hash" do
31
+ h = {:a => 0, :b => 1, :c => 3}
32
+ expect { {}.include_only(:a) }.to_not raise_error
33
+ expect { h.include_only(:a) }.to raise_error
34
+ expect { h.include_only(:a, :b) }.to raise_error
35
+ expect { h.include_only(:a, :b, :c) }.to_not raise_error
36
+ expect { h.include_only(:a, :b, :c, :d) }.to_not raise_error
37
+ end
38
+ end
39
+
40
+ describe "Hash monkey: from_xml_string" do
41
+ it "should create a hash of symbol => values" do
42
+ xml = "<Error><Code>Hello</Code><Message>World</Message><MyDate>Now</MyDate></Error>"
43
+ h = Hash.from_xml_string(xml)
44
+ h.has_key?('Error').should be_true
45
+ error = h['Error']
46
+ error.has_key?('Code').should be_true
47
+ error['Code'].should == "Hello"
48
+ error.has_key?('Message').should be_true
49
+ error['Message'].should == "World"
50
+ error.has_key?('MyDate').should be_true
51
+ error['MyDate'].should == "Now"
52
+ end
53
+
54
+ it "should raise exception on invalid xml" do
55
+ xml = "<Error><Code>Hello</Code><Message>World</Message><MyDate>Now</BADTAG></Error>"
56
+ expect { h = Hash.from_xml_string(xml) ; puts h.inspect }.to raise_error
57
+ end
58
+
59
+ it "should parse attributes" do
60
+ xml = "<Tag attr=\"hello world\">Hello</Tag>"
61
+ h = Hash.from_xml_string(xml)
62
+ tag = h['Tag']
63
+ tag.has_key?('attr')
64
+ tag['attr'].should == "hello world"
65
+ tag['text'].should == "Hello"
66
+ end
67
+
68
+ it "should handle multiple nested entries correctly" do
69
+ xml = "<List><Item><Name>one</Name><Type>this</Type></Item><Item><Name>two</Name><Type>this</Type></Item><Item><Name>three</Name><Type>this</Type></Item></List>"
70
+ h = Hash.from_xml_string(xml)
71
+ list = h['List']
72
+ list.has_key?('Item').should be_true
73
+ list['Item'].length.should == 3
74
+ end
75
+ end
@@ -0,0 +1,7 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'hosemonkey'
4
+
5
+ RSpec.configure do |config|
6
+ config.mock_with :mocha
7
+ end
@@ -0,0 +1,44 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe "String monkey: hex" do
4
+ it "shouldn't accept shitty args" do
5
+ expect { String.hex(:length => 100, :case => :upper, :bad => 'yep') }.to raise_error
6
+ end
7
+
8
+ it "should return an upper case hex string" do
9
+ s = String.hex(:length => 100, :case => :upper)
10
+ (s =~ /^[abcdef0-9]+$/).should be_nil
11
+ (s =~ /^[ABCDEF0-9]+$/).should >= 0
12
+ end
13
+
14
+ it "should return a lower case hex string" do
15
+ s = String.hex(:length => 100, :case => :lower)
16
+ (s =~ /^[abcdef0-9]+$/).should >= 0
17
+ (s =~ /^[ABCDEF0-9]+$/).should be_nil
18
+ end
19
+ end
20
+
21
+ describe "String monkey: random" do
22
+ it "should return an exception if an invalid option is passed" do
23
+ expect { String.random(:length => 100, :bad => 'yep') }.to raise_error
24
+ end
25
+
26
+ it "should return a alpha only string" do
27
+ s = String.random(:length => 100, :charset => :alpha)
28
+ (s =~ /^[a-zA-Z]+$/).should >= 0
29
+ (s =~ /^[0-9]+$/).should be_nil
30
+ end
31
+
32
+ it "should return a uppercase alphanumeric only string" do
33
+ s = String.random(:length => 100, :charset => :alnum_upper)
34
+ (s =~ /^[0-9A-Z]+$/).should >= 0
35
+ (s =~ /^[a-z]+$/).should be_nil
36
+ end
37
+ end
38
+
39
+ describe "String monkey: camalize" do
40
+ it "should camelize a string" do
41
+ c = "hello_world"
42
+ c.camelize.should == "HelloWorld"
43
+ end
44
+ end
@@ -0,0 +1,21 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe "Time monkey: " do
4
+ it "to_z should return the correct value" do
5
+ # Converts to gmt
6
+ Time.stubs(:now).returns(Time.mktime(1970,1,1,0,0,0))
7
+ Time.now.to_z.should == "1970-01-01T08:00:00.000Z"
8
+ end
9
+
10
+ it "to_web should return the correct value" do
11
+ # Converts to gmt
12
+ Time.stubs(:now).returns(Time.mktime(1970,1,1,0,0,0))
13
+ Time.now.to_web.should == "Thu, 01 Jan 1970 08:00:00 +0000"
14
+ end
15
+
16
+ it "to_yearmonth should return the correct value" do
17
+ # Converts to gmt
18
+ Time.stubs(:now).returns(Time.mktime(1970,1,1,0,0,0))
19
+ Time.now.to_short.should == "197001"
20
+ end
21
+ end
metadata ADDED
@@ -0,0 +1,133 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hosemonkey
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Rob Lyon
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-07-01 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: mocha
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: nokogiri
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ description: Write a gem description
79
+ email:
80
+ - rlyon@uidaho.edu
81
+ executables: []
82
+ extensions: []
83
+ extra_rdoc_files: []
84
+ files:
85
+ - .gitignore
86
+ - Gemfile
87
+ - README
88
+ - Rakefile
89
+ - hosemonkey.gemspec
90
+ - lib/hosemonkey.rb
91
+ - lib/hosemonkey/ext/array.rb
92
+ - lib/hosemonkey/ext/boolean.rb
93
+ - lib/hosemonkey/ext/date.rb
94
+ - lib/hosemonkey/ext/fixnum.rb
95
+ - lib/hosemonkey/ext/hash.rb
96
+ - lib/hosemonkey/ext/string.rb
97
+ - lib/hosemonkey/ext/time.rb
98
+ - lib/hosemonkey/version.rb
99
+ - spec/fixnum_spec.rb
100
+ - spec/hash_spec.rb
101
+ - spec/spec_helper.rb
102
+ - spec/string_spec.rb
103
+ - spec/time_spec.rb
104
+ homepage: ''
105
+ licenses: []
106
+ post_install_message:
107
+ rdoc_options: []
108
+ require_paths:
109
+ - lib
110
+ required_ruby_version: !ruby/object:Gem::Requirement
111
+ none: false
112
+ requirements:
113
+ - - ! '>='
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ required_rubygems_version: !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ! '>='
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ requirements: []
123
+ rubyforge_project: hosemonkey
124
+ rubygems_version: 1.8.20
125
+ signing_key:
126
+ specification_version: 3
127
+ summary: Write a gem summary
128
+ test_files:
129
+ - spec/fixnum_spec.rb
130
+ - spec/hash_spec.rb
131
+ - spec/spec_helper.rb
132
+ - spec/string_spec.rb
133
+ - spec/time_spec.rb