alba 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1a21e18114f54b4039fc354a92a248e3bb6d1d67680c086d8d7827ef201ffec0
4
- data.tar.gz: 507160ee7625df8bfb18955cca17b1eef804be1783ce4c61fac8f383eeac6301
3
+ metadata.gz: 62d87c709e80629fa4f9373e113a141da7489703d309fd1ed6b9b411e427a101
4
+ data.tar.gz: 3aacb3b018632b50cd2c71052c783e6aae97d6d79c2d1f0bb107ba07cc0d5bbd
5
5
  SHA512:
6
- metadata.gz: e97a450e7cbfaea63a048d20c396b6abfaae1cc55957e2e07cc1170fe4be5cc4174d807c1c398fb2534d120e9c3fa0cbb6f8cc9dd5c7026ddb448577a66ddf0f
7
- data.tar.gz: '08e02980bbe0ae8c9dc355f483399a87b120c3817bb3d7ddbfaec4ccd584c76d08825bca81088a3004636b14373d675c3ca861ce82fd41efabc0669b1ab701f8'
6
+ metadata.gz: 3eb9360c0f0a608252d521b89911308b45584c4456040579d844cc7cf09fc839f12f8a908cd20c9f6fd421123f17ca6248948d80e7d36e82adb5a6a42e82b460
7
+ data.tar.gz: d5ec4be5ede9d7cd359ed5f50af51d37c6926b99d5130f679655fec3949962c57d4c215dc212413e76f85ef20b74aa036e2b1955837ff113bcf41d3dc6f180bc
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- alba (0.0.1)
4
+ alba (0.1.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -21,12 +21,36 @@ Or install it yourself as:
21
21
  ## Usage
22
22
 
23
23
  ```ruby
24
- # If you don't bundle 'oj', that's file
25
- Alba.serialize({foo: 42}) # => '{"foo":42}'
26
-
27
- # bundle 'oj' in your Gemfile, then
28
- Alba.backend = :oj
29
- Alba.serialize({foo: 42}) # => '{"foo":42}'
24
+ class User
25
+ attr_accessor :id, :name, :email, :created_at, :updated_at
26
+ def initialize(id, name, email)
27
+ @id = id
28
+ @name = name
29
+ @email = email
30
+ @created_at = Time.now
31
+ @updated_at = Time.now
32
+ end
33
+ end
34
+
35
+ class UserResource
36
+ include Alba::Resource
37
+
38
+ attributes :id, :name
39
+
40
+ attribute :name_with_email do |resource|
41
+ "#{resource.name}: #{resource.email}"
42
+ end
43
+ end
44
+
45
+ class SerializerWithKey
46
+ include Alba::Serializer
47
+
48
+ set key: :user
49
+ end
50
+
51
+ user = User.new(1, 'Masafumi OKURA', 'masafumi@example.com')
52
+ UserResource.new(user).serialize
53
+ # => "{\"id\":1,\"name\":\"Masafumi OKURA\",\"name_with_email\":\"Masafumi OKURA: masafumi@example.com\"}"
30
54
  ```
31
55
 
32
56
  ## Development
@@ -1,16 +1,17 @@
1
1
  require 'alba/version'
2
+ require 'alba/resource'
2
3
  require 'json'
3
4
 
4
5
  # Core module
5
6
  module Alba
6
7
  class Error < StandardError; end
7
8
 
8
- def self.backend=(backend)
9
- @backend = backend&.to_sym
9
+ class << self
10
+ attr_reader :backend
10
11
  end
11
12
 
12
- def self.backend
13
- @backend
13
+ def self.backend=(backend)
14
+ @backend = backend&.to_sym
14
15
  end
15
16
 
16
17
  def self.serialize(object)
@@ -0,0 +1,19 @@
1
+ module Alba
2
+ # This class represents an attribute, which is serialized
3
+ # by either sending message or calling a Proc.
4
+ class Attribute
5
+ def initialize(name:, method:)
6
+ @name = name
7
+ @method = method
8
+ end
9
+
10
+ def serialize(target)
11
+ case @method
12
+ when Symbol, String
13
+ target.public_send(@method)
14
+ when Proc
15
+ @method.call(target)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,67 @@
1
+ require 'alba/serializer'
2
+ require 'alba/attribute'
3
+ require 'alba/serializers/default_serializer'
4
+
5
+ module Alba
6
+ # This module represents what should be serialized
7
+ module Resource
8
+ def self.included(base)
9
+ base.include InstanceMethods
10
+ base.extend ClassMethods
11
+ end
12
+
13
+ # Instance methods
14
+ module InstanceMethods
15
+ def initialize(resource)
16
+ @_resource = resource
17
+ @_attributes = self.class._attributes
18
+ @_serializer_class = self.class._serializer_class
19
+ end
20
+
21
+ def serialize(with: nil)
22
+ serializer_class = case with
23
+ when ->(obj) { obj.is_a?(Class) && obj.ancestors.include?(Alba::Serializer) }
24
+ with
25
+ when Symbol
26
+ const_get(with.to_s.capitalize)
27
+ when String
28
+ const_get(with)
29
+ when nil
30
+ @_serializer_class || Alba::Serializers::DefaultSerializer
31
+ end
32
+ # opts = serializer.opts
33
+ serialiable_hash = @_attributes.map do |name, attribute|
34
+ [name, attribute.serialize(@_resource)]
35
+ end.to_h
36
+ serializer_class.new(serialiable_hash).serialize
37
+ end
38
+ end
39
+
40
+ # Class methods
41
+ module ClassMethods
42
+ attr_accessor :_attributes, :_serializer_class
43
+
44
+ def inherited(subclass)
45
+ @_attributes = {} unless defined?(@_attributes)
46
+ @_serializer_class = nil unless defined?(@_serializer_class)
47
+ subclass._attributes = @_attributes
48
+ subclass._serializer_class = @_serializer_class
49
+ end
50
+
51
+ def attributes(*attrs)
52
+ @_attributes = {} unless defined? @_attributes
53
+ attrs.each { |attr_name| @_attributes[attr_name] = Attribute.new(name: attr_name, method: attr_name) }
54
+ end
55
+
56
+ def attribute(name, &block)
57
+ raise ArgumentError, 'No block given in attribute method' unless block
58
+
59
+ @_attributes[name] = Attribute.new(name: name, method: block)
60
+ end
61
+
62
+ def serializer(name)
63
+ @_serializer_class = name.ancestors.include?(Alba::Serializer) ? name : nil
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,45 @@
1
+ module Alba
2
+ # This module represents how a resource should be serialized.
3
+ #
4
+ module Serializer
5
+ def self.included(base)
6
+ base.include InstanceMethods
7
+ base.extend ClassMethods
8
+ end
9
+
10
+ # Instance methods
11
+ module InstanceMethods
12
+ def initialize(resource)
13
+ @_resource = resource
14
+ @_opts = self.class._opts || {}
15
+ key = @_opts[:key]
16
+ @_resource = {key.to_sym => @_resource} if key
17
+ end
18
+
19
+ def serialize
20
+ fallback = -> { @_resource.to_json }
21
+ case Alba.backend
22
+ when :oj
23
+ begin
24
+ require 'oj'
25
+ -> { Oj.dump(@_resource) }
26
+ rescue LoadError
27
+ fallback
28
+ end
29
+ else
30
+ fallback
31
+ end.call
32
+ end
33
+ end
34
+
35
+ # Class methods
36
+ module ClassMethods
37
+ attr_reader :_opts
38
+
39
+ def set(key: false)
40
+ @_opts ||= {}
41
+ @_opts[:key] = key
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,9 @@
1
+ module Alba
2
+ module Serializers
3
+ # DefaultSerializer class is used when a user doesn't specify serializer opt.
4
+ # It's basically an alias of Alba::Serializer, but since it's a module this class simply include it.
5
+ class DefaultSerializer
6
+ include Alba::Serializer
7
+ end
8
+ end
9
+ end
@@ -1,3 +1,3 @@
1
1
  module Alba
2
- VERSION = '0.0.1'.freeze
2
+ VERSION = '0.1.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alba
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - OKURA Masafumi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-01-21 00:00:00.000000000 Z
11
+ date: 2020-02-11 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Fast and flexible JSON serializer
14
14
  email:
@@ -30,6 +30,10 @@ files:
30
30
  - bin/console
31
31
  - bin/setup
32
32
  - lib/alba.rb
33
+ - lib/alba/attribute.rb
34
+ - lib/alba/resource.rb
35
+ - lib/alba/serializer.rb
36
+ - lib/alba/serializers/default_serializer.rb
33
37
  - lib/alba/version.rb
34
38
  homepage: https://github.com/okuramasafumi/alba
35
39
  licenses: