modeling 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []