modeling 0.0.2 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8a46a2db8c7a4651f21562902a6c44fad7a2e69df37dafb4b6718d5fe019b307
4
- data.tar.gz: 7d688b753d7898bc5e452fa7370643c784174972a09320102bce25f7d484c2a2
3
+ metadata.gz: 1808a9621f5f4e419a137e8f2cc01c85aebcc29e94f20c270301e1d2dafd6806
4
+ data.tar.gz: 0d24e7745e3c3e177060bd436856b63adc59c89ca09ff7b01e184fc804cc622c
5
5
  SHA512:
6
- metadata.gz: bd0fe43ec29e6a6256d8850dd36e6397f5c402b5d6a0c5eb8b9d6d5bf429b9e5c23c766b50ffd8e9acdd2dee8b80ead237768aa2c74ecfbb2e341a9855953fa4
7
- data.tar.gz: 17fa31f142f571b7311b79bbf842a1fbf9b96ab8df595007698e67df022aa113b8602a1c4646c6418d74e053482b7af2a3d973e5635daef3f3587d9bca2de56b
6
+ metadata.gz: 7728919bd5af78a82bed604551715f2bb4d10c4cf736d232b8d73293e7db99a34ef233dc5308121993073c7b7ca8b9e4287a278ae5e9a798a1bbf2fd8b7281b7
7
+ data.tar.gz: 76d4cc5dd6006574ad4c225a695c36a6e6886d8ae9a40aa26159e873ce572992db6ff4e45f54b8b463298eaa2195d0d5fbf039a64f30c3bde8156f8bb44ce729
@@ -1,60 +1,86 @@
1
1
  module Modeling
2
2
  class ModelField
3
- def initialize name, assign, setter, getter
3
+ def initialize name, filter, create_attr, writer, reader, tester
4
4
  @name = name
5
- @assign = assign
6
- @setter = setter
7
- @getter = getter
5
+ @filter = filter
6
+ @create_attr = create_attr
7
+ @writer = writer
8
+ @reader = reader
9
+ @tester = tester
8
10
  end
9
11
 
10
12
  attr :name
13
+ attr :filter
11
14
 
12
15
  def attribute_name
13
16
  "@#{name}"
14
17
  end
15
18
 
16
- def assign?
17
- @assign
19
+ def create_attr?
20
+ @create_attr
18
21
  end
19
22
 
20
- def setter?
21
- @setter
23
+ def writer?
24
+ @writer
22
25
  end
23
26
 
24
- def getter?
25
- @getter
27
+ def reader?
28
+ @reader
29
+ end
30
+
31
+ def tester?
32
+ @tester
26
33
  end
27
34
 
28
35
  class << self
29
- def parse argument
36
+ def parse argument, filter = nil
30
37
  case argument
31
38
  when ModelField
32
39
  argument
33
- when String
34
- from_string argument
35
40
  when Symbol
36
- from_string argument.to_s
41
+ from_symbol argument, filter
42
+ when String
43
+ from_string argument, filter
37
44
  when Array
38
- from_array argument
45
+ from_array argument, filter
46
+ when Hash
47
+ from_hash argument
39
48
  else
40
49
  raise "Unsupported argument #{argument}"
41
50
  end
42
51
  end
43
52
 
44
- def from_string argument
45
- if argument =~ /(\W*)(\w+)(\W*)/
46
- modifiers = $1 + $3
47
- ModelField.new $2.to_sym, modifiers.include?("@") || modifiers.include?("?"),
48
- modifiers.include?("@") || modifiers.include?("!") || modifiers.include?("="),
49
- modifiers.include?("@") || modifiers.include?("!") || modifiers.include?(".")
53
+ def from_symbol argument, filter
54
+ at = argument.start_with? "@"
55
+ bang = argument.end_with? "!"
56
+ hook = argument.end_with? "?"
57
+ rail = argument.end_with? "="
58
+ bald = !(at || bang || hook || rail)
59
+ name = argument.to_s[/\w+/].to_sym
60
+ ModelField.new name, filter, bald || hook || at || rail, bald || rail, bald || hook, false
61
+ end
62
+
63
+ def from_string argument, filter
64
+ if argument =~ /(\w+)\s*(:?\/([traw\s]*))/
65
+ ModelField.new $1.to_sym, filter, $2.include?("a"), $2.include?("w"), $2.include?("r"), $2.include?("t")
50
66
  else
51
67
  raise "Invalid argument string format '#{argument}'"
52
68
  end
53
69
  end
54
70
 
55
- def from_array argument
56
- name = argument.shift
57
- ModelField.new name, argument.include?(:assign), argument.include?(:setter), argument.include?(:getter)
71
+ def from_array argument, filter
72
+ name = argument.shift.to_sym
73
+ ModelField.new name, filter, argument.include?(:attr), argument.include?(:writer),
74
+ argument.include?(:reader), argument.include?(:tester)
75
+ end
76
+
77
+ def from_hash argument
78
+ name = argument[:name] || argument.keys.first
79
+ filter = argument[:filter] || argument[name]
80
+ parsed = parse name, filter
81
+ ModelField.new parsed.name, parsed.filter, argument[:attr] || parsed.create_attr?,
82
+ argument[:writer] || parsed.writer?, argument[:reader] || parsed.reader?,
83
+ argument[:tester] || parsed.tester?
58
84
  end
59
85
 
60
86
  end
@@ -2,27 +2,48 @@ require_relative 'model_field'
2
2
 
3
3
  module Modeling
4
4
 
5
- def model *fields, &initializer
6
- model_fields = fields.map{ ModelField.parse _1 }
7
- define_initialize model_fields, &initializer
5
+ attr_accessor :model_fields
6
+
7
+ def model *fields, **filtered_fields, &initializer
8
+ self.model_fields = model_fields = fields.map{ ModelField.parse _1 } +
9
+ filtered_fields.map{ ModelField.parse _1, _2 }
10
+ define_initialize self, &initializer
8
11
  model_fields.each do |f|
9
- attr_writer f.name if f.setter?
10
- attr_reader f.name if f.getter?
12
+ attr_writer f.name if f.writer?
13
+ attr_reader f.name if f.reader?
14
+ attr_tester f.name if f.tester?
15
+ end
16
+ end
17
+
18
+ def attr_tester symbol
19
+ define_method "#{symbol}?" do
20
+ !!instance_variable_get(symbol)
11
21
  end
12
22
  end
13
23
 
14
24
  private
15
25
 
16
26
  def self.model_arguments fields, *a, **na
17
- fields.zip(a).map{|f, arg| [f.name, na.key?(f.name) ? na[f.name] : arg]}.to_h
27
+ fields.zip(a).map do |f, arg|
28
+ value = na.key?(f.name) ? na[f.name] : arg
29
+ if !f.filter.nil? && !(f.filter === value)
30
+ if f.filter.respond_to? :from
31
+ value = f.filter.from value
32
+ else
33
+ raise ArgumentError.new "#{value}(#{value.class}) does not match #{f.filter}"
34
+ end
35
+ end
36
+ [f.name, value]
37
+ end.to_h
18
38
  end
19
39
 
20
- def define_initialize fields, &initializer
40
+ def define_initialize initializer_class, &initializer
21
41
  define_method :initialize do |*a, **na, &b|
22
- model_arguments = Modeling.model_arguments fields, *a, **na
23
- super *(a[model_arguments.size..] || []), **na.except(*model_arguments.keys), &b
24
- fields.each do |f|
25
- instance_variable_set f.attribute_name, model_arguments[f.name] if f.assign?
42
+ model_fields = initializer_class.model_fields
43
+ model_arguments = Modeling.model_arguments model_fields, *a, **na
44
+ super(*(a[model_arguments.size..] || []), **na.except(*model_arguments.keys), &b)
45
+ model_fields.each do |f|
46
+ instance_variable_set f.attribute_name, model_arguments[f.name] if f.create_attr?
26
47
  end
27
48
  instance_exec **model_arguments, &initializer if initializer
28
49
  end
@@ -1,3 +1,3 @@
1
1
  module Modeling
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.4"
3
3
  end
metadata CHANGED
@@ -1,19 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: modeling
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Łukasz Pomietło
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-26 00:00:00.000000000 Z
11
+ date: 2024-03-18 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: "\n ## Sample:\n ```RUBY\n require 'modeling'\n\n class Foo\n\n model
14
- :@first, :@second\n \n end\n\n # ==\n\n class Foo\n\n def initialize first,
15
- second\n @first = first\n @second = second\n end\n\n attr_accessor
16
- :first, :second\n\n end\n ```\n ## Check the documentation or home page for more.\n\n"
13
+ description: " Enables writting class initializers and attribute accessors in one
14
+ line. \n Struct class alternative. Keyword & positional arguments mixing. Optional
15
+ initializer arguments filtering.\n"
17
16
  email: oficjalnyadreslukasza@gmail.com
18
17
  executables: []
19
18
  extensions: []