rubyfox-sfsobject 0.0.1-universal-java-1.6 → 0.1.0-universal-java-1.6

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Rubyfox::SFSObject
1
+ # Rubyfox::SFSObject [![Build Status](https://secure.travis-ci.org/neopoly/rubyfox-sfsobject.png)](http://travis-ci.org/neopoly/rubyfox-sfsobject)
2
2
 
3
3
  Converts between SmartFox's SFSObjects and Ruby Hashes.
4
4
 
@@ -18,16 +18,30 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
+ ### Bulk mode
22
+
21
23
  require 'rubyfox/sfsobject/bulk'
22
24
  sfs_object = Rubyfox::SFSObject::Bulk.to_sfs({ :hello => "world" })
23
25
  # => SFSObject ready to use in SmartFox
24
- hash = Rubyfox::SFSObject::Bulk.to.hash(sfs_object)
26
+ hash = Rubyfox::SFSObject::Bulk.to_hash(sfs_object)
25
27
  # => { :hello => "world" }
26
28
 
27
29
 
30
+ ### Schema mode
31
+
32
+ require 'rubyfox/sfsobject/schema'
33
+ schema = { :hello => String }
34
+ sfs_object = Rubyfox::SFSObject::Schema.to_sfs(schema, { :hello => "world" })
35
+ # => SFSObject ready to use in SmartFox
36
+ hash = Rubyfox::SFSObject::Schema.to_hash(schema, sfs_object)
37
+ # => { :hello => "world" }
38
+
39
+
40
+ ### Core extension
41
+
28
42
  You can extend Hash and SFSObject with method shortcuts:
29
43
 
30
- require 'rubyfox/sfsobject/extend'
44
+ require 'rubyfox/sfsobject/core_ext'
31
45
  sfs_object = { :hello => "world" }.to_sfs
32
46
  # => SFSObject
33
47
  sfs_object.to_hash
@@ -37,6 +51,10 @@ You can extend Hash and SFSObject with method shortcuts:
37
51
 
38
52
  *Note* that all hash keys will be converted to symbols.
39
53
 
54
+ ## TODO
55
+
56
+ * More docs, please!
57
+
40
58
  ## Contributing
41
59
 
42
60
  1. Fork it
@@ -12,7 +12,7 @@ module Rubyfox
12
12
  FalseClass => :putBool,
13
13
  Fixnum => :putInt,
14
14
  Float => :putDouble,
15
- Hash => proc { |o, k, v| o.putSFSObject(k, Rubyfox::SFSObject::Bulk.to_sfs(v)) },
15
+ Hash => proc { |o, k, v| o.putSFSObject(k, to_sfs(v)) },
16
16
  [String] => :putUtfStringArray,
17
17
  [TrueClass] => :putBoolArray,
18
18
  [FalseClass] => :putBoolArray,
@@ -24,7 +24,7 @@ module Rubyfox
24
24
  [Float] => :putDoubleArray,
25
25
  [Hash] => proc do |o, k, v|
26
26
  ary = Java::SFSArray.new
27
- v.each { |e| ary.addSFSObject(Rubyfox::SFSObject::Bulk.to_sfs(e)) }
27
+ v.each { |e| ary.addSFSObject(to_sfs(e)) }
28
28
  o.putSFSArray(k, ary)
29
29
  end
30
30
  }
@@ -41,9 +41,9 @@ module Rubyfox
41
41
  "INT_ARRAY" => proc { |h, k, v| h[k.to_sym] = v.object.to_a },
42
42
  "LONG_ARRAY" => :getLongArray,
43
43
  "DOUBLE_ARRAY" => :getDoubleArray,
44
- "SFS_OBJECT" => proc { |h, k, v| h[k.to_sym] = Rubyfox::SFSObject::Bulk.to_hash(v.object) },
44
+ "SFS_OBJECT" => proc { |h, k, v| h[k.to_sym] = to_hash(v.object) },
45
45
  "SFS_ARRAY" => proc do |h, k, v|
46
- h[k.to_sym] = v.object.iterator.map { |e| Rubyfox::SFSObject::Bulk.to_hash(e.object) }
46
+ h[k.to_sym] = v.object.iterator.map { |e| to_hash(e.object) }
47
47
  end
48
48
  }
49
49
 
@@ -0,0 +1,24 @@
1
+ # Extends core object with some conversion methods.
2
+
3
+ require 'rubyfox/sfsobject/bulk'
4
+ require 'rubyfox/sfsobject/schema'
5
+
6
+ class Hash
7
+ def to_sfs(schema=:none)
8
+ if schema == :none
9
+ Rubyfox::SFSObject::Bulk.to_sfs(self)
10
+ else
11
+ Rubyfox::SFSObject::Schema.to_sfs(schema, self)
12
+ end
13
+ end
14
+ end
15
+
16
+ class Rubyfox::SFSObject::Java::SFSObject
17
+ def to_hash(schema=:none)
18
+ if schema == :none
19
+ Rubyfox::SFSObject::Bulk.to_hash(self)
20
+ else
21
+ Rubyfox::SFSObject::Schema.to_hash(schema, self)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,110 @@
1
+ module Boolean
2
+ end
3
+
4
+ class TrueClass
5
+ include Boolean
6
+ end
7
+
8
+ class FalseClass
9
+ include Boolean
10
+ end
11
+
12
+ require 'rubyfox/sfsobject/java'
13
+
14
+ module Rubyfox
15
+ module SFSObject
16
+ class Schema
17
+ TO_SFS = {
18
+ String => proc { |o, s, k, v| o.put_utf_string(k, v) },
19
+ Boolean => proc { |o, s, k, v| o.put_bool(k, v) },
20
+ Fixnum => proc { |o, s, k, v| o.put_int(k, v) },
21
+ Float => proc { |o, s, k, v| o.put_double(k, v) },
22
+ Hash => proc { |o, s, k, v| o.put_sfs_object(k, to_sfs(s, v)) },
23
+ [String] => proc { |o, s, k, v| o.put_utf_string_array(k, v) },
24
+ [Boolean] => proc { |o, s, k, v| o.put_bool_array(k, v) },
25
+ [Fixnum] => proc do |o, s, k, v|
26
+ collection = Java::ArrayList.new(v.size)
27
+ v.each { |e| collection.add(e.to_java(:int)) }
28
+ o.put_int_array(k, collection)
29
+ end,
30
+ [Float] => proc { |o, s, k, v| o.put_double_array(k, v) },
31
+ [Hash] => proc { |o, s, k, v|
32
+ ary = Java::SFSArray.new
33
+ schema = s[0]
34
+ v.each { |e| ary.add_sfs_object(to_sfs(schema, e)) }
35
+ o.put_sfs_array(k, ary)
36
+ }
37
+ }
38
+
39
+ TO_HASH = {
40
+ String => proc { |o, s, k| o.get_utf_string(k) },
41
+ Boolean => proc { |o, s, k| o.get_bool(k) },
42
+ Fixnum => proc { |o, s, k| o.get_int(k) },
43
+ Float => proc { |o, s, k| o.get_double(k) },
44
+ Hash => proc { |o, s, k| to_hash(s, o.get_sfs_object(k)) },
45
+ [String] => proc { |o, s, k| o.get_utf_string_array(k).to_a },
46
+ [Boolean] => proc { |o, s, k| o.get_bool_array(k).to_a },
47
+ [Fixnum] => proc { |o, s, k| o.get_int_array(k).to_a },
48
+ [Float] => proc { |o, s, k| o.get_double_array(k).to_a },
49
+ [Hash] => proc { |o, s, k|
50
+ sfs_ary = o.get_sfs_array(k)
51
+ ary = []
52
+ schema = s[0]
53
+ sfs_ary.size.times do |i|
54
+ ary << to_hash(schema, sfs_ary.get_sfs_object(i))
55
+ end
56
+ ary
57
+ }
58
+ }
59
+
60
+ def initialize(schema={})
61
+ @schema = schema
62
+ end
63
+
64
+ def to_sfs(hash)
65
+ self.class.to_sfs(@schema, hash)
66
+ end
67
+
68
+ def self.to_sfs(schemas, hash)
69
+ object = Java::SFSObject.new_instance
70
+ schemas.each do |key, schema|
71
+ next unless hash && hash.key?(key)
72
+ value = hash[key]
73
+ if method = wrap_method(TO_SFS, schema)
74
+ method.call(object, schema, key, value)
75
+ else
76
+ raise ArgumentError, "wrapper for #{key}=#{value} (#{schema}) not found"
77
+ end
78
+ end
79
+ object
80
+ end
81
+
82
+ def to_hash(object)
83
+ self.class.to_hash(@schema, object)
84
+ end
85
+
86
+ def self.to_hash(schemas, object)
87
+ hash = {}
88
+ schemas.each do |key, schema|
89
+ next unless object.contains_key(key.to_s)
90
+ if method = wrap_method(TO_HASH, schema)
91
+ hash[key] = method.call(object, schema, key)
92
+ else
93
+ raise ArgumentError, "unwrapper for #{key}=#{value} (#{schema}) not found"
94
+ end
95
+ end
96
+ hash
97
+ end
98
+
99
+ def self.wrap_method(map, schema)
100
+ if Hash === schema
101
+ map[Hash]
102
+ elsif Array === schema && Hash === schema.first
103
+ map[[Hash]]
104
+ else
105
+ map[schema]
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
@@ -1,5 +1,5 @@
1
1
  module Rubyfox
2
2
  module SFSObject
3
- VERSION = "0.0.1"
3
+ VERSION = "0.1.0"
4
4
  end
5
5
  end
@@ -4,8 +4,6 @@ require 'helper'
4
4
  require 'rubyfox/sfsobject/bulk'
5
5
 
6
6
  class RubyfoxSFSObjectBulkTest < RubyfoxCase
7
- let(:bulk) { Rubyfox::SFSObject::Bulk }
8
-
9
7
  test "empty" do
10
8
  assert_conversion Hash.new
11
9
  end
@@ -20,8 +18,8 @@ class RubyfoxSFSObjectBulkTest < RubyfoxCase
20
18
  end
21
19
 
22
20
  test "string" do
23
- assert_conversion :key => "value"
24
- assert_conversion :key => "üöäÜÖÄß"
21
+ assert_conversion :string => "value"
22
+ assert_conversion :string => "üöäÜÖÄß"
25
23
  end
26
24
 
27
25
  test "boolean" do
@@ -66,7 +64,7 @@ class RubyfoxSFSObjectBulkTest < RubyfoxCase
66
64
  end
67
65
 
68
66
  test "boolean" do
69
- assert_conversion :bool => [ true, true, false ]
67
+ assert_conversion :bool => [ true, false ]
70
68
  end
71
69
 
72
70
  test "fixnum" do
@@ -86,7 +84,7 @@ class RubyfoxSFSObjectBulkTest < RubyfoxCase
86
84
  private
87
85
 
88
86
  def assert_conversion(input, output=input)
89
- object = bulk.to_sfs(input)
90
- assert_equal output, bulk.to_hash(object)
87
+ object = Rubyfox::SFSObject::Bulk.to_sfs(input)
88
+ assert_equal output, Rubyfox::SFSObject::Bulk.to_hash(object)
91
89
  end
92
90
  end
@@ -0,0 +1,27 @@
1
+ require 'helper'
2
+ require 'rubyfox/sfsobject/core_xt'
3
+
4
+ class RubyfoxSFSObjectCoreExtTest < RubyfoxCase
5
+ context "bulk" do
6
+ test "methods" do
7
+ hash = { :key => "value"}
8
+ assert_equal hash, hash.to_sfs.to_hash
9
+ end
10
+ end
11
+
12
+ context "schema" do
13
+ test "methods" do
14
+ schema = { :key => String }
15
+ hash = { :key => "value" }
16
+ assert_equal hash, hash.to_sfs(schema).to_hash(schema)
17
+ end
18
+
19
+ test "fail w/o valid schema" do
20
+ schema = nil
21
+ hash = { :key => "value" }
22
+ assert_raises NoMethodError, :message => /each/ do
23
+ assert_equal hash, hash.to_sfs(schema).to_hash(schema)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,96 @@
1
+ # encoding: utf-8
2
+
3
+ require 'helper'
4
+ require 'rubyfox/sfsobject/schema'
5
+
6
+ class RubyfoxSFSObjectSchemaTest < RubyfoxCase
7
+ test "empty" do
8
+ assert_schema({}, {})
9
+ assert_schema({}, {:key => "value"}, {})
10
+ end
11
+
12
+ context "plain" do
13
+ test "nil is unknown" do
14
+ assert_raises ArgumentError, :message => /wrapper for null.*not found/ do
15
+ assert_schema({ :null => nil }, { :null => "foo" })
16
+ end
17
+ end
18
+
19
+ test "string" do
20
+ assert_schema({ :string => String }, { :string => "value" })
21
+ assert_schema({ :string => String }, { :string => "üöäÜÖÄß" })
22
+ end
23
+
24
+ test "bool" do
25
+ assert_schema({ :bool => Boolean }, { :bool => true })
26
+ assert_schema({ :bool => Boolean }, { :bool => false })
27
+ end
28
+
29
+ test "fixnum" do
30
+ assert_schema({ :fixnum => Fixnum }, { :fixnum => 1 })
31
+ assert_schema({ :fixnum => Fixnum }, { :fixnum => (2 ** 31 - 1) })
32
+ assert_schema({ :fixnum => Fixnum }, { :fixnum => -(2 ** 31) })
33
+ end
34
+
35
+ test "fixnum too big for int" do
36
+ assert_raises RangeError, :message => /too big for int/ do
37
+ assert_schema({ :fixnum => Fixnum }, { :fixnum => (2 ** 31) })
38
+ end
39
+ end
40
+
41
+ test "float" do
42
+ assert_schema({ :float => Float }, { :float => 1.0 })
43
+ assert_schema({ :float => Float }, { :float => 1.0 / 3 })
44
+ end
45
+
46
+ test "nested hash" do
47
+ assert_schema(
48
+ { :sub => { :key => String } },
49
+ { :sub => { :key => "value" } }
50
+ )
51
+ end
52
+ end
53
+
54
+ context "array" do
55
+ test "nil is unknown" do
56
+ assert_raises ArgumentError, :message => /wrapper for null.*not found/ do
57
+ assert_schema({ :null => [nil] }, { :null => "foo" })
58
+ end
59
+ end
60
+
61
+ test "string" do
62
+ assert_schema({ :string => [String] }, { :string => ["foo", "bar"] })
63
+ assert_schema({ :string => [String] }, { :string => ["foo", "üöäÜÖÄß"] })
64
+ assert_schema({ :string => [String] }, { :string => ["foo", 23] }) # strange?!
65
+ end
66
+
67
+ test "bool" do
68
+ assert_schema({ :bool => [Boolean] }, { :bool => [true, false] })
69
+ assert_schema({ :bool => [Boolean] }, { :bool => [true, 23] }) # strange?
70
+ end
71
+
72
+ test "fixnum" do
73
+ assert_schema({ :fixnum => [Fixnum] }, { :fixnum => [1, 2] })
74
+ assert_schema({ :fixnum => [Fixnum] }, { :fixnum => [(2 ** 31 - 1), -(2 ** 31)] })
75
+ end
76
+
77
+ test "float" do
78
+ assert_schema({ :float => [Float] }, { :float => [1.0, 1.0 / 3] })
79
+ end
80
+
81
+ test "nested hash" do
82
+ assert_schema(
83
+ { :sub => [ { :key => String } ] },
84
+ { :sub => [ { :key => "foo" }, { :key => "bar" }] }
85
+ )
86
+ end
87
+ end
88
+
89
+ private
90
+
91
+ def assert_schema(schema, input, output=input)
92
+ object = Rubyfox::SFSObject::Schema.to_sfs(schema, input)
93
+ hash = Rubyfox::SFSObject::Schema.to_hash(schema, object)
94
+ assert_equal output, hash
95
+ end
96
+ end
metadata CHANGED
@@ -2,14 +2,14 @@
2
2
  name: rubyfox-sfsobject
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.1
5
+ version: 0.1.0
6
6
  platform: universal-java-1.6
7
7
  authors:
8
8
  - Peter Suschlik
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-02 00:00:00.000000000 Z
12
+ date: 2012-11-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: minitest
@@ -63,13 +63,15 @@ files:
63
63
  - Rakefile
64
64
  - lib/rubyfox/sfsobject.rb
65
65
  - lib/rubyfox/sfsobject/bulk.rb
66
- - lib/rubyfox/sfsobject/extend.rb
66
+ - lib/rubyfox/sfsobject/core_ext.rb
67
67
  - lib/rubyfox/sfsobject/java.rb
68
+ - lib/rubyfox/sfsobject/schema.rb
68
69
  - lib/rubyfox/sfsobject/version.rb
69
70
  - rubyfox-sfsobject.gemspec
70
71
  - test/helper.rb
71
72
  - test/rubyfox/sfsobject/bulk_test.rb
72
- - test/rubyfox/sfsobject/extend_test.rb
73
+ - test/rubyfox/sfsobject/core_ext.rb
74
+ - test/rubyfox/sfsobject/schema_test.rb
73
75
  homepage: https://github.com/neopoly/rubyfox-sfsobject
74
76
  licenses: []
75
77
  post_install_message:
@@ -105,4 +107,5 @@ summary: ''
105
107
  test_files:
106
108
  - test/helper.rb
107
109
  - test/rubyfox/sfsobject/bulk_test.rb
108
- - test/rubyfox/sfsobject/extend_test.rb
110
+ - test/rubyfox/sfsobject/core_ext.rb
111
+ - test/rubyfox/sfsobject/schema_test.rb
@@ -1,15 +0,0 @@
1
- # Extends core object with some conversion methods.
2
-
3
- require 'rubyfox/sfsobject/bulk'
4
-
5
- class Hash
6
- def to_sfs
7
- Rubyfox::SFSObject::Bulk.to_sfs(self)
8
- end
9
- end
10
-
11
- class Rubyfox::SFSObject::Java::SFSObject
12
- def to_hash
13
- Rubyfox::SFSObject::Bulk.to_hash(self)
14
- end
15
- end
@@ -1,9 +0,0 @@
1
- require 'helper'
2
- require 'rubyfox/sfsobject/extend'
3
-
4
- class RubyfoxSFSObjectExtendTest < RubyfoxCase
5
- test "bulk methods" do
6
- hash = { :key => "string"}
7
- assert_equal hash, hash.to_sfs.to_hash
8
- end
9
- end