alba 0.1.0 → 0.2.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 62d87c709e80629fa4f9373e113a141da7489703d309fd1ed6b9b411e427a101
4
- data.tar.gz: 3aacb3b018632b50cd2c71052c783e6aae97d6d79c2d1f0bb107ba07cc0d5bbd
3
+ metadata.gz: 9dab0921e07fb607cfceb802a42fdb5f8cc20eb745522c46dc7b451b8a0cd14e
4
+ data.tar.gz: 6c6fcc0035ef543ee6d60bffa18ca83379d090e800950411d7316c21031784ad
5
5
  SHA512:
6
- metadata.gz: 3eb9360c0f0a608252d521b89911308b45584c4456040579d844cc7cf09fc839f12f8a908cd20c9f6fd421123f17ca6248948d80e7d36e82adb5a6a42e82b460
7
- data.tar.gz: d5ec4be5ede9d7cd359ed5f50af51d37c6926b99d5130f679655fec3949962c57d4c215dc212413e76f85ef20b74aa036e2b1955837ff113bcf41d3dc6f180bc
6
+ metadata.gz: c97545976f850ba0191dcabf7f34b8daeebf54d2b82c9a37305f569cc7cadaa1b9f0f92dc42f81193e9fd56eae2e862d650b023c4bcd105739c18c0baaf35e13
7
+ data.tar.gz: 7423763628b13e5643193347379eefbcf2cc2d78266cafd147d8c86d3f755feca93dd3f2c9bca92e8ec008b1ec7d00c9ed7bf1590a2f26e83c99fa529a987de1
@@ -10,6 +10,7 @@ AllCops:
10
10
  Exclude:
11
11
  - 'Rakefile'
12
12
  - 'alba.gemspec'
13
+ NewCops: enable
13
14
 
14
15
  Layout/SpaceInsideHashLiteralBraces:
15
16
  EnforcedStyle: no_space
@@ -17,5 +18,10 @@ Layout/SpaceInsideHashLiteralBraces:
17
18
  Metrics/MethodLength:
18
19
  Max: 20
19
20
 
21
+ Naming/PredicateName:
22
+ AllowedMethods:
23
+ - 'has_one'
24
+ - 'has_many'
25
+
20
26
  Style/FrozenStringLiteralComment:
21
27
  Enabled: false
data/Gemfile CHANGED
@@ -3,8 +3,9 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in alba.gemspec
4
4
  gemspec
5
5
 
6
+ gem 'coveralls', require: false
6
7
  gem 'minitest', '~> 5.0'
7
8
  gem 'rake', '~> 13.0'
8
9
  gem 'rubocop', '>= 0.79.0', require: false
9
- gem 'rubocop-performance', '~> 1.5.0', require: false
10
+ gem 'rubocop-performance', '~> 1.7.1', require: false
10
11
  gem 'rubocop-sensible', '~> 0.3.0', require: false
@@ -1,42 +1,67 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- alba (0.1.0)
4
+ alba (0.2.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- ast (2.4.0)
10
- jaro_winkler (1.5.4)
11
- minitest (5.14.0)
12
- parallel (1.19.1)
13
- parser (2.7.0.2)
14
- ast (~> 2.4.0)
9
+ ast (2.4.1)
10
+ coveralls (0.8.23)
11
+ json (>= 1.8, < 3)
12
+ simplecov (~> 0.16.1)
13
+ term-ansicolor (~> 1.3)
14
+ thor (>= 0.19.4, < 2.0)
15
+ tins (~> 1.6)
16
+ docile (1.3.2)
17
+ json (2.3.1)
18
+ minitest (5.14.1)
19
+ parallel (1.19.2)
20
+ parser (2.7.1.4)
21
+ ast (~> 2.4.1)
15
22
  rainbow (3.0.0)
16
23
  rake (13.0.1)
17
- rubocop (0.79.0)
18
- jaro_winkler (~> 1.5.1)
24
+ regexp_parser (1.7.1)
25
+ rexml (3.2.4)
26
+ rubocop (0.88.0)
19
27
  parallel (~> 1.10)
20
- parser (>= 2.7.0.1)
28
+ parser (>= 2.7.1.1)
21
29
  rainbow (>= 2.2.2, < 4.0)
30
+ regexp_parser (>= 1.7)
31
+ rexml
32
+ rubocop-ast (>= 0.1.0, < 1.0)
22
33
  ruby-progressbar (~> 1.7)
23
- unicode-display_width (>= 1.4.0, < 1.7)
24
- rubocop-performance (1.5.2)
25
- rubocop (>= 0.71.0)
34
+ unicode-display_width (>= 1.4.0, < 2.0)
35
+ rubocop-ast (0.2.0)
36
+ parser (>= 2.7.0.1)
37
+ rubocop-performance (1.7.1)
38
+ rubocop (>= 0.82.0)
26
39
  rubocop-sensible (0.3.0)
27
40
  rubocop (>= 0.60.0)
28
41
  ruby-progressbar (1.10.1)
29
- unicode-display_width (1.6.1)
42
+ simplecov (0.16.1)
43
+ docile (~> 1.1)
44
+ json (>= 1.8, < 3)
45
+ simplecov-html (~> 0.10.0)
46
+ simplecov-html (0.10.2)
47
+ sync (0.5.0)
48
+ term-ansicolor (1.7.1)
49
+ tins (~> 1.0)
50
+ thor (1.0.1)
51
+ tins (1.25.0)
52
+ sync
53
+ unicode-display_width (1.7.0)
30
54
 
31
55
  PLATFORMS
32
56
  ruby
33
57
 
34
58
  DEPENDENCIES
35
59
  alba!
60
+ coveralls
36
61
  minitest (~> 5.0)
37
62
  rake (~> 13.0)
38
63
  rubocop (>= 0.79.0)
39
- rubocop-performance (~> 1.5.0)
64
+ rubocop-performance (~> 1.7.1)
40
65
  rubocop-sensible (~> 0.3.0)
41
66
 
42
67
  BUNDLED WITH
data/README.md CHANGED
@@ -1,3 +1,7 @@
1
+ [![Build Status](https://travis-ci.com/okuramasafumi/alba.svg?branch=master)](https://travis-ci.com/okuramasafumi/alba)
2
+ [![Coverage Status](https://coveralls.io/repos/github/okuramasafumi/alba/badge.svg?branch=master)](https://coveralls.io/github/okuramasafumi/alba?branch=master)
3
+ [![Maintainability](https://api.codeclimate.com/v1/badges/fdab4cc0de0b9addcfe8/maintainability)](https://codeclimate.com/github/okuramasafumi/alba/maintainability)
4
+
1
5
  # Alba
2
6
 
3
7
  `Alba` is a fast and flexible JSON serializer.
@@ -7,12 +7,12 @@ module Alba
7
7
  @method = method
8
8
  end
9
9
 
10
- def serialize(target)
10
+ def to_hash(target)
11
11
  case @method
12
12
  when Symbol, String
13
13
  target.public_send(@method)
14
14
  when Proc
15
- @method.call(target)
15
+ @method.arity.zero? ? target.instance_exec(&@method) : @method.call(target)
16
16
  end
17
17
  end
18
18
  end
@@ -0,0 +1,26 @@
1
+ module Alba
2
+ # Representing many association
3
+ class Many
4
+ def initialize(name:, resource: nil, &block)
5
+ @name = name
6
+ @resource = resource
7
+ @block = block
8
+ raise ArgumentError, 'resource or block is required' if @resource.nil? && @block.nil?
9
+ end
10
+
11
+ def to_hash(target)
12
+ objects = target.__send__(@name)
13
+ @resource ||= resource_class
14
+ objects.map { |o| @resource.new(o).to_hash }
15
+ end
16
+
17
+ private
18
+
19
+ def resource_class
20
+ klass = Class.new
21
+ klass.include(::Alba::Resource)
22
+ klass.class_exec(&@block)
23
+ klass
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ module Alba
2
+ # Representing one association
3
+ class One
4
+ def initialize(name:, resource: nil, &block)
5
+ @name = name
6
+ @resource = resource
7
+ @block = block
8
+ raise ArgumentError, 'resource or block is required' if @resource.nil? && @block.nil?
9
+ end
10
+
11
+ def to_hash(target)
12
+ object = target.__send__(@name)
13
+ @resource ||= resource_class
14
+ @resource.new(object).to_hash
15
+ end
16
+
17
+ private
18
+
19
+ def resource_class
20
+ klass = Class.new
21
+ klass.include(::Alba::Resource)
22
+ klass.class_exec(&@block)
23
+ klass
24
+ end
25
+ end
26
+ end
@@ -1,11 +1,21 @@
1
1
  require 'alba/serializer'
2
2
  require 'alba/attribute'
3
+ require 'alba/one'
4
+ require 'alba/many'
3
5
  require 'alba/serializers/default_serializer'
4
6
 
5
7
  module Alba
6
8
  # This module represents what should be serialized
7
9
  module Resource
10
+ DSLS = [:_attributes, :_one, :_many, :_serializer].freeze
8
11
  def self.included(base)
12
+ base.class_eval do
13
+ # Initialize
14
+ DSLS.each do |name|
15
+ initial = name == :_serializer ? nil : {}
16
+ instance_variable_set("@#{name}", initial) unless instance_variable_defined?("@#{name}")
17
+ end
18
+ end
9
19
  base.include InstanceMethods
10
20
  base.extend ClassMethods
11
21
  end
@@ -14,42 +24,58 @@ module Alba
14
24
  module InstanceMethods
15
25
  def initialize(resource)
16
26
  @_resource = resource
17
- @_attributes = self.class._attributes
18
- @_serializer_class = self.class._serializer_class
27
+ DSLS.each { |name| instance_variable_set("@#{name}", self.class.public_send(name)) }
19
28
  end
20
29
 
21
30
  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
31
+ serializer = case with
32
+ when ->(obj) { obj.is_a?(Class) && obj <= Alba::Serializer }
33
+ with
34
+ when Symbol
35
+ const_get(with.to_s.capitalize)
36
+ when String
37
+ const_get(with)
38
+ when nil
39
+ @_serializer || Alba::Serializers::DefaultSerializer
40
+ end
41
+ serializer.new(serializable_hash).serialize
42
+ end
43
+
44
+ def serializable_hash
45
+ attrs.merge(ones).merge(manies)
46
+ end
47
+ alias to_hash serializable_hash
48
+
49
+ private
50
+
51
+ def attrs
52
+ @_attributes.transform_values do |attribute|
53
+ attribute.to_hash(@_resource)
54
+ end || {}
55
+ end
56
+
57
+ def ones
58
+ @_one.transform_values do |one|
59
+ one.to_hash(@_resource)
60
+ end || {}
61
+ end
62
+
63
+ def manies
64
+ @_many.transform_values do |many|
65
+ many.to_hash(@_resource)
66
+ end || {}
37
67
  end
38
68
  end
39
69
 
40
70
  # Class methods
41
71
  module ClassMethods
42
- attr_accessor :_attributes, :_serializer_class
72
+ attr_accessor(*DSLS)
43
73
 
44
74
  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
75
+ DSLS.each { |name| subclass.public_send("#{name}=", instance_variable_get("@#{name}")) }
49
76
  end
50
77
 
51
78
  def attributes(*attrs)
52
- @_attributes = {} unless defined? @_attributes
53
79
  attrs.each { |attr_name| @_attributes[attr_name] = Attribute.new(name: attr_name, method: attr_name) }
54
80
  end
55
81
 
@@ -59,8 +85,16 @@ module Alba
59
85
  @_attributes[name] = Attribute.new(name: name, method: block)
60
86
  end
61
87
 
88
+ def one(name, resource: nil, &block)
89
+ @_one[name.to_sym] = One.new(name: name, resource: resource, &block)
90
+ end
91
+
92
+ def many(name, resource: nil, &block)
93
+ @_many[name.to_sym] = Many.new(name: name, resource: resource, &block)
94
+ end
95
+
62
96
  def serializer(name)
63
- @_serializer_class = name.ancestors.include?(Alba::Serializer) ? name : nil
97
+ @_serializer = name <= Alba::Serializer ? name : nil
64
98
  end
65
99
  end
66
100
  end
@@ -1,3 +1,3 @@
1
1
  module Alba
2
- VERSION = '0.1.0'.freeze
2
+ VERSION = '0.2.0'.freeze
3
3
  end
@@ -0,0 +1,60 @@
1
+ linter:
2
+ # # https://help.sider.review/getting-started/custom-configuration
3
+
4
+ # # https://help.sider.review/tools/ruby/rubocop
5
+ rubocop:
6
+ gems:
7
+ - "rubocop-performance"
8
+ - "rubocop-sensible"
9
+ safe: false
10
+
11
+ # # https://help.sider.review/tools/ruby/reek
12
+ # reek:
13
+ # gems:
14
+ # - name: "reek"
15
+ # version: "5.2.0"
16
+ # target:
17
+ # - lib/
18
+ # - test/
19
+ # config: config/.reek.yml
20
+
21
+ # # https://help.sider.review/tools/ruby/querly
22
+ # querly:
23
+ # gems:
24
+ # - "slim"
25
+
26
+ # # https://help.sider.review/tools/others/misspell
27
+ # misspell:
28
+ # exclude:
29
+ # - vendor
30
+ # - "**/*.min.js"
31
+ # - exclude_file.rb
32
+ # targets:
33
+ # - target_directory
34
+ # - another_target_directory/foo.rb
35
+ # - bar.rb
36
+ # locale: UK
37
+ # ignore: center,behavior
38
+
39
+ # # https://help.sider.review/tools/shellscript/shellcheck
40
+ # shellcheck:
41
+ # target: "src/**/*.{sh,bash}"
42
+ # include: "SC2104,SC2105"
43
+ # exclude: "SC1000,SC1118"
44
+ # enable: "all"
45
+ # shell: "bash"
46
+ # severity: "error"
47
+ # norc: true
48
+
49
+ # # https://help.sider.review/getting-started/custom-configuration#ignore
50
+ # ignore:
51
+ # - "*.pdf"
52
+ # - "*.mp4"
53
+ # - "images/**"
54
+
55
+ # # https://help.sider.review/getting-started/custom-configuration#branchesexclude
56
+ # branches:
57
+ # exclude:
58
+ # - master
59
+ # - development
60
+ # - /^release-.*$/
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.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - OKURA Masafumi
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-02-11 00:00:00.000000000 Z
11
+ date: 2020-07-25 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Fast and flexible JSON serializer
14
14
  email:
@@ -31,10 +31,13 @@ files:
31
31
  - bin/setup
32
32
  - lib/alba.rb
33
33
  - lib/alba/attribute.rb
34
+ - lib/alba/many.rb
35
+ - lib/alba/one.rb
34
36
  - lib/alba/resource.rb
35
37
  - lib/alba/serializer.rb
36
38
  - lib/alba/serializers/default_serializer.rb
37
39
  - lib/alba/version.rb
40
+ - sider.yml
38
41
  homepage: https://github.com/okuramasafumi/alba
39
42
  licenses:
40
43
  - MIT
@@ -42,7 +45,7 @@ metadata:
42
45
  homepage_uri: https://github.com/okuramasafumi/alba
43
46
  source_code_uri: https://github.com/okuramasafumi/alba
44
47
  changelog_uri: https://github.com/okuramasafumi/alba/CHANGELOG.md
45
- post_install_message:
48
+ post_install_message:
46
49
  rdoc_options: []
47
50
  require_paths:
48
51
  - lib
@@ -57,8 +60,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
57
60
  - !ruby/object:Gem::Version
58
61
  version: '0'
59
62
  requirements: []
60
- rubygems_version: 3.1.2
61
- signing_key:
63
+ rubygems_version: 3.1.4
64
+ signing_key:
62
65
  specification_version: 4
63
66
  summary: Fast and flexible JSON serializer
64
67
  test_files: []