jrjackson 0.0.7

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/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
+ ...