jrjackson 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source :rubygems
2
+ gemspec
data/README ADDED
@@ -0,0 +1,44 @@
1
+ jrjackson
2
+
3
+ a jruby library wrapping the JAVA jackson jars
4
+
5
+ provides:
6
+
7
+ JrJackson::Json.generate(obj) -> json string
8
+ JrJackson::Json.parse(str) -> hash like object
9
+
10
+ JrJackson::Smile.generate obj -> smile string
11
+ JrJackson::Smile.parse smile_str -> hash like object
12
+
13
+
14
+ Credit to Chuck Remes for the benchmark and initial
15
+ investigation when the jruby, json gem and the jackson
16
+ libraries were young.
17
+
18
+ I compared json-jruby 1.5.1 and jackson/smile 1.9.5 on jruby 1.6.7 and Java 7
19
+
20
+ user system total real
21
+ jackson generate: 0.756000 0.000000 0.756000 ( 0.756000)
22
+ smile generate: 0.530000 0.000000 0.530000 ( 0.530000)
23
+ ruby generate: 2.754000 0.000000 2.754000 ( 2.754000)
24
+ jackson parse: 0.630000 0.000000 0.630000 ( 0.630000)
25
+ smile parse: 0.368000 0.000000 0.368000 ( 0.368000)
26
+ ruby parse: 2.102000 0.000000 2.102000 ( 2.102000)
27
+
28
+ Variants:
29
+
30
+ jrjackson.rb
31
+ this variant is the fastest but the parse function will
32
+ return Java ArrayList instead of Ruby Array and
33
+ Java LinkedHashMap instead of Ruby Hash.
34
+ In Jruby 1.6.0+, these java classes have most if not all
35
+ of the behaviour of the corresponding Ruby classes
36
+
37
+ jrjackson_r.rb
38
+ If you absolutely need Ruby Objects then use this variant
39
+ It parses a little bit slower than the above but
40
+ returns Ruby Array and Hash objects
41
+
42
+ jrjackson_r_sym.rb
43
+ Will give you symbols for hash keys instead of strings
44
+
data/Rakefile ADDED
@@ -0,0 +1,159 @@
1
+ require 'date'
2
+ require 'rspec/core/rake_task'
3
+
4
+ #############################################################################
5
+ #
6
+ # Helper functions
7
+ #
8
+ #############################################################################
9
+
10
+ def name
11
+ @name ||= Dir['*.gemspec'].first.split('.').first
12
+ end
13
+
14
+ def version
15
+ line = File.read("lib/#{name}/version.rb")[/^\s*VERSION\s*=\s*.*/]
16
+ line.match(/.*VERSION\s*=\s*['"](.*)['"]/)[1]
17
+ end
18
+
19
+ def date
20
+ Date.today.to_s
21
+ end
22
+
23
+ def rubyforge_project
24
+ name
25
+ end
26
+
27
+ def gemspec_file
28
+ "#{name}.gemspec"
29
+ end
30
+
31
+ def gem_file
32
+ "#{name}-#{version}.gem"
33
+ end
34
+
35
+ def replace_header(head, header_name, provider = nil)
36
+ if provider
37
+ value = send(provider)
38
+ else
39
+ value = "'#{send(header_name)}'"
40
+ end
41
+
42
+ provider ||= header_name
43
+ head.sub!(/(\.#{header_name}\s*= ).*/) { "#{$1}#{value}"}
44
+ end
45
+
46
+ def platform
47
+ jruby? ? '-java' : ''
48
+ end
49
+
50
+ def platform_dependant_gem_file
51
+ "#{name}-#{version}#{platform}.gem"
52
+ end
53
+
54
+ def platform_dependent_version
55
+ "'#{version}#{platform}'"
56
+ end
57
+
58
+ def jruby?
59
+ RUBY_PLATFORM.to_s == 'java'
60
+ end
61
+
62
+ def trim_array_ends array
63
+ array.shift
64
+ array.pop
65
+ array
66
+ end
67
+
68
+ #############################################################################
69
+ #
70
+ # Custom tasks
71
+ #
72
+ #############################################################################
73
+
74
+ desc "Run benchmarks"
75
+ task :benchmark do
76
+ load 'benchmarking/benchmark.rb'
77
+ end
78
+
79
+ #############################################################################
80
+ #
81
+ # Packaging tasks
82
+ #
83
+ #############################################################################
84
+
85
+ def built_gem
86
+ @built_gem ||= Dir["#{name}*.gem"].first
87
+ end
88
+
89
+ desc "Create tag v#{platform_dependent_version} and build and push #{platform_dependant_gem_file} to Rubygems"
90
+ task :release => :build do
91
+ unless `git branch` =~ /^\* master$/
92
+ puts "You must be on the master branch to release!"
93
+ exit!
94
+ end
95
+
96
+ sh "git commit --allow-empty -a -m 'Release #{platform_dependent_version}'"
97
+ sh "git tag v#{platform_dependent_version}"
98
+ sh "git push origin master"
99
+ sh "git push origin v#{platform_dependent_version}"
100
+
101
+ command = "gem push pkg/#{platform_dependant_gem_file}"
102
+
103
+ if jruby?
104
+ puts "--------------------------------------------------------------------------------------"
105
+ puts "can't push to rubygems using jruby at the moment, so switch to mri and run: #{command}"
106
+ puts "--------------------------------------------------------------------------------------"
107
+ else
108
+ sh command
109
+ end
110
+ end
111
+
112
+ desc "Build #{platform_dependant_gem_file} into the pkg directory"
113
+ task :build => :gemspec do
114
+ sh "mkdir -p pkg"
115
+ sh "gem build #{gemspec_file}"
116
+ sh "mv #{built_gem} pkg"
117
+ end
118
+
119
+ desc "Generate #{gemspec_file}"
120
+ task :gemspec => :validate do
121
+ # read spec file and split out manifest section
122
+ spec = File.read(gemspec_file)
123
+ head, manifest, tail = spec.split(" # = MANIFEST =\n")
124
+
125
+ # replace name version and date
126
+ replace_header(head, :name)
127
+ replace_header(head, :version)
128
+ replace_header(head, :date)
129
+ #comment this out if your rubyforge_project has a different name
130
+ #replace_header(head, :rubyforge_project)
131
+
132
+ # determine file list from git ls-files
133
+ files = `git ls-files`.
134
+ split("\n").
135
+ sort.
136
+ reject { |file| file =~ /^\./ }.
137
+ reject { |file| file =~ /^(rdoc|pkg)/ }.
138
+ map { |file| " #{file}" }.
139
+ join("\n")
140
+
141
+ # piece file back together and write
142
+ manifest = " s.files = %w[\n#{files}\n ]\n"
143
+ spec = [head, manifest, tail].join(" # = MANIFEST =\n")
144
+ File.open(gemspec_file, 'w') { |io| io.write(spec) }
145
+ puts "Updated #{gemspec_file}"
146
+ end
147
+
148
+ desc "Validate #{gemspec_file}"
149
+ task :validate do
150
+ # libfiles = Dir['lib/*'] - ["lib/#{name}.rb", "lib/#{name}"]
151
+ # unless libfiles.empty?
152
+ # puts "Directory `lib` should only contain a `#{name}.rb` file and `#{name}` dir."
153
+ # exit!
154
+ # end
155
+ unless Dir['VERSION*'].empty?
156
+ puts "A `VERSION` file at root level violates Gem best practices."
157
+ exit!
158
+ end
159
+ end
@@ -0,0 +1,82 @@
1
+ require 'rubygems'
2
+ require 'benchmark'
3
+ require 'digest'
4
+ require 'json'
5
+ require 'lib/jrjackson'
6
+
7
+ HASH = {:one => nil, :two => nil, :three => nil, :four => {:a => nil, :b => nil, :c =>nil},
8
+ :five => {:d => nil, :e => nil},
9
+ :six => {:f => nil, :g => nil, :h =>nil, :i => nil, :j => nil, :k => nil, :l => nil},
10
+ :seven => nil, :eight => nil,
11
+ :nine => {:m => {:A => nil, :B => nil}}}
12
+
13
+ def random_string
14
+ Digest::MD5.hexdigest "#{Time.now + rand(999)}"
15
+ end
16
+
17
+ def random_number
18
+ rand 999_999_999
19
+ end
20
+
21
+ def random_float
22
+ random_number + rand
23
+ end
24
+
25
+ def randomize_entries hsh
26
+ new_hsh = {}
27
+ hsh.each_pair do |key, value|
28
+ case value
29
+ when NilClass
30
+ new_hsh[key] = send METHODS[rand(3)]
31
+ when Hash
32
+ new_hsh[key] = randomize_entries value
33
+ end
34
+ end
35
+ new_hsh
36
+ end
37
+
38
+ METHODS = [:random_string, :random_number, :random_float]
39
+
40
+ org_array = []
41
+ one = []
42
+ #
43
+ 0.upto(50000) do |i|
44
+ hsh = HASH.dup
45
+ org_array << randomize_entries(hsh)
46
+ end
47
+
48
+ generated_array = []
49
+ generated_smile = []
50
+
51
+
52
+ org_array.each do |hsh|
53
+ generated_array << JrJackson::Json.generate(hsh)
54
+ generated_smile << JrJackson::Smile.generate(hsh)
55
+ end
56
+
57
+ Benchmark.bmbm("jackson generate: plus some margin".size) do |x|
58
+
59
+ x.report("jackson generate:") do
60
+ org_array.each {|hsh| JrJackson::Json.generate(hsh) }
61
+ end
62
+
63
+ x.report("smile generate:") do
64
+ org_array.each {|hsh| JrJackson::Smile.generate(hsh) }
65
+ end
66
+
67
+ x.report("ruby generate:") do
68
+ org_array.each {|hsh| JSON.fast_generate(hsh) }
69
+ end
70
+
71
+ x.report("jackson parse:") do
72
+ generated_array.each {|string| JrJackson::Json.parse(string) }
73
+ end
74
+
75
+ x.report("smile parse:") do
76
+ generated_smile.each {|string| JrJackson::Smile.parse(string) }
77
+ end
78
+
79
+ x.report("ruby parse:") do
80
+ generated_array.each {|string| JSON.parse(string) }
81
+ end
82
+ end
data/jrjackson.gemspec ADDED
@@ -0,0 +1,40 @@
1
+ #! /usr/bin/env jruby
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'jrjackson'
5
+ s.version = '0.0.7'
6
+ s.date = '2012-03-14'
7
+ s.platform = Gem::Platform::RUBY
8
+ s.authors = ['Guy Boertje']
9
+ s.email = ['guyboertje@gmail.com']
10
+ s.homepage = "http://github.com/guyboertje/jrjackson"
11
+ s.summary = %q{A JRuby wrapper for the java jackson json processor jar}
12
+ s.description = %q{}
13
+
14
+ # = MANIFEST =
15
+ s.files = %w[
16
+ Gemfile
17
+ README
18
+ Rakefile
19
+ benchmarking/benchmark.rb
20
+ jrjackson.gemspec
21
+ lib/jrjackson.rb
22
+ lib/jrjackson/jackson-core-asl-1.9.5.jar
23
+ lib/jrjackson/jackson-mapper-asl-1.9.5.jar
24
+ lib/jrjackson/jackson-smile-1.9.5.jar
25
+ lib/jrjackson/jrjackson.rb
26
+ lib/jrjackson/rubify.rb
27
+ lib/jrjackson/rubify_with_symbol_keys.rb
28
+ lib/jrjackson/version.rb
29
+ lib/jrjackson_r.rb
30
+ lib/jrjackson_r_sym.rb
31
+ profiling/profiled.rb
32
+ ]
33
+ # = MANIFEST =
34
+
35
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
36
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
37
+
38
+ s.add_development_dependency 'awesome_print', '~> 0.4.0'
39
+
40
+ end
@@ -0,0 +1,43 @@
1
+ %W(jackson-core-asl-1.9.5.jar jackson-mapper-asl-1.9.5.jar jackson-smile-1.9.5.jar).each {|f| require File.join("jrjackson",f)}
2
+
3
+ module JrJackson
4
+ include_package "org.codehaus.jackson"
5
+ include_package "org.codehaus.jackson.map"
6
+ include_package "org.codehaus.jackson.smile"
7
+
8
+ Jclass = java.lang.Object.java_class
9
+
10
+ Mapper = ObjectMapper.new
11
+ SmileMapper = ObjectMapper.new(SmileFactory.new)
12
+
13
+ module Json
14
+ def self.parse(json_string)
15
+ Mapper.read_value json_string, Jclass
16
+ end
17
+ def self.generate(object)
18
+ Mapper.writeValueAsString(object)
19
+ end
20
+ def self.load(json_string)
21
+ Mapper.read_value json_string, Jclass
22
+ end
23
+ def self.dump(object)
24
+ Mapper.writeValueAsString(object)
25
+ end
26
+ end
27
+ module Smile
28
+ def self.parse(smile_bytes)
29
+ SmileMapper.read_value smile_bytes,0,smile_bytes.size, Jclass
30
+ end
31
+ def self.generate(object)
32
+ SmileMapper.writeValueAsBytes(object)
33
+ end
34
+ def self.load(smile_bytes)
35
+ SmileMapper.read_value smile_bytes,0,smile_bytes.size, Jclass
36
+ end
37
+ def self.dump(object)
38
+ SmileMapper.writeValueAsBytes(object)
39
+ end
40
+ end
41
+ end
42
+
43
+ JSON = JrJackson::Json unless defined?(JSON)
@@ -0,0 +1,35 @@
1
+ module JrJackson
2
+ include_package "org.codehaus.jackson.map.module"
3
+ java_import org.codehaus.jackson.map.deser.UntypedObjectDeserializer
4
+ java_import org.codehaus.jackson.Version
5
+ java_import org.codehaus.jackson.JsonToken
6
+
7
+ class RubyObjectDeserializer < UntypedObjectDeserializer
8
+ def mapArray(jp,ctxt)
9
+ arr = super(jp,ctxt)
10
+ arr.entries
11
+ end
12
+
13
+ def mapObject(jp,ctxt)
14
+ t = jp.getCurrentToken
15
+ t = jp.nextToken if t == JsonToken::START_OBJECT
16
+
17
+ return {} if t != JsonToken::FIELD_NAME
18
+ tmp = []
19
+ begin
20
+ k = jp.getText
21
+ jp.nextToken
22
+ v = deserialize(jp, ctxt)
23
+ tmp.push(k)
24
+ tmp.push(v)
25
+ end while jp.nextToken != JsonToken::END_OBJECT
26
+ Hash[*tmp]
27
+ end
28
+ end
29
+
30
+ _module = SimpleModule.new("JrJacksonModule", Version.new(1, 0, 0, nil))
31
+ _module.addDeserializer(Jclass, RubyObjectDeserializer.new)
32
+ Mapper.registerModule(_module)
33
+
34
+ end
35
+
@@ -0,0 +1,34 @@
1
+ module JrJackson
2
+ include_package "org.codehaus.jackson.map.module"
3
+ java_import org.codehaus.jackson.map.deser.UntypedObjectDeserializer
4
+ java_import org.codehaus.jackson.Version
5
+ java_import org.codehaus.jackson.JsonToken
6
+
7
+ class RubyObjectDeserializer < UntypedObjectDeserializer
8
+ def mapArray(jp,ctxt)
9
+ arr = super(jp,ctxt)
10
+ arr.entries
11
+ end
12
+
13
+ def mapObject(jp,ctxt)
14
+ t = jp.getCurrentToken
15
+ t = jp.nextToken if t == JsonToken::START_OBJECT
16
+
17
+ return {} if t != JsonToken::FIELD_NAME
18
+ tmp = []
19
+ begin
20
+ k = jp.getText
21
+ jp.nextToken
22
+ v = deserialize(jp, ctxt)
23
+ tmp.push(k.to_sym)
24
+ tmp.push(v)
25
+ end while jp.nextToken != JsonToken::END_OBJECT
26
+ Hash[*tmp]
27
+ end
28
+ end
29
+
30
+ _module = SimpleModule.new("JrJacksonModule", Version.new(1, 0, 0, nil))
31
+ _module.addDeserializer(Jclass, RubyObjectDeserializer.new)
32
+ Mapper.registerModule(_module)
33
+
34
+ end
@@ -0,0 +1,4 @@
1
+
2
+ module JrJackson
3
+ VERSION = '0.0.7'
4
+ end
data/lib/jrjackson.rb ADDED
@@ -0,0 +1,10 @@
1
+ unless RUBY_PLATFORM =~ /java/
2
+ error "This library is only compatible with a java-based ruby environment like JRuby."
3
+ exit 255
4
+ end
5
+
6
+ require 'java'
7
+
8
+ $CLASSPATH << 'jrjackson'
9
+
10
+ require File.join("jrjackson","jrjackson")
@@ -0,0 +1,11 @@
1
+ unless RUBY_PLATFORM =~ /java/
2
+ error "This library is only compatible with a java-based ruby environment like JRuby."
3
+ exit 255
4
+ end
5
+
6
+ require 'java'
7
+
8
+ $CLASSPATH << 'jrjackson'
9
+
10
+ require File.join("jrjackson","jrjackson")
11
+ require File.join("jrjackson","rubify")
@@ -0,0 +1,11 @@
1
+ unless RUBY_PLATFORM =~ /java/
2
+ error "This library is only compatible with a java-based ruby environment like JRuby."
3
+ exit 255
4
+ end
5
+
6
+ require 'java'
7
+
8
+ $CLASSPATH << 'jrjackson'
9
+
10
+ require File.join("jrjackson","jrjackson")
11
+ require File.join("jrjackson","rubify_with_symbol_keys")
@@ -0,0 +1,15 @@
1
+ require 'rubygems'
2
+ require 'jruby-prof'
3
+ require 'jrjackson_r'
4
+
5
+ js = %({"one":1,"two":"deux","three":[333.333,66.666]})
6
+
7
+ result = JRubyProf.profile do
8
+ JrJackson::Json.parse js
9
+ end
10
+
11
+ JRubyProf.print_flat_text result, "flat.txt"
12
+ JRubyProf.print_graph_text result, "graph.txt"
13
+ JRubyProf.print_graph_html result, "graph.html"
14
+ JRubyProf.print_call_tree result, "call_tree.txt"
15
+ JRubyProf.print_tree_html result, "call_tree.html"
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jrjackson
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.7
6
+ platform: ruby
7
+ authors:
8
+ - Guy Boertje
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-14 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: awesome_print
16
+ version_requirements: &2056 !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ~>
19
+ - !ruby/object:Gem::Version
20
+ version: 0.4.0
21
+ none: false
22
+ requirement: *2056
23
+ prerelease: false
24
+ type: :development
25
+ description: ''
26
+ email:
27
+ - guyboertje@gmail.com
28
+ executables: []
29
+ extensions: []
30
+ extra_rdoc_files: []
31
+ files:
32
+ - Gemfile
33
+ - README
34
+ - Rakefile
35
+ - benchmarking/benchmark.rb
36
+ - jrjackson.gemspec
37
+ - lib/jrjackson.rb
38
+ - lib/jrjackson/jackson-core-asl-1.9.5.jar
39
+ - lib/jrjackson/jackson-mapper-asl-1.9.5.jar
40
+ - lib/jrjackson/jackson-smile-1.9.5.jar
41
+ - lib/jrjackson/jrjackson.rb
42
+ - lib/jrjackson/rubify.rb
43
+ - lib/jrjackson/rubify_with_symbol_keys.rb
44
+ - lib/jrjackson/version.rb
45
+ - lib/jrjackson_r.rb
46
+ - lib/jrjackson_r_sym.rb
47
+ - profiling/profiled.rb
48
+ homepage: http://github.com/guyboertje/jrjackson
49
+ licenses: []
50
+ post_install_message:
51
+ rdoc_options: []
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ! '>='
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ none: false
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ! '>='
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ none: false
66
+ requirements: []
67
+ rubyforge_project:
68
+ rubygems_version: 1.8.15
69
+ signing_key:
70
+ specification_version: 3
71
+ summary: A JRuby wrapper for the java jackson json processor jar
72
+ test_files: []
73
+ ...