manioc 0.1.7 → 0.1.8

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
  SHA1:
3
- metadata.gz: bbf51f894b47080af4d5e97b35132e52291672fe
4
- data.tar.gz: 6c398d5d8e7d3462501cdf7ed4198b8b334a24d0
3
+ metadata.gz: 6015ad7a95b419bc25ff766dbb024aaf63e66342
4
+ data.tar.gz: d07b7e6f417be0d6fec65e5d310080e55901da6f
5
5
  SHA512:
6
- metadata.gz: 6fac0c5ae71e3e5b2e60598e85600a7d1e212693ef0124509172998ff7849808b407b2ae0efb2216076eabcabfb66f07e9d85e9704babaa8ac33261b2d521839
7
- data.tar.gz: 48b84b358ba6c70b494593749baf64823a18db2445e8dbc79c2a9289077bad827b2574744d65048c10aa1a4f79588b321b44ab9c3b92865488df5dec984d603f
6
+ metadata.gz: b2aa342da2aff07b80f076e596fc1d8d47f2393d5f73bdd961fd0d5d1f4dcfc4c2f5b7a7320d280b39d553eb4f3262c32865c8a014c9e7301afa8b70d45b4b1d
7
+ data.tar.gz: 58687555545596de7b4e91cfc0bc3336de9dfb997c6abcc67dfa9bae0e2066e8438fac758fabcca1b9b6eefeb2bd25be4e4e0262f141e8df304eb9df8535b481
@@ -1,6 +1,7 @@
1
1
  module Manioc
2
2
  class Rails::Application
3
- def self.container &setup
3
+ def self.container frozen: true, &setup
4
+ Manioc.frozen = frozen
4
5
  if setup
5
6
  config.container = config.container.with(&setup)
6
7
  else
@@ -8,8 +9,8 @@ module Manioc
8
9
  end
9
10
  end
10
11
 
11
- def container &setup
12
- self.class.container(&setup)
12
+ def container **opts, &setup
13
+ self.class.container(**opts, &setup)
13
14
  end
14
15
  end
15
16
 
data/lib/manioc/struct.rb CHANGED
@@ -1,33 +1,59 @@
1
1
  module Manioc
2
2
  class << self
3
3
  def [] *fields, **defaults
4
- fields = (fields + defaults.keys).uniq
5
-
6
- Class.new Struct do
7
- define_singleton_method(:fields ) { fields }
8
- define_singleton_method(:defaults) { defaults }
9
-
10
- fields.each do |field|
11
- attr_reader field
12
- end
13
- end
4
+ Struct.configure \
5
+ fields: fields,
6
+ defaults: defaults,
7
+ mutable: false
14
8
  end
15
9
 
16
- def frozen= val
17
- @frozen = val
18
- end
19
- def frozen?
20
- @frozen
10
+ def mutable *fields, **defaults
11
+ Struct.configure \
12
+ fields: fields,
13
+ defaults: defaults,
14
+ mutable: true
21
15
  end
16
+
17
+ attr_accessor :frozen
18
+
19
+ def frozen?; frozen; end
22
20
  end
21
+
23
22
  self.frozen = true
24
23
 
25
24
  class Struct
25
+ class Config
26
+ attr_accessor :fields, :defaults, :mutable
27
+
28
+ def mutable?; mutable end
29
+ def immutable?; !mutable? end
30
+ end
31
+
32
+ def self.configure fields: [], defaults: {}, mutable: Manioc.frozen?
33
+ config = Config.new.tap do |c|
34
+ c.fields = fields + defaults.keys
35
+ c.defaults = defaults
36
+ c.mutable = mutable
37
+ end
38
+
39
+ Class.new Struct do
40
+ define_singleton_method(:config) { config }
41
+
42
+ config.fields.each do |field|
43
+ if config.mutable
44
+ attr_accessor field
45
+ else
46
+ attr_reader field
47
+ end
48
+ end
49
+ end
50
+ end
51
+
26
52
  def initialize **fields
27
- fields = self.class.defaults.merge fields
53
+ fields = self.class.config.defaults.merge fields
28
54
  _validate fields
29
55
  _assign fields
30
- freeze if Manioc.frozen?
56
+ freeze if Manioc.frozen? && self.class.config.immutable?
31
57
  end
32
58
 
33
59
  def == other
@@ -39,7 +65,7 @@ module Manioc
39
65
  end
40
66
 
41
67
  def to_h
42
- self.class.fields.each_with_object({}) { |field,h| h[field] = public_send field }
68
+ self.class.config.fields.each_with_object({}) { |field,h| h[field] = public_send field }
43
69
  end
44
70
 
45
71
  def inspect
@@ -51,12 +77,12 @@ module Manioc
51
77
  private
52
78
 
53
79
  def _validate fields
54
- missing = self.class.fields - fields.keys
80
+ missing = self.class.config.fields - fields.keys
55
81
  if missing.any?
56
82
  raise KeyError, "#{self}(#{self.class}) missing fields #{missing}"
57
83
  end
58
84
 
59
- extra = fields.keys - self.class.fields
85
+ extra = fields.keys - self.class.config.fields
60
86
  if extra.any?
61
87
  raise KeyError, "#{self}(#{self.class}) passed extra fields #{extra}"
62
88
  end
@@ -1,3 +1,3 @@
1
1
  module Manioc
2
- VERSION = '0.1.7'.freeze
2
+ VERSION = '0.1.8'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: manioc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Dabbs
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-08-16 00:00:00.000000000 Z
11
+ date: 2017-11-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler