gorillib 0.4.1pre → 0.4.2pre
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +13 -10
- data/.rspec +1 -1
- data/.yardopts +1 -0
- data/CHANGELOG.md +47 -0
- data/Gemfile +22 -19
- data/Guardfile +23 -9
- data/README.md +12 -12
- data/Rakefile +29 -40
- data/VERSION +1 -1
- data/examples/benchmark/factories_benchmark.rb +87 -0
- data/examples/builder/ironfan.rb +1 -19
- data/examples/hash/slicing_methods.rb +101 -0
- data/gorillib.gemspec +36 -35
- data/lib/gorillib/array/deep_compact.rb +4 -3
- data/lib/gorillib/array/simple_statistics.rb +76 -0
- data/lib/gorillib/base.rb +0 -1
- data/lib/gorillib/builder.rb +15 -30
- data/lib/gorillib/collection.rb +159 -57
- data/lib/gorillib/collection/model_collection.rb +136 -43
- data/lib/gorillib/datetime/parse.rb +4 -2
- data/lib/gorillib/{array → deprecated/array}/average.rb +0 -0
- data/lib/gorillib/{array → deprecated/array}/random.rb +2 -1
- data/lib/gorillib/{array → deprecated/array}/sorted_median.rb +0 -0
- data/lib/gorillib/{array → deprecated/array}/sorted_percentile.rb +0 -0
- data/lib/gorillib/deprecated/array/sorted_sample.rb +13 -0
- data/lib/gorillib/{metaprogramming → deprecated/metaprogramming}/aliasing.rb +0 -0
- data/lib/gorillib/enumerable/sum.rb +3 -3
- data/lib/gorillib/exception/raisers.rb +92 -22
- data/lib/gorillib/factories.rb +550 -0
- data/lib/gorillib/hash/mash.rb +15 -58
- data/lib/gorillib/hashlike/deep_compact.rb +2 -2
- data/lib/gorillib/hashlike/slice.rb +55 -40
- data/lib/gorillib/model.rb +5 -3
- data/lib/gorillib/model/base.rb +33 -119
- data/lib/gorillib/model/defaults.rb +58 -14
- data/lib/gorillib/model/errors.rb +10 -0
- data/lib/gorillib/model/factories.rb +1 -367
- data/lib/gorillib/model/field.rb +40 -18
- data/lib/gorillib/model/fixup.rb +16 -0
- data/lib/gorillib/model/positional_fields.rb +35 -0
- data/lib/gorillib/model/schema_magic.rb +162 -0
- data/lib/gorillib/model/serialization.rb +1 -2
- data/lib/gorillib/model/serialization/csv.rb +59 -0
- data/lib/gorillib/pathname.rb +19 -8
- data/lib/gorillib/some.rb +2 -0
- data/lib/gorillib/string/constantize.rb +17 -10
- data/lib/gorillib/string/inflector.rb +11 -7
- data/lib/gorillib/type/boolean.rb +40 -0
- data/lib/gorillib/type/extended.rb +76 -40
- data/lib/gorillib/type/url.rb +6 -4
- data/lib/gorillib/utils/console.rb +1 -18
- data/lib/gorillib/utils/edge_cases.rb +18 -0
- data/spec/examples/builder/ironfan_spec.rb +5 -10
- data/spec/gorillib/array/compact_blank_spec.rb +36 -21
- data/spec/gorillib/array/simple_statistics_spec.rb +143 -0
- data/spec/gorillib/builder_spec.rb +16 -20
- data/spec/gorillib/collection_spec.rb +131 -35
- data/spec/gorillib/exception/raisers_spec.rb +39 -0
- data/spec/gorillib/hash/deep_compact_spec.rb +3 -3
- data/spec/gorillib/model/{record/defaults_spec.rb → defaults_spec.rb} +5 -1
- data/spec/gorillib/model/factories_spec.rb +335 -0
- data/spec/gorillib/model/{record/overlay_spec.rb → overlay_spec.rb} +0 -0
- data/spec/gorillib/model/serialization_spec.rb +2 -2
- data/spec/gorillib/model_spec.rb +19 -18
- data/spec/gorillib/pathname_spec.rb +7 -7
- data/spec/gorillib/string/truncate_spec.rb +3 -13
- data/spec/gorillib/type/extended_spec.rb +50 -2
- data/spec/gorillib/utils/capture_output_spec.rb +1 -1
- data/spec/spec_helper.rb +10 -7
- data/spec/support/factory_test_helpers.rb +76 -0
- data/spec/support/gorillib_test_helpers.rb +36 -24
- data/spec/support/model_test_helpers.rb +39 -2
- metadata +86 -51
- data/lib/alt/kernel/call_stack.rb +0 -56
- data/lib/gorillib/array/sorted_sample.rb +0 -12
- data/lib/gorillib/builder/field.rb +0 -5
- data/lib/gorillib/collection/has_collection.rb +0 -31
- data/lib/gorillib/collection/list_collection.rb +0 -58
- data/lib/gorillib/exception/confidence.rb +0 -17
- data/lib/gorillib/io/system_helpers.rb +0 -30
- data/lib/gorillib/model/record_schema.rb +0 -9
- data/lib/gorillib/utils/stub_module.rb +0 -33
- data/spec/array/average_spec.rb +0 -24
- data/spec/array/sorted_median_spec.rb +0 -18
- data/spec/array/sorted_percentile_spec.rb +0 -24
- data/spec/array/sorted_sample_spec.rb +0 -28
- data/spec/gorillib/metaprogramming/aliasing_spec.rb +0 -180
- data/spec/gorillib/model/record/factories_spec.rb +0 -335
- data/spec/support/kcode_test_helper.rb +0 -16
data/.gitignore
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
## OS
|
2
2
|
.DS_Store
|
3
|
-
Icon
|
3
|
+
Icon
|
4
4
|
nohup.out
|
5
5
|
.bak
|
6
6
|
|
7
|
+
*.pem
|
8
|
+
|
7
9
|
## EDITORS
|
8
10
|
\#*
|
9
11
|
.\#*
|
@@ -31,6 +33,11 @@ a.out
|
|
31
33
|
.svn
|
32
34
|
|
33
35
|
## PROJECT::GENERAL
|
36
|
+
|
37
|
+
log/*
|
38
|
+
tmp/*
|
39
|
+
pkg/*
|
40
|
+
|
34
41
|
coverage
|
35
42
|
rdoc
|
36
43
|
doc
|
@@ -38,17 +45,13 @@ pkg
|
|
38
45
|
.rake_test_cache
|
39
46
|
.bundle
|
40
47
|
.yardoc
|
41
|
-
*_private.*
|
42
|
-
*.pem
|
43
48
|
|
44
|
-
|
45
|
-
tmp/*
|
46
|
-
pkg/*
|
49
|
+
.vendor
|
47
50
|
|
48
51
|
## PROJECT::SPECIFIC
|
49
|
-
*.rdb
|
50
52
|
|
51
|
-
.vendor
|
52
|
-
.bundle
|
53
53
|
Gemfile.lock
|
54
|
-
|
54
|
+
.rvmrc
|
55
|
+
.rbenv-version
|
56
|
+
|
57
|
+
.rbx
|
data/.rspec
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
--color
|
2
|
-
--format
|
2
|
+
--format documentation
|
data/.yardopts
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,53 @@
|
|
1
|
+
# Gorillib Changelog
|
2
|
+
|
1
3
|
## Version 1.0
|
2
4
|
|
3
5
|
|
6
|
+
### 2012-08 - Version 1.0.3-pre
|
7
|
+
|
8
|
+
#### Deprecations
|
9
|
+
|
10
|
+
The following have been relocated to `gorillib/deprecated/{old name}`. So, if you were using `gorillib/array/random` and can't stand to migrate yet, just include `gorillib/deprecated/array/random` instead.
|
11
|
+
|
12
|
+
* deprecated `Array#random_element` -- `Array#sample` exists.
|
13
|
+
* combined `array/average`, `array/sorted_median` and `array/sorted_percentile` under `array/simple_statistics`. Just include that instead.
|
14
|
+
- `Array#average`, `Array#sorted_median` and `Array#sorted_percentile` are not deprecated, just moved.
|
15
|
+
- `Array#sorted_sample` is now `Array#sorted_nths`. There is a `sample` method on array with a non-similar purpose. Also modified it to land on the half-stride: `[1,2,3,4,5].sorted_nths(2)` is `[2,4]` not `[3,5]`.
|
16
|
+
- metaprogramming/aliasing.rb
|
17
|
+
|
18
|
+
|
19
|
+
#### Organized files in `gorillib/model`
|
20
|
+
|
21
|
+
* `gorillib/model/factories` is now `gorillib/factories.rb`
|
22
|
+
* `gorillib/builder/field` was empty, removed it
|
23
|
+
|
24
|
+
#### Questions
|
25
|
+
|
26
|
+
* move `compact_blank`, `deep_compact` to `enumerable/compact`?
|
27
|
+
|
28
|
+
#### Other
|
29
|
+
|
30
|
+
* stripping back the gem dependencies.
|
31
|
+
- `json` & `OJ` alongside bundler and rake in the `:development` group
|
32
|
+
|
33
|
+
|
34
|
+
### 2012-06 - Version 1.0.2-pre: First wave of refactors
|
35
|
+
|
36
|
+
**positional args**:
|
37
|
+
|
38
|
+
* You must explicitly declare the field to be positional in its definition:
|
39
|
+
|
40
|
+
class Smurf
|
41
|
+
include Gorillib::Model
|
42
|
+
field :smurfiness, Integer, :position => 0
|
43
|
+
field :weapon, String, :position => 1
|
44
|
+
end
|
45
|
+
|
46
|
+
Positions must be non-conflicting and in minimal order: if a subclass would bomb out if it declared `field :foo, Whatever, :position => 1` (or any position besides `2`).
|
47
|
+
|
48
|
+
* Builder's `receive!` method returns the *block*'s return value, not `self`.
|
49
|
+
|
50
|
+
|
4
51
|
### 2012-06 - Version 1.0.1-pre: First wave of refactors
|
5
52
|
|
6
53
|
**model**:
|
data/Gemfile
CHANGED
@@ -1,36 +1,39 @@
|
|
1
|
-
source
|
1
|
+
source 'http://rubygems.org'
|
2
2
|
|
3
3
|
gem 'multi_json', ">= 1.1"
|
4
4
|
|
5
5
|
# Only gems that you want listed as development dependencies in the gemspec
|
6
6
|
group :development do
|
7
7
|
gem 'bundler', "~> 1.1"
|
8
|
-
gem 'rake'
|
9
|
-
gem '
|
10
|
-
gem '
|
11
|
-
|
12
|
-
|
13
|
-
# Gems you would use if hacking on this gem (rather than with it)
|
14
|
-
group :support do
|
15
|
-
gem 'jeweler', ">= 1.6"
|
16
|
-
gem 'pry'
|
8
|
+
gem 'rake', :require => false
|
9
|
+
gem 'yard', ">= 0.7", :require => false
|
10
|
+
gem 'rspec', ">= 2.8", :require => false
|
11
|
+
gem 'jeweler', ">= 1.6", :require => false
|
17
12
|
end
|
18
13
|
|
19
14
|
group :docs do
|
20
|
-
gem '
|
21
|
-
gem '
|
15
|
+
gem 'redcarpet', ">= 2.1", :platform => [:ruby]
|
16
|
+
gem 'kramdown', :platform => [:jruby]
|
22
17
|
end
|
23
18
|
|
24
19
|
# Gems for testing and coverage
|
25
20
|
group :test do
|
26
|
-
gem '
|
27
|
-
gem '
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
21
|
+
gem 'simplecov', ">= 0.5", :platform => [:ruby_19], :require => false
|
22
|
+
gem 'json'
|
23
|
+
end
|
24
|
+
|
25
|
+
# Gems you would use if hacking on this gem (rather than with it)
|
26
|
+
group :support do
|
27
|
+
gem 'pry'
|
28
|
+
# gem 'perftools.rb', :platform => [:mri]
|
32
29
|
#
|
30
|
+
gem 'guard', ">= 1.0", :platform => [:ruby_19]
|
31
|
+
gem 'guard-rspec', ">= 0.6", :platform => [:ruby_19]
|
32
|
+
gem 'guard-yard', :platform => [:ruby_19]
|
33
33
|
if RUBY_PLATFORM.include?('darwin')
|
34
|
-
gem 'rb-fsevent', ">= 0.9"
|
34
|
+
gem 'rb-fsevent', ">= 0.9", :platform => [:ruby_19]
|
35
|
+
end
|
36
|
+
if ENV['GORILLIB_YARD']
|
37
|
+
gem 'guard-livereload', ">= 1.0"
|
35
38
|
end
|
36
39
|
end
|
data/Guardfile
CHANGED
@@ -1,19 +1,33 @@
|
|
1
1
|
# -*- ruby -*-
|
2
2
|
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
3
|
+
# require 'guard/notifiers/emacs'
|
4
|
+
# ::Guard::Notifier::DEFAULTS.merge!(
|
5
|
+
# :success => '#e7fde4',
|
6
|
+
# :failed => '#faeedc',
|
7
|
+
# :default => '#eee8d6',
|
8
|
+
# )
|
9
|
+
# p ['emacs notifier:', ::Guard::Notifier::DEFAULTS]
|
7
10
|
|
8
|
-
# '--format doc' for more verbose, --format progress for less
|
9
|
-
|
10
|
-
# '--tag record_spec' to only run tests tagged :record_spec
|
11
|
-
tags = %w[ ] # builder_spec example_spec model_spec
|
11
|
+
format = "progress" # '--format doc' for more verbose, --format progress for less
|
12
|
+
tags = %w[ ] # '--tag record_spec' to only run tests tagged :record_spec
|
12
13
|
|
13
|
-
guard
|
14
|
+
guard('rspec', version: 2, all_after_pass: false, all_on_start: false,
|
15
|
+
cli: "--format #{format} #{ tags.map{|tag| "--tag #{tag}"}.join(" ") }") do
|
14
16
|
watch(%r{^spec/.+_spec\.rb$})
|
15
17
|
watch(%r{^(examples/.+)\.rb}){|m| "spec/#{m[1]}_spec.rb" }
|
16
18
|
watch(%r{^lib/gorillib/(.+)\.rb$}){|m| ["spec/gorillib/#{m[1]}_spec.rb", "spec/examples/builder/ironfan_spec.rb"] }
|
17
19
|
watch('spec/spec_helper.rb'){ "spec" }
|
18
20
|
watch(/spec\/support\/(.+)\.rb/){ "spec" }
|
19
21
|
end
|
22
|
+
|
23
|
+
if ENV['GORILLIB_YARD']
|
24
|
+
|
25
|
+
guard 'yard', use_cache: true, server: false, stdout: '/dev/null' do
|
26
|
+
watch(%r{lib/.+\.rb})
|
27
|
+
watch(%r{notes/.+\.(md|txt)}){ "notes" }
|
28
|
+
end
|
29
|
+
|
30
|
+
guard 'livereload' do
|
31
|
+
watch(/^doc\/(.*\.html)/) # {|match| [ match[1], "frames.html" ] }
|
32
|
+
end
|
33
|
+
end
|
data/README.md
CHANGED
@@ -9,27 +9,27 @@ What gorillib gives you is clarity over what features are brought in. If you wan
|
|
9
9
|
* Upwards compatible with `active_record` and `extlib`
|
10
10
|
- the `active_support` components have significantly more robust internationalization, and some functions have rich option sets in `active_support` vs. basic functionality in `gorillib`. So the rule is if you were happy with `gorillib` you'll be happy with `active_support`, but not vice-versa.
|
11
11
|
|
12
|
-
### require 'gorillib/
|
12
|
+
### require 'gorillib/model
|
13
13
|
|
14
|
-
Gorillib has at least one powerful addition to the canon: the
|
14
|
+
Gorillib has at least one powerful addition to the canon: the `Gorillib::Model` mixin.
|
15
|
+
|
16
|
+
Think of it like 'An ORM for JSON'. It's designed for data that spends as much time on the wire as it does in action -- things like API handlers or clients, data processing scripts, wukong jobs.
|
15
17
|
|
16
18
|
* lightweight
|
17
|
-
*
|
18
|
-
*
|
19
|
+
* serializes to/from JSON, TSV or plain hashes
|
20
|
+
* type converts when you need it, but doesn't complicate normal accessors
|
21
|
+
* upward compatible with ActiveModel
|
19
22
|
|
20
23
|
### require 'gorillib'
|
21
24
|
|
22
|
-
|
23
|
-
|
24
|
-
### require 'gorillib/base'
|
25
|
-
|
26
|
-
requires the following libraries:
|
25
|
+
Requires only the following minimal set of libraries:
|
27
26
|
|
28
|
-
* `gorillib/object/blank`
|
29
|
-
* `gorillib/
|
27
|
+
* `gorillib/object/blank` -- fluent boolean methods `foo.blank?` & `foo.present?`
|
28
|
+
* `gorillib/array/extract_options` -- get optional keyword args from a `*args` signature
|
29
|
+
* `gorillib/hash/reverse_merge` --
|
30
30
|
* `gorillib/hash/compact`
|
31
31
|
* `gorillib/array/compact_blank`
|
32
|
-
* `gorillib/
|
32
|
+
* `gorillib/exception/raisers` -- DRY exceptions: `ArgumentError.check_arity!`, `TypeMismatchError`,
|
33
33
|
|
34
34
|
### require 'gorillib/some'
|
35
35
|
|
data/Rakefile
CHANGED
@@ -1,57 +1,46 @@
|
|
1
1
|
require 'rubygems' unless defined?(Gem)
|
2
|
-
require 'bundler'
|
3
|
-
|
4
|
-
Bundler.setup(:default, :development, :support, :test)
|
5
|
-
rescue Bundler::BundlerError => e
|
6
|
-
$stderr.puts e.message
|
7
|
-
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
-
exit e.status_code
|
9
|
-
end
|
2
|
+
require 'bundler/setup'
|
3
|
+
Bundler.setup(:default, :development)
|
10
4
|
require 'rake'
|
11
5
|
|
6
|
+
task :default => :rspec
|
7
|
+
|
8
|
+
require 'rspec/core/rake_task'
|
9
|
+
RSpec::Core::RakeTask.new(:rspec) do |spec|
|
10
|
+
Bundler.setup(:default, :development, :test)
|
11
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "Run RSpec with code coverage"
|
15
|
+
task :cov do
|
16
|
+
ENV['GORILLIB_COV'] = "yep"
|
17
|
+
Rake::Task[:rspec].execute
|
18
|
+
end
|
19
|
+
|
20
|
+
require 'yard'
|
21
|
+
YARD::Rake::YardocTask.new do
|
22
|
+
Bundler.setup(:default, :development, :docs)
|
23
|
+
end
|
24
|
+
|
12
25
|
require 'jeweler'
|
13
26
|
Jeweler::Tasks.new do |gem|
|
14
|
-
|
15
|
-
gem.name =
|
16
|
-
gem.homepage =
|
17
|
-
gem.license =
|
27
|
+
Bundler.setup(:default, :development, :test)
|
28
|
+
gem.name = 'gorillib'
|
29
|
+
gem.homepage = 'https://github.com/infochimps-labs/gorillib'
|
30
|
+
gem.license = 'Apache 2.0'
|
31
|
+
gem.email = 'coders@infochimps.org'
|
32
|
+
gem.authors = ['Infochimps']
|
33
|
+
|
18
34
|
gem.summary = %Q{include only what you need. No dependencies, no creep}
|
19
35
|
gem.description = %Q{Gorillib: infochimps lightweight subset of ruby convenience methods}
|
20
|
-
gem.email = "coders@infochimps.org"
|
21
|
-
gem.authors = ["Infochimps"]
|
22
36
|
|
23
37
|
ignores = File.readlines(".gitignore").grep(/^[^#]\S+/).map{|s| s.chomp }
|
24
38
|
dotfiles = [".gemtest", ".gitignore", ".rspec", ".yardopts"]
|
25
39
|
gem.files = dotfiles + Dir["**/*"].
|
26
|
-
reject{|f| f =~ %r{^(vendor|coverage)/} }.
|
40
|
+
reject{|f| f =~ %r{^(vendor|coverage|old|away)/} }.
|
27
41
|
reject{|f| File.directory?(f) }.
|
28
42
|
reject{|f| ignores.any?{|i| File.fnmatch(i, f) || File.fnmatch(i+'/**/*', f) || File.fnmatch(i+'/*', f) } }
|
29
43
|
gem.test_files = gem.files.grep(/^spec\//)
|
30
44
|
gem.require_paths = ['lib']
|
31
45
|
end
|
32
46
|
Jeweler::RubygemsDotOrgTasks.new
|
33
|
-
|
34
|
-
require 'rspec/core'
|
35
|
-
require 'rspec/core/rake_task'
|
36
|
-
RSpec::Core::RakeTask.new(:spec) do |spec|
|
37
|
-
Bundler.setup(:default, :development, :test)
|
38
|
-
spec.pattern = FileList['spec/**/*_spec.rb']
|
39
|
-
end
|
40
|
-
|
41
|
-
# if rcov shits the bed with ruby 1.9, see
|
42
|
-
# https://github.com/relevance/rcov/issues/31
|
43
|
-
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
44
|
-
spec.pattern = 'spec/**/*_spec.rb'
|
45
|
-
spec.rcov = true
|
46
|
-
spec.rcov_opts = %w[ --exclude .rvm --no-comments --text-summary]
|
47
|
-
end
|
48
|
-
|
49
|
-
require 'yard'
|
50
|
-
YARD::Rake::YardocTask.new do
|
51
|
-
Bundler.setup(:default, :development, :docs)
|
52
|
-
end
|
53
|
-
|
54
|
-
# App-specific tasks
|
55
|
-
Dir[File.dirname(__FILE__)+'/lib/tasks/**/*.rake'].sort.each{|f| load f }
|
56
|
-
|
57
|
-
task :default => :spec
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.2pre
|
@@ -0,0 +1,87 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'benchmark'
|
4
|
+
require 'benchmark/ips' # https://github.com/evanphx/benchmark-ips and benchmark_suite
|
5
|
+
|
6
|
+
require 'gorillib'
|
7
|
+
require 'gorillib/model'
|
8
|
+
# load(File.expand_path("../gorillib/lib/gorillib/model/factories.rb"))
|
9
|
+
|
10
|
+
module Gorillib::Factory
|
11
|
+
|
12
|
+
NUMERIC_FACTORIES = {
|
13
|
+
:int => IntegerFactory.new(), # uses Integer() -- strict (will not convert a float-y string)
|
14
|
+
:flt => FloatFactory.new(), # uses Float() -- strict
|
15
|
+
:gr_int => GraciousIntegerFactory.new(),
|
16
|
+
:gr_float => GraciousFloatFactory.new(),
|
17
|
+
|
18
|
+
# indiscriminately Integer or to_i anything you see
|
19
|
+
:gri_to_i => GraciousIntegerFactory.new(convert: ->(obj){ obj.to_i }),
|
20
|
+
:gri_dirct => GraciousIntegerFactory.new(convert: ->(obj){ Integer(obj) }),
|
21
|
+
|
22
|
+
# same as basic GraciousIntegerFactory, but strangely defining a block here
|
23
|
+
# is *way* faster, so for fair conversion to :gr_int_direct and :gr_int_to_i
|
24
|
+
# I've duplicated it here
|
25
|
+
:gri_blk => IntegerFactory.new(convert: ->(obj){
|
26
|
+
if String === obj then
|
27
|
+
obj = obj.to_s.tr(FLT_CRUFT_CHARS, '') ;
|
28
|
+
obj = Float(obj) if FLT_NOT_INT_RE === obj ;
|
29
|
+
end
|
30
|
+
Integer(obj) } ),
|
31
|
+
}
|
32
|
+
|
33
|
+
NUMERIC_OBJECTS = [
|
34
|
+
"1_234.5e4f",
|
35
|
+
"1_234_567.1234e+40",
|
36
|
+
"1_234",
|
37
|
+
"123456789_123456789_123456789_123456789_123456789",
|
38
|
+
"1234L",
|
39
|
+
"1,234,567",
|
40
|
+
"1_234.5e4",
|
41
|
+
1234, 1234.5,
|
42
|
+
Time.now,
|
43
|
+
"0x11", '0x1.999999999999ap4'
|
44
|
+
]
|
45
|
+
|
46
|
+
class FactoryBencher
|
47
|
+
include Gorillib::Model
|
48
|
+
field :step_duration, Integer, position: 0, default: 2.0, doc: "Target duration of each benchmarking step"
|
49
|
+
field :warm_duration, Integer, position: 0, default: 0.1, doc: "Target duration of warmup step"
|
50
|
+
|
51
|
+
def benchmark_factory(factories)
|
52
|
+
NUMERIC_OBJECTS.each do |obj|
|
53
|
+
puts "=== Converting +%-20s+: %s" % [
|
54
|
+
obj.inspect, factories.map{|fn, fact| "#{fn}: #{fact.receive(obj) rescue '(err)'}" }.join(" | ")]
|
55
|
+
end
|
56
|
+
NUMERIC_OBJECTS.each do |obj|
|
57
|
+
ips do |bench|
|
58
|
+
factories.each do |factory_name, factory|
|
59
|
+
msg = "%-15s%10s" % [obj.inspect[0..14], factory_name]
|
60
|
+
bench.report(msg){ factory.receive(obj) }
|
61
|
+
end
|
62
|
+
bench.report('to_i baseline' ){ obj.to_i }
|
63
|
+
bench.report('to_f baseline' ){ obj.to_f }
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def benchmark_baseline
|
69
|
+
objs = NUMERIC_OBJECTS
|
70
|
+
ips do |bench|
|
71
|
+
objs.each{|obj| bench.report("#{obj.inspect[0..9]} #to_i" ){ obj.to_i } }
|
72
|
+
objs.each{|obj| bench.report("#{obj.inspect[0..9]} #to_f" ){ obj.to_f } }
|
73
|
+
objs.each{|obj| bench.report("#{obj.inspect[0..9]} Integer()" ){ Integer(obj) } }
|
74
|
+
objs.each{|obj| bench.report("#{obj.inspect[0..9]} Float())" ){ Float(obj) } }
|
75
|
+
objs.each{|obj| bench.report("#{obj.inspect[0..9]} Int(Fl())" ){ Integer(Float(obj)) } }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def ips(&block)
|
80
|
+
Benchmark.ips(step_duration, warm_duration, &block)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
bencher = FactoryBencher.new
|
85
|
+
bencher.benchmark_factory(NUMERIC_FACTORIES)
|
86
|
+
bencher.benchmark_baseline
|
87
|
+
end
|
data/examples/builder/ironfan.rb
CHANGED
@@ -24,8 +24,6 @@ module Gorillib::Test
|
|
24
24
|
class Aspect < IronfanBuilder ; end
|
25
25
|
class Machine < IronfanBuilder ; end
|
26
26
|
class ChefNode < IronfanBuilder ; def save() ; end ; end
|
27
|
-
class ChefClient < IronfanBuilder ; def save() ; end ; end
|
28
|
-
class ChefRole < IronfanBuilder ; def save() ; end ; end
|
29
27
|
|
30
28
|
module Ironfan
|
31
29
|
class << self
|
@@ -39,7 +37,7 @@ module Gorillib::Test
|
|
39
37
|
|
40
38
|
class ComputeBuilder < IronfanBuilder
|
41
39
|
magic :environment, Symbol
|
42
|
-
collection :clouds,
|
40
|
+
collection :clouds, Cloud
|
43
41
|
collection :volumes, Volume
|
44
42
|
collection :components, Component
|
45
43
|
|
@@ -53,22 +51,6 @@ module Gorillib::Test
|
|
53
51
|
def servers() organization.servers.where(:cluster_name => self.name) ; end
|
54
52
|
end
|
55
53
|
|
56
|
-
module ComputeBuilder::Deprecated
|
57
|
-
def bogosity() ; end
|
58
|
-
def bogus?() ; end
|
59
|
-
def raid_group() ; end
|
60
|
-
def root_volume() ; end
|
61
|
-
def role() ; end
|
62
|
-
def recipe() ; end
|
63
|
-
def role_implication() ; end
|
64
|
-
end
|
65
|
-
module Cluster::Deprecated
|
66
|
-
attr_accessor :chef_roles
|
67
|
-
def find_facet(facet_name)
|
68
|
-
facets.fetch(facet_name){ raise("Facet '#{facet_name}' is not defined in cluster '#{self.name}'") }
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
54
|
class Facet < ComputeBuilder
|
73
55
|
belongs_to :cluster, Cluster
|
74
56
|
collection :servers, Server
|