jsonify 0.0.7 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/jsonify.gemspec +2 -1
- data/lib/jsonify.rb +2 -1
- data/lib/jsonify/blank_slate.rb +1 -63
- data/lib/jsonify/version.rb +1 -1
- data/spec/benchmark_helper.rb +133 -0
- data/spec/benchmark_spek.rb +46 -0
- data/spec/profile.rb +16 -0
- data/spec/spec_helper.rb +2 -1
- data/spec/speed.rb +39 -0
- metadata +38 -19
data/jsonify.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
|
21
|
-
s.add_dependency '
|
21
|
+
s.add_dependency 'json_pure'
|
22
22
|
|
23
23
|
s.add_development_dependency 'bundler'
|
24
24
|
s.add_development_dependency 'rake'
|
@@ -26,4 +26,5 @@ Gem::Specification.new do |s|
|
|
26
26
|
s.add_development_dependency 'autotest'
|
27
27
|
s.add_development_dependency 'yard'
|
28
28
|
s.add_development_dependency 'rdiscount'
|
29
|
+
s.add_development_dependency 'ruby-prof'
|
29
30
|
end
|
data/lib/jsonify.rb
CHANGED
data/lib/jsonify/blank_slate.rb
CHANGED
@@ -44,66 +44,4 @@ module Jsonify
|
|
44
44
|
|
45
45
|
instance_methods.each { |m| hide(m) }
|
46
46
|
end
|
47
|
-
end
|
48
|
-
######################################################################
|
49
|
-
# Since Ruby is very dynamic, methods added to the ancestors of
|
50
|
-
# BlankSlate <em>after BlankSlate is defined</em> will show up in the
|
51
|
-
# list of available BlankSlate methods. We handle this by defining a
|
52
|
-
# hook in the Object and Kernel classes that will hide any method
|
53
|
-
# defined after BlankSlate has been loaded.
|
54
|
-
#
|
55
|
-
# module Kernel
|
56
|
-
# class << self
|
57
|
-
# alias_method :blank_slate_method_added, :method_added
|
58
|
-
#
|
59
|
-
# # Detect method additions to Kernel and remove them in the
|
60
|
-
# # BlankSlate class.
|
61
|
-
# def method_added(name)
|
62
|
-
# result = blank_slate_method_added(name)
|
63
|
-
# return result if self != Kernel
|
64
|
-
# BlankSlate.hide(name)
|
65
|
-
# result
|
66
|
-
# end
|
67
|
-
# end
|
68
|
-
# end
|
69
|
-
|
70
|
-
######################################################################
|
71
|
-
# Same as above, except in Object.
|
72
|
-
#
|
73
|
-
# class Object
|
74
|
-
# class << self
|
75
|
-
# alias_method :blank_slate_method_added, :method_added
|
76
|
-
#
|
77
|
-
# # Detect method additions to Object and remove them in the
|
78
|
-
# # BlankSlate class.
|
79
|
-
# def method_added(name)
|
80
|
-
# result = blank_slate_method_added(name)
|
81
|
-
# return result if self != Object
|
82
|
-
# BlankSlate.hide(name)
|
83
|
-
# result
|
84
|
-
# end
|
85
|
-
#
|
86
|
-
# def find_hidden_method(name)
|
87
|
-
# nil
|
88
|
-
# end
|
89
|
-
# end
|
90
|
-
# end
|
91
|
-
|
92
|
-
######################################################################
|
93
|
-
# Also, modules included into Object need to be scanned and have their
|
94
|
-
# instance methods removed from blank slate. In theory, modules
|
95
|
-
# included into Kernel would have to be removed as well, but a
|
96
|
-
# "feature" of Ruby prevents late includes into modules from being
|
97
|
-
# exposed in the first place.
|
98
|
-
#
|
99
|
-
# class Module
|
100
|
-
# alias blankslate_original_append_features append_features
|
101
|
-
# def append_features(mod)
|
102
|
-
# result = blankslate_original_append_features(mod)
|
103
|
-
# return result if mod != Object
|
104
|
-
# instance_methods.each do |name|
|
105
|
-
# BlankSlate.hide(name)
|
106
|
-
# end
|
107
|
-
# result
|
108
|
-
# end
|
109
|
-
# end
|
47
|
+
end
|
data/lib/jsonify/version.rb
CHANGED
@@ -0,0 +1,133 @@
|
|
1
|
+
require "benchmark"
|
2
|
+
require "rspec"
|
3
|
+
|
4
|
+
module RSpec
|
5
|
+
module Benchmark
|
6
|
+
class Result
|
7
|
+
attr_accessor :slowest, :fastest, :average, :elapsed
|
8
|
+
|
9
|
+
def initialize(elapsed)
|
10
|
+
@elapsed = elapsed
|
11
|
+
@slowest = elapsed.max
|
12
|
+
@fastest = elapsed.min
|
13
|
+
@average = elapsed.inject(0) {|b, t| b + t} / elapsed.size
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
"[average: #{average}, slowest: #{slowest}, fastest: #{fastest}]"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Run a given block and calculate the average execution time.
|
22
|
+
# The block will be executed 1000 times by default.
|
23
|
+
#
|
24
|
+
# benchmark { do something }
|
25
|
+
# benchmark(100) { do something }
|
26
|
+
#
|
27
|
+
def benchmark(times = 1_000, &block)
|
28
|
+
elapsed = (1..times).collect do
|
29
|
+
GC.start
|
30
|
+
::Benchmark.realtime(&block) * 1000
|
31
|
+
end
|
32
|
+
|
33
|
+
Result.new(elapsed)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Check if the slowest execution is less than expected.
|
39
|
+
#
|
40
|
+
# it "should do something fast" do
|
41
|
+
# benchmark { do something }.should be_faster_than(1.3)
|
42
|
+
# end
|
43
|
+
#
|
44
|
+
RSpec::Matchers.define :be_faster_than do |expected|
|
45
|
+
match do |result|
|
46
|
+
result.slowest < expected
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Check if the slowest execution is greater than expected.
|
51
|
+
#
|
52
|
+
# it "should do something slow" do
|
53
|
+
# benchmark { do something }.should_not be_slower_than(1.3)
|
54
|
+
# end
|
55
|
+
#
|
56
|
+
RSpec::Matchers.define :be_slower_than do |expected|
|
57
|
+
match do |result|
|
58
|
+
result.slowest > expected
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Check if the execution average is close to expected.
|
63
|
+
#
|
64
|
+
# it "should do something average time" do
|
65
|
+
# benchmark { do something }.should be_on_average(1.3, 0.01)
|
66
|
+
# end
|
67
|
+
#
|
68
|
+
RSpec::Matchers.define :be_on_average do |expected, delta|
|
69
|
+
match do |result|
|
70
|
+
(result.average - expected).abs < delta
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Include matchers and <tt>benchmark</tt> method into RSpec context.
|
75
|
+
RSpec.configure do |config|
|
76
|
+
config.include(RSpec::Benchmark)
|
77
|
+
end
|
78
|
+
|
79
|
+
if ARGV[0] == __FILE__
|
80
|
+
describe RSpec::Benchmark do
|
81
|
+
before do
|
82
|
+
GC.stub(:start)
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should be faster than expected" do
|
86
|
+
stub(:slowest => 0.01).should be_faster_than(0.5)
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should not be faster than expected" do
|
90
|
+
stub(:slowest => 2).should_not be_faster_than(0.5)
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should be slower than expected" do
|
94
|
+
stub(:slowest => 2).should be_slower_than(0.5)
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should not be slower than expected" do
|
98
|
+
stub(:slowest => 0.5).should_not be_slower_than(2)
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should be on average" do
|
102
|
+
stub(:average => 0.51).should be_on_average(0.5, 0.019)
|
103
|
+
stub(:average => 0.49).should be_on_average(0.5, 0.019)
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should call garbage collector" do
|
107
|
+
GC.should_receive(:start).exactly(5).times
|
108
|
+
benchmark(5) { true }
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should return result with collected data" do
|
112
|
+
result = benchmark(5) { true }
|
113
|
+
|
114
|
+
result.average.should be_kind_of(Float)
|
115
|
+
result.slowest.should be_kind_of(Float)
|
116
|
+
result.fastest.should be_kind_of(Float)
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should run block" do
|
120
|
+
object = mock
|
121
|
+
object.should_receive(:run).exactly(1000).times
|
122
|
+
|
123
|
+
benchmark { object.run }
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should run block with custom range" do
|
127
|
+
object = mock
|
128
|
+
object.should_receive(:run).exactly(3).times
|
129
|
+
|
130
|
+
benchmark(3) { object.run }
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Jsonify::Builder do
|
4
|
+
|
5
|
+
let(:j) { Jsonify::Builder.new }
|
6
|
+
|
7
|
+
describe 'hello world' do
|
8
|
+
it "runs under 0.3 milliseconds" do
|
9
|
+
benchmark do
|
10
|
+
j.hello 'world'
|
11
|
+
j.compile!
|
12
|
+
j.reset!
|
13
|
+
end.should be_faster_than( 0.3 ) #milliseconds
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
describe 'json_builder example' do
|
19
|
+
it 'should be better than builder (0.5 milliseconds)' do
|
20
|
+
benchmark do
|
21
|
+
j.name "Garrett Bjerkhoel"
|
22
|
+
j.birthday Time.local(1991, 9, 14)
|
23
|
+
j.street do
|
24
|
+
j.address "1143 1st Ave"
|
25
|
+
j.address2 "Apt 200"
|
26
|
+
j.city "New York"
|
27
|
+
j.state "New York"
|
28
|
+
j.zip 10065
|
29
|
+
end
|
30
|
+
j.skills do
|
31
|
+
j.ruby true
|
32
|
+
j.asp false
|
33
|
+
j.php true
|
34
|
+
j.mysql true
|
35
|
+
j.mongodb true
|
36
|
+
j.haproxy true
|
37
|
+
j.marathon false
|
38
|
+
end
|
39
|
+
j.single_skills ['ruby', 'php', 'mysql', 'mongodb', 'haproxy']
|
40
|
+
j.booleans [true, true, false, nil]
|
41
|
+
j.reset!
|
42
|
+
end.should be_faster_than(0.5)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
data/spec/profile.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'jsonify'
|
4
|
+
require 'ruby-prof'
|
5
|
+
|
6
|
+
result = RubyProf.profile do
|
7
|
+
1.times do
|
8
|
+
json=Jsonify::Builder.new
|
9
|
+
json.hello 'world'
|
10
|
+
json.compile!
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# Print a flat profile to text
|
15
|
+
printer = RubyProf::FlatPrinter.new(result)
|
16
|
+
printer.print(STDOUT)
|
data/spec/spec_helper.rb
CHANGED
data/spec/speed.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'jsonify'
|
4
|
+
require 'benchmark'
|
5
|
+
|
6
|
+
class Speed
|
7
|
+
def self.test
|
8
|
+
Benchmark.bm do |b|
|
9
|
+
b.report('Jsonify') do
|
10
|
+
15_000.times {
|
11
|
+
j = Jsonify::Builder.new
|
12
|
+
j.name "Garrett Bjerkhoel"
|
13
|
+
j.birthday Time.local(1991, 9, 14)
|
14
|
+
j.street do
|
15
|
+
j.address "1143 1st Ave"
|
16
|
+
j.address2 "Apt 200"
|
17
|
+
j.city "New York"
|
18
|
+
j.state "New York"
|
19
|
+
j.zip 10065
|
20
|
+
end
|
21
|
+
j.skills do
|
22
|
+
j.ruby true
|
23
|
+
j.asp false
|
24
|
+
j.php true
|
25
|
+
j.mysql true
|
26
|
+
j.mongodb true
|
27
|
+
j.haproxy true
|
28
|
+
j.marathon false
|
29
|
+
end
|
30
|
+
j.single_skills ['ruby', 'php', 'mysql', 'mongodb', 'haproxy']
|
31
|
+
j.booleans [true, true, false, nil]
|
32
|
+
j.compile!
|
33
|
+
}
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
Speed.test
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jsonify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-08-
|
12
|
+
date: 2011-08-03 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
16
|
-
requirement: &
|
15
|
+
name: json_pure
|
16
|
+
requirement: &70097037247660 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70097037247660
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: bundler
|
27
|
-
requirement: &
|
27
|
+
requirement: &70097037247160 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70097037247160
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rake
|
38
|
-
requirement: &
|
38
|
+
requirement: &70097037246620 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70097037246620
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rspec
|
49
|
-
requirement: &
|
49
|
+
requirement: &70097037245940 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70097037245940
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: autotest
|
60
|
-
requirement: &
|
60
|
+
requirement: &70097037245420 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70097037245420
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: yard
|
71
|
-
requirement: &
|
71
|
+
requirement: &70097037244760 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70097037244760
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: rdiscount
|
82
|
-
requirement: &
|
82
|
+
requirement: &70097037244220 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,7 +87,18 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70097037244220
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: ruby-prof
|
93
|
+
requirement: &70097037243620 !ruby/object:Gem::Requirement
|
94
|
+
none: false
|
95
|
+
requirements:
|
96
|
+
- - ! '>='
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
type: :development
|
100
|
+
prerelease: false
|
101
|
+
version_requirements: *70097037243620
|
91
102
|
description: Turn Ruby objects into JSON -- correctly!
|
92
103
|
email:
|
93
104
|
- bsiggelkow@me.com
|
@@ -108,11 +119,15 @@ files:
|
|
108
119
|
- lib/jsonify/generate.rb
|
109
120
|
- lib/jsonify/json_value.rb
|
110
121
|
- lib/jsonify/version.rb
|
122
|
+
- spec/benchmark_helper.rb
|
123
|
+
- spec/benchmark_spek.rb
|
111
124
|
- spec/builder_spec.rb
|
112
125
|
- spec/generate_spec.rb
|
113
126
|
- spec/json_value_spec.rb
|
114
127
|
- spec/jsonify_spec.rb
|
128
|
+
- spec/profile.rb
|
115
129
|
- spec/spec_helper.rb
|
130
|
+
- spec/speed.rb
|
116
131
|
homepage: http://github.com/bsiggelkow/jsonify
|
117
132
|
licenses: []
|
118
133
|
post_install_message:
|
@@ -127,7 +142,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
127
142
|
version: '0'
|
128
143
|
segments:
|
129
144
|
- 0
|
130
|
-
hash:
|
145
|
+
hash: 2291352512493608136
|
131
146
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
132
147
|
none: false
|
133
148
|
requirements:
|
@@ -136,7 +151,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
136
151
|
version: '0'
|
137
152
|
segments:
|
138
153
|
- 0
|
139
|
-
hash:
|
154
|
+
hash: 2291352512493608136
|
140
155
|
requirements: []
|
141
156
|
rubyforge_project: jsonify
|
142
157
|
rubygems_version: 1.8.6
|
@@ -144,8 +159,12 @@ signing_key:
|
|
144
159
|
specification_version: 3
|
145
160
|
summary: Turn Ruby objects into JSON
|
146
161
|
test_files:
|
162
|
+
- spec/benchmark_helper.rb
|
163
|
+
- spec/benchmark_spek.rb
|
147
164
|
- spec/builder_spec.rb
|
148
165
|
- spec/generate_spec.rb
|
149
166
|
- spec/json_value_spec.rb
|
150
167
|
- spec/jsonify_spec.rb
|
168
|
+
- spec/profile.rb
|
151
169
|
- spec/spec_helper.rb
|
170
|
+
- spec/speed.rb
|