smart_types 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +15 -0
  5. data/.travis.yml +20 -0
  6. data/CHANGELOG.md +2 -0
  7. data/CODE_OF_CONDUCT.md +74 -0
  8. data/Gemfile +5 -0
  9. data/Gemfile.lock +77 -0
  10. data/LICENSE.txt +21 -0
  11. data/README.md +85 -0
  12. data/Rakefile +21 -0
  13. data/bin/console +8 -0
  14. data/bin/setup +8 -0
  15. data/lib/smart_core/types.rb +13 -0
  16. data/lib/smart_core/types/errors.rb +27 -0
  17. data/lib/smart_core/types/primitive.rb +76 -0
  18. data/lib/smart_core/types/primitive/caster.rb +31 -0
  19. data/lib/smart_core/types/primitive/checker.rb +31 -0
  20. data/lib/smart_core/types/primitive/factory.rb +96 -0
  21. data/lib/smart_core/types/primitive/factory/definition_context.rb +46 -0
  22. data/lib/smart_core/types/primitive/mult_checker.rb +31 -0
  23. data/lib/smart_core/types/primitive/mult_factory.rb +69 -0
  24. data/lib/smart_core/types/primitive/mult_factory/definition_context.rb +29 -0
  25. data/lib/smart_core/types/primitive/sum_checker.rb +31 -0
  26. data/lib/smart_core/types/primitive/sum_factory.rb +69 -0
  27. data/lib/smart_core/types/primitive/sum_factory/definition_context.rb +29 -0
  28. data/lib/smart_core/types/primitive/undefined_caster.rb +19 -0
  29. data/lib/smart_core/types/system.rb +7 -0
  30. data/lib/smart_core/types/system/producer_dsl.rb +30 -0
  31. data/lib/smart_core/types/value.rb +19 -0
  32. data/lib/smart_core/types/value/any.rb +14 -0
  33. data/lib/smart_core/types/value/array.rb +17 -0
  34. data/lib/smart_core/types/value/boolean.rb +9 -0
  35. data/lib/smart_core/types/value/class.rb +9 -0
  36. data/lib/smart_core/types/value/float.rb +17 -0
  37. data/lib/smart_core/types/value/hash.rb +17 -0
  38. data/lib/smart_core/types/value/integer.rb +17 -0
  39. data/lib/smart_core/types/value/module.rb +9 -0
  40. data/lib/smart_core/types/value/numeric.rb +17 -0
  41. data/lib/smart_core/types/value/proc.rb +11 -0
  42. data/lib/smart_core/types/value/string.rb +11 -0
  43. data/lib/smart_core/types/value/symbol.rb +11 -0
  44. data/lib/smart_core/types/value/text.rb +11 -0
  45. data/lib/smart_core/types/version.rb +11 -0
  46. data/smart_types.gemspec +42 -0
  47. metadata +178 -0
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ # @since 0.1.0
5
+ class SmartCore::Types::Primitive::UndefinedCaster
6
+ # @param value [Any]
7
+ # @return [void]
8
+ #
9
+ # @raise [SmartCore::Types::TypeCastingError]
10
+ #
11
+ # @pai private
12
+ # @since 0.1.0
13
+ def call(value)
14
+ raise(
15
+ SmartCore::Types::TypeCastingError,
16
+ 'This type has no support for type casting'
17
+ )
18
+ end
19
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ # @since 0.1.0
5
+ module SmartCore::Types::System
6
+ require_relative 'system/producer_dsl'
7
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ # @since 0.1.0
5
+ module SmartCore::Types::System::ProducerDSL
6
+ class << self
7
+ # @param base_klass [Class<SmartCore::Types::Primitive>]
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 type_name [String, Symbol]
21
+ # @param type_definition [Block]
22
+ # @return [SmartCore::Types::Primitive]
23
+ #
24
+ # @api public
25
+ # @since 0.1.0
26
+ def define_type(type_name, &type_definition)
27
+ self::Factory.create_type(self, type_name, type_definition)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api public
4
+ # @since 0.1.0
5
+ class SmartCore::Types::Value < SmartCore::Types::Primitive
6
+ require_relative 'value/string'
7
+ require_relative 'value/symbol'
8
+ require_relative 'value/text'
9
+ require_relative 'value/integer'
10
+ require_relative 'value/float'
11
+ require_relative 'value/numeric'
12
+ require_relative 'value/boolean'
13
+ require_relative 'value/array'
14
+ require_relative 'value/hash'
15
+ require_relative 'value/proc'
16
+ require_relative 'value/class'
17
+ require_relative 'value/module'
18
+ require_relative 'value/any'
19
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api public
4
+ # @since 0.1.0
5
+
6
+ SmartCore::Types::Value.define_type(:Any) do |type|
7
+ type.define_checker do |value|
8
+ true
9
+ end
10
+
11
+ type.define_caster do |value|
12
+ value
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api public
4
+ # @since 0.1.0
5
+ SmartCore::Types::Value.define_type(:Array) do |type|
6
+ type.define_checker do |value|
7
+ value.is_a?(::Array)
8
+ end
9
+
10
+ type.define_caster do |value|
11
+ begin
12
+ ::Kernel.Array(value)
13
+ rescue ::TypeError
14
+ [value]
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api public
4
+ # @since 0.1.0
5
+ SmartCore::Types::Value.define_type(:Boolean) do |type|
6
+ type.define_checker do |value|
7
+ value.is_a?(::TrueClass) || value.is_a?(::FalseClass)
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api public
4
+ # @since 0.1.0
5
+ SmartCore::Types::Value.define_type(:Class) do |type|
6
+ type.define_checker do |value|
7
+ value.is_a?(::Class)
8
+ end
9
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api public
4
+ # @since 0.1.0
5
+ SmartCore::Types::Value.define_type(:Float) do |type|
6
+ type.define_checker do |value|
7
+ value.is_a?(::Float)
8
+ end
9
+
10
+ type.define_caster do |value|
11
+ begin
12
+ Float(value)
13
+ rescue ::TypeError, ::ArgumentError
14
+ value.to_f
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api public
4
+ # @since 0.1.0
5
+ SmartCore::Types::Value.define_type(:Hash) do |type|
6
+ type.define_checker do |value|
7
+ value.is_a?(::Hash)
8
+ end
9
+
10
+ type.define_caster do |value|
11
+ begin
12
+ ::Kernel.Hash(value)
13
+ rescue ::TypeError
14
+ {}
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api public
4
+ # @since 0.1.0
5
+ SmartCore::Types::Value.define_type(:Integer) do |type|
6
+ type.define_checker do |value|
7
+ value.is_a?(::Integer)
8
+ end
9
+
10
+ type.define_caster do |value|
11
+ begin
12
+ Integer(value)
13
+ rescue ::TypeError, ::ArgumentError
14
+ value.to_i
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api public
4
+ # @since 0.1.0
5
+ SmartCore::Types::Value.define_type(:Module) do |type|
6
+ type.define_checker do |value|
7
+ value.is_a?(::Module)
8
+ end
9
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api public
4
+ # @since 0.1.0
5
+ SmartCore::Types::Value.define_type(:Numeric) do |type|
6
+ type.define_checker do |value|
7
+ value.is_a?(::Numeric)
8
+ end
9
+
10
+ type.define_caster do |value|
11
+ begin
12
+ Float(value)
13
+ rescue ::TypeError, ::ArgumentError
14
+ value.to_f
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api public
4
+ # @since 0.1.0
5
+ SmartCore::Types::Value.define_type(:Proc) do |type|
6
+ type.define_checker do |value|
7
+ value.is_a?(::Proc)
8
+ end
9
+
10
+ type.define_caster(&:to_proc)
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api public
4
+ # @since 0.1.0
5
+ SmartCore::Types::Value.define_type(:String) do |type|
6
+ type.define_checker do |value|
7
+ value.is_a?(::String)
8
+ end
9
+
10
+ type.define_caster(&:to_s)
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api public
4
+ # @since 0.1.0
5
+ SmartCore::Types::Value.define_type(:Symbol) do |type|
6
+ type.define_checker do |value|
7
+ value.is_a?(::Symbol)
8
+ end
9
+
10
+ type.define_caster(&:to_sym)
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api public
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
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SmartCore
4
+ module Types
5
+ # @return [String]
6
+ #
7
+ # @api public
8
+ # @since 0.1.0
9
+ VERSION = '0.0.0'
10
+ end
11
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/smart_core/types/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.4.9')
7
+
8
+ spec.name = 'smart_types'
9
+ spec.version = SmartCore::Types::VERSION
10
+ spec.authors = ['Rustam Ibragimov']
11
+ spec.email = ['iamdaiver@gmail.com']
12
+
13
+ spec.summary = 'Full-featured type system for any ruby project.'
14
+ spec.description = <<~DESCRIPTION
15
+ Full-featured type system for any ruby project. Support for custom type definitioning,
16
+ type validation, type casting and type categorizing. Provides a set of commonly used type
17
+ categories and general purpose types. Has a flexible and simplest type definition toolchain.
18
+ DESCRIPTION
19
+
20
+ spec.homepage = 'https://github.com/smart-rb/smart_types'
21
+ spec.license = 'MIT'
22
+
23
+ spec.metadata['homepage_uri'] = spec.homepage
24
+ spec.metadata['source_code_uri'] = 'https://github.com/smart-rb/smart_types'
25
+ spec.metadata['changelog_uri'] = 'https://github.com/smart-rb/smart_types/blob/master/CHANGELOG.md'
26
+
27
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
28
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
29
+ end
30
+
31
+ spec.bindir = 'exe'
32
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
33
+ spec.require_paths = ['lib']
34
+
35
+ spec.add_dependency 'smart_engine', '~> 0.3'
36
+
37
+ spec.add_development_dependency 'bundler', '~> 2.1'
38
+ spec.add_development_dependency 'rake', '~> 13.0'
39
+ spec.add_development_dependency 'rspec', '~> 3.9'
40
+ spec.add_development_dependency 'armitage-rubocop', '~> 0.78'
41
+ spec.add_development_dependency 'simplecov', '~> 0.17'
42
+ end
metadata ADDED
@@ -0,0 +1,178 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: smart_types
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Rustam Ibragimov
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-01-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: smart_engine
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.3'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.1'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '13.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '13.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.9'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.9'
69
+ - !ruby/object:Gem::Dependency
70
+ name: armitage-rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.78'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.78'
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.17'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.17'
97
+ description: |
98
+ Full-featured type system for any ruby project. Support for custom type definitioning,
99
+ type validation, type casting and type categorizing. Provides a set of commonly used type
100
+ categories and general purpose types. Has a flexible and simplest type definition toolchain.
101
+ email:
102
+ - iamdaiver@gmail.com
103
+ executables: []
104
+ extensions: []
105
+ extra_rdoc_files: []
106
+ files:
107
+ - ".gitignore"
108
+ - ".rspec"
109
+ - ".rubocop.yml"
110
+ - ".travis.yml"
111
+ - CHANGELOG.md
112
+ - CODE_OF_CONDUCT.md
113
+ - Gemfile
114
+ - Gemfile.lock
115
+ - LICENSE.txt
116
+ - README.md
117
+ - Rakefile
118
+ - bin/console
119
+ - bin/setup
120
+ - lib/smart_core/types.rb
121
+ - lib/smart_core/types/errors.rb
122
+ - lib/smart_core/types/primitive.rb
123
+ - lib/smart_core/types/primitive/caster.rb
124
+ - lib/smart_core/types/primitive/checker.rb
125
+ - lib/smart_core/types/primitive/factory.rb
126
+ - lib/smart_core/types/primitive/factory/definition_context.rb
127
+ - lib/smart_core/types/primitive/mult_checker.rb
128
+ - lib/smart_core/types/primitive/mult_factory.rb
129
+ - lib/smart_core/types/primitive/mult_factory/definition_context.rb
130
+ - lib/smart_core/types/primitive/sum_checker.rb
131
+ - lib/smart_core/types/primitive/sum_factory.rb
132
+ - lib/smart_core/types/primitive/sum_factory/definition_context.rb
133
+ - lib/smart_core/types/primitive/undefined_caster.rb
134
+ - lib/smart_core/types/system.rb
135
+ - lib/smart_core/types/system/producer_dsl.rb
136
+ - lib/smart_core/types/value.rb
137
+ - lib/smart_core/types/value/any.rb
138
+ - lib/smart_core/types/value/array.rb
139
+ - lib/smart_core/types/value/boolean.rb
140
+ - lib/smart_core/types/value/class.rb
141
+ - lib/smart_core/types/value/float.rb
142
+ - lib/smart_core/types/value/hash.rb
143
+ - lib/smart_core/types/value/integer.rb
144
+ - lib/smart_core/types/value/module.rb
145
+ - lib/smart_core/types/value/numeric.rb
146
+ - lib/smart_core/types/value/proc.rb
147
+ - lib/smart_core/types/value/string.rb
148
+ - lib/smart_core/types/value/symbol.rb
149
+ - lib/smart_core/types/value/text.rb
150
+ - lib/smart_core/types/version.rb
151
+ - smart_types.gemspec
152
+ homepage: https://github.com/smart-rb/smart_types
153
+ licenses:
154
+ - MIT
155
+ metadata:
156
+ homepage_uri: https://github.com/smart-rb/smart_types
157
+ source_code_uri: https://github.com/smart-rb/smart_types
158
+ changelog_uri: https://github.com/smart-rb/smart_types/blob/master/CHANGELOG.md
159
+ post_install_message:
160
+ rdoc_options: []
161
+ require_paths:
162
+ - lib
163
+ required_ruby_version: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: 2.4.9
168
+ required_rubygems_version: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ requirements: []
174
+ rubygems_version: 3.1.2
175
+ signing_key:
176
+ specification_version: 4
177
+ summary: Full-featured type system for any ruby project.
178
+ test_files: []