modeling 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 984bdb92ad9c4e829cf239f3df9eb1479e41c37d5659944933edb8d69282020f
4
+ data.tar.gz: b47547c32079a0d5680d99dd7cca3f8fa5736a2eb56bd9a5bfcab9547aa14687
5
+ SHA512:
6
+ metadata.gz: b3d8cd4181cf41ea9007cfaf8aa5e4eaa80c2bd68ff65e42a00fd4902590dca277226a18f011f8cb854d2f18791b910042e2b4c2e16e0410c0536253c785fd29
7
+ data.tar.gz: e66cc1a8d2c45d361508ea206dcbfb94ed54875d05966b603447d6fe77d122f37d013068e70223de41bb2c777fc7df43a4439f265eb364a904ea648f084d1b54
@@ -0,0 +1,78 @@
1
+ module Modeling
2
+ class ModelArgument
3
+ def initialize name, attribute, setter, getter, keyword, tester
4
+ @name = name
5
+ @attribute = attribute
6
+ @setter = setter
7
+ @getter = getter
8
+ @keyword = keyword
9
+ @tester = tester
10
+ end
11
+
12
+ attr :name
13
+
14
+ def attribute_name
15
+ "@#{name}"
16
+ end
17
+
18
+ def attribute?
19
+ @attribute
20
+ end
21
+
22
+ def setter?
23
+ @setter
24
+ end
25
+
26
+ def getter?
27
+ @getter
28
+ end
29
+
30
+ def keyword?
31
+ @keyword
32
+ end
33
+
34
+ def tester?
35
+ @tester
36
+ end
37
+
38
+ class << self
39
+ def parse argument
40
+ case argument
41
+ when ModelArgument
42
+ argument
43
+ when String
44
+ from_string argument
45
+ when Symbol
46
+ from_symbol argument
47
+ when Array
48
+ from_array argument
49
+ else
50
+ raise "Unsupported argument #{argument}"
51
+ end
52
+ end
53
+
54
+ def from_symbol argument
55
+ name = argument.to_s.delete_prefix("@").to_sym
56
+ attribute = argument.start_with?("@")
57
+ ModelArgument.new name, attribute, attribute, attribute, false, false
58
+ end
59
+
60
+ def from_string argument
61
+ if argument =~ /(\W*)(\w+)(\W*)/
62
+ modifiers = $1 + $3
63
+ ModelArgument.new $2.to_sym, modifiers.include?("@"), modifiers.include?("="),
64
+ modifiers.include?("+"), modifiers.include?(":"), modifiers.include?("?")
65
+ else
66
+ raise "Invalid argument string format '#{argument}'"
67
+ end
68
+ end
69
+
70
+ def from_array argument
71
+ name = argument.shift
72
+ ModelArgument.new name, argument.include?(:attribute), argument.include?(:setter), argument.include?(:getter),
73
+ argument.include?(:keyword), argument.include?(:tester)
74
+ end
75
+
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,27 @@
1
+ require_relative 'model_argument'
2
+
3
+ module Modeling
4
+
5
+ def model *fields, &initialize
6
+ fields.map!{ ModelArgument.parse _1 }
7
+ initialize_context = Struct.new(nil, *fields.map(&:name))
8
+ define_method :initialize do |*a, **na|
9
+ arguments = fields.zip(a).map do |f, arg|
10
+ value = (f.keyword? ? na[f.name] : nil) || arg
11
+ instance_variable_set f.attribute_name, value if f.attribute?
12
+ value
13
+ end
14
+ initialize_context.new(*arguments).instance_exec &initialize if initialize
15
+ end
16
+ fields.each do |f|
17
+ attr_writer f.name if f.setter?
18
+ attr_reader f.name if f.getter?
19
+ if f.tester?
20
+ define_method "#{f.name}?" do
21
+ !!instance_variable_get(f.attribute_name)
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,3 @@
1
+ module Modeling
2
+ VERSION = "0.0.1"
3
+ end
data/lib/modeling.rb ADDED
@@ -0,0 +1,5 @@
1
+ require_relative 'modeling/module'
2
+
3
+ class Class
4
+ include Modeling
5
+ end
metadata ADDED
@@ -0,0 +1,47 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: modeling
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Łukasz Pomietło
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-02-24 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: "\n"
14
+ email: oficjalnyadreslukasza@gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/modeling.rb
20
+ - lib/modeling/model_argument.rb
21
+ - lib/modeling/module.rb
22
+ - lib/modeling/version.rb
23
+ homepage: https://github.com/lpogic/modeling
24
+ licenses:
25
+ - Zlib
26
+ metadata:
27
+ documentation_uri: https://github.com/lpogic/modeling/blob/main/doc/wiki/README.md
28
+ post_install_message:
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 3.2.2
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubygems_version: 3.5.6
44
+ signing_key:
45
+ specification_version: 4
46
+ summary: A concise way to define the class shape
47
+ test_files: []