manioc 0.1.7 → 0.1.8

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 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