json_schema_tools 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -111,6 +111,38 @@ methods to you local classes .. like people NOT using JSON schema
111
111
  # raw access
112
112
  contact.schema_attrs
113
113
 
114
+ ## Objects from Schema - KlassFactory
115
+
116
+ Use the KlassFactory to directly create classes, with all attributes from a
117
+ schema. The classes are named after each schema[name] found in from global path.
118
+ So lets assume you have a 'client.json' schema with a name attribute in it, for
119
+ the following examples:
120
+
121
+ SchemaTools::KlassFactory.build
122
+ client = Client.new
123
+ client.name = 'Mändy'
124
+
125
+
126
+ Rather like a namespace? Good idea, but the class or module must be defined.
127
+
128
+ module SalesKing; end
129
+ SchemaTools::KlassFactory.build namespace: SalesKing
130
+ client = SalesKing::Client.new
131
+
132
+ Add a custom schema reader
133
+
134
+ reader = SchemaTools::Reader.new
135
+ reader.path = HappyPdf::Schema.path
136
+ SchemaTools::KlassFactory.build reader: reader
137
+
138
+
139
+
140
+ ## Real world examples
141
+
142
+ * [HappyPdf json schema](https://github.com/happyPDF/happypdf_json_schema) .. api gem will follow
143
+ * [DocTag ruby gem](https://github.com/docTag/doctag_rb) and [DocTag json-schema](https://github.com/docTag/doctag_json_schema)
144
+ * [SalesKing json schema](https://github.com/salesking/sk_api_schema)
145
+
114
146
  ## Test
115
147
 
116
148
  Only runs on Ruby 1.9
@@ -4,12 +4,12 @@ require 'schema_tools/version'
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = 'json_schema_tools'
7
- s.version = SchemaBuilder::VERSION
7
+ s.version = SchemaTools::VERSION
8
8
  s.authors = ['Georg Leciejewski']
9
9
  s.email = ['gl@salesking.eu']
10
- s.homepage = 'http://www.salesking.eu/dev'
11
- s.summary = %q{JSON Schema API tools.}
12
- s.description = %q{Want to create a JSON Schema powered API? This toolset provides methods to read schemata, render objects as defined in schema, clean parameters according to schema, ...}
10
+ s.homepage = 'https://github.com/salesking/json_schema_tools'
11
+ s.summary = %q{JSON Schema API tools for server and client side}
12
+ s.description = %q{Want to create or read a JSON Schema powered API? This toolset provides methods to read schemata, render objects as defined in schema, clean parameters according to schema, ...}
13
13
 
14
14
  s.files = `git ls-files`.split("\n")
15
15
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -0,0 +1,35 @@
1
+ # encoding: utf-8
2
+ require 'active_support/core_ext/string/inflections'
3
+ module SchemaTools
4
+ class KlassFactory
5
+
6
+ class << self
7
+
8
+ # Build classes from schema inside the given namespace. Uses all classes
9
+ # found in schema path
10
+ #
11
+ # @param [String|Symbol|Module] namespace of the new classes e.g. MyCustomNamespace::MySchemaClass
12
+ # @param [Hash] opts
13
+ # @options opts [SchemaTools::Reader] :reader to use instead of global one
14
+ def build(opts={})
15
+ reader = opts[:reader] || SchemaTools::Reader
16
+ schemata = reader.read_all( opts[:path] || SchemaTools.schema_path )
17
+ namespace = opts[:namespace] || Object
18
+ if namespace.is_a?(String) || namespace.is_a?(Symbol)
19
+ namespace = "#{namespace}".constantize
20
+ end
21
+
22
+ schemata.each do |schema|
23
+ klass_name = schema['name'].classify
24
+ next if namespace.const_defined?(klass_name, false)
25
+ klass = namespace.const_set(klass_name, Class.new)
26
+ klass.class_eval do
27
+ include SchemaTools::Modules::Attributes
28
+ has_schema_attrs schema['name'], reader: reader
29
+ end
30
+ end
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -15,8 +15,10 @@ module SchemaTools
15
15
  # @param [Symbol|String] schema name
16
16
  # @param [Hash<Symbol|String>] opts
17
17
  # @options opts [String] :path schema path
18
+ # @options opts [SchemaTools::Reader] :reader instance, instead of global reader/registry
18
19
  def has_schema_attrs(schema, opts={})
19
- schema = SchemaTools::Reader.read(schema, opts[:path])
20
+ reader = opts[:reader] || SchemaTools::Reader
21
+ schema = reader.read(schema, opts[:path])
20
22
  # make getter / setter
21
23
  schema[:properties].each do |key, val|
22
24
  # getter
@@ -1,3 +1,3 @@
1
- module SchemaBuilder
2
- VERSION = '0.0.6'
1
+ module SchemaTools
2
+ VERSION = '0.0.7'
3
3
  end
data/lib/schema_tools.rb CHANGED
@@ -6,6 +6,7 @@ require 'schema_tools/modules/attributes'
6
6
  require 'schema_tools/reader'
7
7
  require 'schema_tools/cleaner'
8
8
  require 'schema_tools/hash'
9
+ require 'schema_tools/klass_factory'
9
10
 
10
11
 
11
12
  module SchemaTools
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ class TestNamespaceKlass
4
+ # for schema classes
5
+ end
6
+
7
+ module TestNamespaceModule
8
+
9
+ end
10
+
11
+ describe SchemaTools::KlassFactory do
12
+
13
+ after :each do
14
+ SchemaTools::Reader.registry_reset
15
+
16
+ # try cleaning objs
17
+ Object.send :remove_const, 'Client' if Object.const_defined? 'Client'
18
+ TestNamespaceKlass.send :remove_const, 'Client' if TestNamespaceKlass.const_defined? 'Client'
19
+ TestNamespaceModule.send :remove_const, 'Client' if TestNamespaceModule.const_defined? 'Client'
20
+ end
21
+
22
+ context 'class building' do
23
+ it 'should build from class name' do
24
+ SchemaTools::KlassFactory.build
25
+ expect { Client.new }.to_not raise_error
26
+ expect { Lead.new }.to_not raise_error
27
+ end
28
+
29
+ end
30
+
31
+ context 'class building with namespace' do
32
+
33
+ after :each do
34
+ end
35
+
36
+ it 'should build from class name' do
37
+ SchemaTools::KlassFactory.build(namespace: TestNamespaceKlass)
38
+ expect { TestNamespaceKlass::Client.new }.to_not raise_error
39
+ end
40
+
41
+ it 'should build from class as string' do
42
+ SchemaTools::KlassFactory.build(namespace: 'TestNamespaceKlass')
43
+ expect { TestNamespaceKlass::Client.new }.to_not raise_error
44
+ end
45
+ it 'should build from module name' do
46
+ SchemaTools::KlassFactory.build(namespace: TestNamespaceModule)
47
+ expect { TestNamespaceModule::Client.new }.to_not raise_error
48
+ end
49
+
50
+ it 'should build from module name as string' do
51
+ SchemaTools::KlassFactory.build(namespace: 'TestNamespaceModule')
52
+ expect { TestNamespaceModule::Client.new }.to_not raise_error
53
+ end
54
+
55
+ end
56
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_schema_tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-31 00:00:00.000000000 Z
12
+ date: 2013-01-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json
@@ -91,9 +91,9 @@ dependencies:
91
91
  - - ! '>='
92
92
  - !ruby/object:Gem::Version
93
93
  version: '0'
94
- description: Want to create a JSON Schema powered API? This toolset provides methods
95
- to read schemata, render objects as defined in schema, clean parameters according
96
- to schema, ...
94
+ description: Want to create or read a JSON Schema powered API? This toolset provides
95
+ methods to read schemata, render objects as defined in schema, clean parameters
96
+ according to schema, ...
97
97
  email:
98
98
  - gl@salesking.eu
99
99
  executables: []
@@ -111,6 +111,7 @@ files:
111
111
  - lib/schema_tools.rb
112
112
  - lib/schema_tools/cleaner.rb
113
113
  - lib/schema_tools/hash.rb
114
+ - lib/schema_tools/klass_factory.rb
114
115
  - lib/schema_tools/modules/attributes.rb
115
116
  - lib/schema_tools/modules/hash.rb
116
117
  - lib/schema_tools/modules/read.rb
@@ -123,10 +124,11 @@ files:
123
124
  - spec/fixtures/page.json
124
125
  - spec/schema_tools/cleaner_spec.rb
125
126
  - spec/schema_tools/hash_spec.rb
127
+ - spec/schema_tools/klass_factory_spec.rb
126
128
  - spec/schema_tools/modules/attributes_spec.rb
127
129
  - spec/schema_tools/reader_spec.rb
128
130
  - spec/spec_helper.rb
129
- homepage: http://www.salesking.eu/dev
131
+ homepage: https://github.com/salesking/json_schema_tools
130
132
  licenses: []
131
133
  post_install_message:
132
134
  rdoc_options: []
@@ -140,7 +142,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
140
142
  version: '0'
141
143
  segments:
142
144
  - 0
143
- hash: 77879165624642168
145
+ hash: -3983792296207531443
144
146
  required_rubygems_version: !ruby/object:Gem::Requirement
145
147
  none: false
146
148
  requirements:
@@ -149,11 +151,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
149
151
  version: '0'
150
152
  segments:
151
153
  - 0
152
- hash: 77879165624642168
154
+ hash: -3983792296207531443
153
155
  requirements: []
154
156
  rubyforge_project:
155
157
  rubygems_version: 1.8.24
156
158
  signing_key:
157
159
  specification_version: 3
158
- summary: JSON Schema API tools.
160
+ summary: JSON Schema API tools for server and client side
159
161
  test_files: []