smart_types 0.0.0 → 0.1.0.alpha

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: '0947505b9b53b32bdbe16484fd2f3649164ea15afbc563a66f9b4b057b4101a3'
4
- data.tar.gz: 33808e34bdf040f9ff38d9a14c904981500beee5520e3bfc54f398a2b94adf65
3
+ metadata.gz: 984ff8c37feb29e6b3141b845c0f9f4266bdafc0c22fdf195ed9c4ab2036d7a9
4
+ data.tar.gz: 689d1cc015483cea2ca32cbd3c2e93c0e5cf486c31dc016f37d267171ec6f23a
5
5
  SHA512:
6
- metadata.gz: 62ae3a3710966f62d31998a39272029189a13ec3b0cafb64409a8a79c6ab314d70c1efaab14fc0de7f6dc60abdc82e12a5abfd3c6a82eb05949e06bf0289b825
7
- data.tar.gz: '08234057dcb0626c8eee23395bb6eb3aa68b7186928faf397410f2fa48a39944b1671846bd09ae6a2038834f3d14b1f966d7089554ce03af458079d1c4d2b1a3'
6
+ metadata.gz: dc955ee3f9f07f82be3a0144d382f949cdfce0b2c274e4ca3f229d1d4ca935eaea44ffe54d0d60a461cce43ab27a9a0bc357bd2e5ebf4d637b9450aca1b78e19
7
+ data.tar.gz: c0451f6106a9e7d59f10c187edcd9b9cc6a9bc8992df0b44fa3354d0456091cf479135e2ae7565f96922f0ddcef87b243c04b06ebefa35636a508c0a405fa659
data/Gemfile.lock CHANGED
@@ -2,7 +2,7 @@ PATH
2
2
  remote: .
3
3
  specs:
4
4
  smart_types (0.1.0)
5
- smart_engine (~> 0.3)
5
+ smart_engine (~> 0.4)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
@@ -59,7 +59,7 @@ GEM
59
59
  json (>= 1.8, < 3)
60
60
  simplecov-html (~> 0.10.0)
61
61
  simplecov-html (0.10.2)
62
- smart_engine (0.3.0)
62
+ smart_engine (0.4.0)
63
63
  unicode-display_width (1.6.0)
64
64
 
65
65
  PLATFORMS
data/README.md CHANGED
@@ -1,9 +1,13 @@
1
1
  # SmartCore::Types &middot; [![Gem Version](https://badge.fury.io/rb/smart_types.svg)](https://badge.fury.io/rb/smart_types) [![Build Status](https://travis-ci.org/smart-rb/smart_types.svg?branch=master)](https://travis-ci.org/smart-rb/smart_types)
2
2
 
3
- Full-featured type system for any ruby project. Support for custom type definitioning,
3
+ > A set of objects that acts like types (type checking and type casting) with a support for basic type algebra.
4
+
5
+ Full-featured type system for any ruby project. Supports custom type definitioning,
4
6
  type validation, type casting and type categorizing. Provides a set of commonly used type
5
7
  categories and general purpose types. Has a flexible and simplest type definition toolchain.
6
8
 
9
+ Just add and use :) Enjoy! :)
10
+
7
11
  ## Installation
8
12
 
9
13
  ```ruby
@@ -22,6 +26,18 @@ require 'smart_core/types'
22
26
 
23
27
  ---
24
28
 
29
+ ## Type Interface
30
+
31
+ ```ruby
32
+ # documentation is coming
33
+
34
+ type.valid?(value)
35
+ type.cast(value)
36
+ type.nilable
37
+ type3 = type1 | type2
38
+ type4 = type1 & type2
39
+ ```
40
+
25
41
  ## Supported types
26
42
 
27
43
  - Primitive Value Types:
@@ -44,6 +60,26 @@ SmartCore::Types::Value::Module
44
60
 
45
61
  ---
46
62
 
63
+ ## Nilable types
64
+
65
+ ```ruby
66
+ SmartCore::Types::Value::Any.nilable
67
+ SmartCore::Types::Value::String.nilable
68
+ SmartCore::Types::Value::Symbol.nilable
69
+ SmartCore::Types::Value::Text.nilable
70
+ SmartCore::Types::Value::Integer.nilable
71
+ SmartCore::Types::Value::Float.nilable
72
+ SmartCore::Types::Value::Numeric.nilable
73
+ SmartCore::Types::Value::Boolean.nilable
74
+ SmartCore::Types::Value::Array.nilable
75
+ SmartCore::Types::Value::Hash.nilable
76
+ SmartCore::Types::Value::Proc.nilable
77
+ SmartCore::Types::Value::Class.nilable
78
+ SmartCore::Types::Value::Module.nilable
79
+ ```
80
+
81
+ ---
82
+
47
83
  ## Type validation and type casting
48
84
 
49
85
  ```ruby
@@ -60,6 +96,14 @@ SmartCore::Types::Value::Module
60
96
 
61
97
  ---
62
98
 
99
+ ## Basic type algebra
100
+
101
+ ```ruby
102
+ # documentation is coming
103
+ ```
104
+
105
+ ---
106
+
63
107
  ## Type system integration
64
108
 
65
109
  ```ruby
@@ -27,7 +27,7 @@ module SmartCore::Types::Primitive::MultFactory
27
27
  # @pai private
28
28
  # @since 0.1.0
29
29
  def build_type_definitions(type_definition)
30
- SmatCore::Types::Primitive::MultFactory::DefinitionContext.new.tap do |context|
30
+ SmartCore::Types::Primitive::MultFactory::DefinitionContext.new.tap do |context|
31
31
  context.instance_eval(&type_definition) if type_definition
32
32
  end
33
33
  end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ # @since 0.1.0
5
+ class SmartCore::Types::Primitive::NilableChecker
6
+ # @param checker [Checker, SumChecker, MultChecker, NilableChecker]
7
+ # @return [void]
8
+ #
9
+ # @api private
10
+ # @since 0.1.0
11
+ def initialize(checker)
12
+ @checker = checker
13
+ end
14
+
15
+ # @param value [Any]
16
+ # @return [Boolean]
17
+ #
18
+ # @api private
19
+ # @since 0.1.0
20
+ def call(value)
21
+ # rubocop:disable Style/NilComparison
22
+ # NOTE: #nil? is not used cuz BasicObject has no #nil? method
23
+ (value == nil) ? true : checker.call(value)
24
+ # rubocop:enable Style/NilComparison
25
+ end
26
+
27
+ private
28
+
29
+ # @return [SmartCore::Types::Primitive::Checker]
30
+ # @return [SmartCore::Types::Primitive::MultChecker]
31
+ # @return [SmartCore::Types::Primitive::SumChecker]
32
+ # @return [SmartCore::Types::Primitive::NilableChecker]
33
+ #
34
+ # @api private
35
+ # @since 0.1.0
36
+ attr_reader :checker
37
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ # @since 0.1.0
5
+ module SmartCore::Types::Primitive::NilableFactory
6
+ class << self
7
+ # @param type [SmartCore::Types::Primitive]
8
+ # @return [SmartCore::Type::Primitive]
9
+ #
10
+ # @api private
11
+ # @since 0.1.0
12
+ def create_type(type)
13
+ type_checker = build_type_checker(type)
14
+ type_caster = build_type_caster(type)
15
+ build_type(type, type_checker, type_caster)
16
+ end
17
+
18
+ private
19
+
20
+ # @param type [SmartCore::Types::Primitive]
21
+ # @return [SmartCore::Types::Primitive::NilableChecker]
22
+ #
23
+ # @api private
24
+ # @since 0.1.0
25
+ def build_type_checker(type)
26
+ SmartCore::Types::Primitive::NilableChecker.new(type.checker)
27
+ end
28
+
29
+ # @param type [SmartCore::Types::Primitive]
30
+ # @return [SmartCore::Types::Primitive::Caster]
31
+ #
32
+ # @api private
33
+ # @since 0.1.0
34
+ def build_type_caster(type)
35
+ type.caster
36
+ end
37
+
38
+ # @param type [SmartCore::Types::Primitive]
39
+ # @param type_checler [SmartCore::Types::Primitive::NilableChecker]
40
+ # @param type_caster [SmartCore::Types::Caster]
41
+ # @return [SmartCore::Type::Primitive]
42
+ #
43
+ # @api private
44
+ # @since 0.1.0
45
+ def build_type(type, type_checker, type_caster)
46
+ Class.new(type.class).new(type_checker, type_caster)
47
+ end
48
+ end
49
+ end
@@ -27,7 +27,7 @@ module SmartCore::Types::Primitive::SumFactory
27
27
  # @pai private
28
28
  # @since 0.1.0
29
29
  def build_type_definitions(type_definition)
30
- SmatCore::Types::Primitive::SumFactory::DefinitionContext.new.tap do |context|
30
+ SmartCore::Types::Primitive::SumFactory::DefinitionContext.new.tap do |context|
31
31
  context.instance_eval(&type_definition) if type_definition
32
32
  end
33
33
  end
@@ -2,7 +2,16 @@
2
2
 
3
3
  # @api private
4
4
  # @since 0.1.0
5
- class SmartCore::Types::Primitive::UndefinedCaster
5
+ class SmartCore::Types::Primitive::UndefinedCaster < SmartCore::Types::Primitive::Caster
6
+ # @param expression [NilClass, Any]
7
+ # @return [void]
8
+ #
9
+ # @api private
10
+ # @since 0.1.0
11
+ def initialize(expression = nil)
12
+ super
13
+ end
14
+
6
15
  # @param value [Any]
7
16
  # @return [void]
8
17
  #
@@ -6,11 +6,13 @@ class SmartCore::Types::Primitive
6
6
  require_relative 'primitive/caster'
7
7
  require_relative 'primitive/undefined_caster'
8
8
  require_relative 'primitive/checker'
9
+ require_relative 'primitive/nilable_checker'
9
10
  require_relative 'primitive/sum_checker'
10
11
  require_relative 'primitive/mult_checker'
11
12
  require_relative 'primitive/factory'
12
13
  require_relative 'primitive/sum_factory'
13
14
  require_relative 'primitive/mult_factory'
15
+ require_relative 'primitive/nilable_factory'
14
16
 
15
17
  # @since 0.1.0
16
18
  include SmartCore::Types::System::ProducerDSL
@@ -29,13 +31,16 @@ class SmartCore::Types::Primitive
29
31
 
30
32
  # @param checker [SmartCore::Types::Primitive::Checker]
31
33
  # @param caster [SmartCore::Types::Primitive::Caster]
34
+ # @param nilable [SmartCore::Types::Primitive]
32
35
  # @return [void]
33
36
  #
34
37
  # @api private
35
38
  # @since 0.1.0
36
39
  def initialize(checker, caster)
40
+ @lock = SmartCore::Engine::Lock.new
37
41
  @checker = checker
38
42
  @caster = caster
43
+ @nilable = nil
39
44
  end
40
45
 
41
46
  # @param value [Any]
@@ -56,13 +61,21 @@ class SmartCore::Types::Primitive
56
61
  caster.call(value)
57
62
  end
58
63
 
64
+ # @return [SmartCore::Types::Primitive]
65
+ #
66
+ # @api public
67
+ # @since 0.1.0
68
+ def nilable
69
+ lock.synchronize { @nilable ||= self.class::NilableFactory.create_type(self) }
70
+ end
71
+
59
72
  # @param another_primitive [SmartCore::Types::Primitive]
60
73
  # @return [SmartCore::Types::Primitive]
61
74
  #
62
75
  # @api public
63
76
  # @since 0.1.0
64
77
  def |(another_primitive)
65
- self.class::SumFactory.create_type(self, another_primitive)
78
+ self.class::SumFactory.create_type([self, another_primitive])
66
79
  end
67
80
 
68
81
  # @param another_primitive [SmartCore::Types::Primitive]
@@ -71,6 +84,14 @@ class SmartCore::Types::Primitive
71
84
  # @api public
72
85
  # @since 0.1.0
73
86
  def &(another_primitive)
74
- self.class::MultFactory.create_type(self, another_primitive)
87
+ self.class::MultFactory.create_type([self, another_primitive])
75
88
  end
89
+
90
+ private
91
+
92
+ # @return [SmartCore::Engine::Lock]
93
+ #
94
+ # @api private
95
+ # @since 0.1.0
96
+ attr_reader :lock
76
97
  end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api public
4
+ # @since 0.1.0
5
+ class SmartCore::Types::Struct < SmartCore::Types::Primitive
6
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ # @since 0.1.0
5
+ module SmartCore::Types::System::DefinitionDSL
6
+ class << self
7
+ # @param base_klass [Class]
8
+ # @return [void]
9
+ #
10
+ # @api private
11
+ # @since 0.1.0
12
+ def included(base_klass)
13
+ base_klass.extend(ClassMethods)
14
+ end
15
+ end
16
+
17
+ # @api private
18
+ # @since 0.1.0
19
+ module ClassMethods
20
+ # @param types [Array<SmartCore::Types::Pirmitive>]
21
+ # @param type_definition [Block]
22
+ # @return [SmartCore::Types::Primitive]
23
+ #
24
+ # @api public
25
+ # @since 0.1.0
26
+ def type_sum(*types, &type_definition)
27
+ SmartCore::Types::Primitive::SumFactory.create_type(types, type_definition)
28
+ end
29
+
30
+ # @param types [Array<SmartCore::Types::Pirmitive>]
31
+ # @param type_definition [Block]
32
+ # @return [SmartCore::Types::Primitive]
33
+ #
34
+ # @api public
35
+ # @since 0.1.0
36
+ def type_mult(*types, &type_definition)
37
+ SmartCore::Types::Primitive::MultFactory.create_type(types, type_definition)
38
+ end
39
+ end
40
+ end
@@ -4,4 +4,8 @@
4
4
  # @since 0.1.0
5
5
  module SmartCore::Types::System
6
6
  require_relative 'system/producer_dsl'
7
+ require_relative 'system/definition_dsl'
8
+
9
+ # @since 0.1.0
10
+ include SmartCore::Types::System::DefinitionDSL
7
11
  end
@@ -2,7 +2,6 @@
2
2
 
3
3
  # @api public
4
4
  # @since 0.1.0
5
-
6
5
  SmartCore::Types::Value.define_type(:Any) do |type|
7
6
  type.define_checker do |value|
8
7
  true
@@ -2,10 +2,7 @@
2
2
 
3
3
  # @api public
4
4
  # @since 0.1.0
5
- SmartCore::Types::Value.define_type(:Text) do |type|
6
- type.define_checker do |value|
7
- value.is_a?(::String) || value.is_a?(::Symbol)
8
- end
9
-
10
- type.define_caster(&:to_s)
11
- end
5
+ SmartCore::Types::Value::Text = SmartCore::Types::System.type_sum(
6
+ SmartCore::Types::Value::String,
7
+ SmartCore::Types::Value::Symbol
8
+ ) { |type| type.define_caster(&:to_s) }
@@ -6,6 +6,7 @@ module SmartCore
6
6
  #
7
7
  # @api public
8
8
  # @since 0.1.0
9
- VERSION = '0.0.0'
9
+ # @version 0.1.0
10
+ VERSION = '0.1.0.alpha'
10
11
  end
11
12
  end
data/smart_types.gemspec CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
12
12
 
13
13
  spec.summary = 'Full-featured type system for any ruby project.'
14
14
  spec.description = <<~DESCRIPTION
15
- Full-featured type system for any ruby project. Support for custom type definitioning,
15
+ Full-featured type system for any ruby project. Supports custom type definitioning,
16
16
  type validation, type casting and type categorizing. Provides a set of commonly used type
17
17
  categories and general purpose types. Has a flexible and simplest type definition toolchain.
18
18
  DESCRIPTION
@@ -32,7 +32,7 @@ Gem::Specification.new do |spec|
32
32
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
33
33
  spec.require_paths = ['lib']
34
34
 
35
- spec.add_dependency 'smart_engine', '~> 0.3'
35
+ spec.add_dependency 'smart_engine', '~> 0.4'
36
36
 
37
37
  spec.add_development_dependency 'bundler', '~> 2.1'
38
38
  spec.add_development_dependency 'rake', '~> 13.0'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smart_types
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.1.0.alpha
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rustam Ibragimov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-01-16 00:00:00.000000000 Z
11
+ date: 2020-01-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: smart_engine
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.3'
19
+ version: '0.4'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.3'
26
+ version: '0.4'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -95,7 +95,7 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0.17'
97
97
  description: |
98
- Full-featured type system for any ruby project. Support for custom type definitioning,
98
+ Full-featured type system for any ruby project. Supports custom type definitioning,
99
99
  type validation, type casting and type categorizing. Provides a set of commonly used type
100
100
  categories and general purpose types. Has a flexible and simplest type definition toolchain.
101
101
  email:
@@ -127,11 +127,15 @@ files:
127
127
  - lib/smart_core/types/primitive/mult_checker.rb
128
128
  - lib/smart_core/types/primitive/mult_factory.rb
129
129
  - lib/smart_core/types/primitive/mult_factory/definition_context.rb
130
+ - lib/smart_core/types/primitive/nilable_checker.rb
131
+ - lib/smart_core/types/primitive/nilable_factory.rb
130
132
  - lib/smart_core/types/primitive/sum_checker.rb
131
133
  - lib/smart_core/types/primitive/sum_factory.rb
132
134
  - lib/smart_core/types/primitive/sum_factory/definition_context.rb
133
135
  - lib/smart_core/types/primitive/undefined_caster.rb
136
+ - lib/smart_core/types/struct.rb
134
137
  - lib/smart_core/types/system.rb
138
+ - lib/smart_core/types/system/definition_dsl.rb
135
139
  - lib/smart_core/types/system/producer_dsl.rb
136
140
  - lib/smart_core/types/value.rb
137
141
  - lib/smart_core/types/value/any.rb
@@ -167,9 +171,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
167
171
  version: 2.4.9
168
172
  required_rubygems_version: !ruby/object:Gem::Requirement
169
173
  requirements:
170
- - - ">="
174
+ - - ">"
171
175
  - !ruby/object:Gem::Version
172
- version: '0'
176
+ version: 1.3.1
173
177
  requirements: []
174
178
  rubygems_version: 3.1.2
175
179
  signing_key: