activefolder 1.4.0 → 1.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 54a1d4226ad7639ff93a8a09e019c9e015d0ef95
4
- data.tar.gz: 811f65cedf9285efda3f9014478223f800c28de0
3
+ metadata.gz: b8d5144e244c0cdbc5c878483014c7ad28202046
4
+ data.tar.gz: ee9952308d7f237e160f61e34141e6d9f3c24d96
5
5
  SHA512:
6
- metadata.gz: db500b27f2ea1d858fddb93afee1944e368147233a803a0cc7f47e3d634f276f351d854fb34902ead9c90070bd16aeb18189a6ea90987d33f1b5ab2f81576ea8
7
- data.tar.gz: da3743527ebff5aed791d3c759b8d735add0d56498c1509b0a3dc8c2f9367c6b1399f3b5e2bd2632c0a756713da9ea6b05a4140dd2fbea5872cf7ea5143e479b
6
+ metadata.gz: e388d519d6f6740cc21b2fbd01c31c96d51a7e1b7714071c8a6ea63b1470655a8315a049f74987e89e01a5d8d6560e038536ad1755f0282360bb242e9145b0af
7
+ data.tar.gz: e84bd1f8e413ee7042d2a5d7499074987c7a9abb22ab496ae0ad0c31d228f9a4241528e359df74b9bfd245fe4d99f90c475401c796dec92ebd4ce582ad4722e8
@@ -1,28 +1,32 @@
1
+ require 'hooks'
1
2
  require 'ostruct'
2
3
 
3
4
  require 'activefolder/model/traits/persistence'
4
5
  require 'activefolder/model/traits/relation'
5
6
  require 'activefolder/model/traits/collection'
7
+ require 'activefolder/model/traits/validation'
6
8
  require 'activefolder/model/errors'
7
9
 
8
10
  module ActiveFolder
9
11
  class Base < OpenStruct
12
+ include Hooks
10
13
  include Model::Traits::Persistence
11
14
  include Model::Traits::Relation
12
15
  extend Model::Traits::Collection
16
+ extend Model::Traits::Validation
13
17
 
14
- class << self
15
- def model_name
16
- model = name.demodulize
17
- model.underscore.pluralize
18
- end
18
+ define_hooks :before_save, :after_load
19
19
 
20
- def model_class; self; end
21
- def model_base_dir; '/' end
22
- end
20
+ validate :name, /^(?!.*\/).*$/,
21
+ '"name" must not contain slashes'
22
+
23
+ validate :name, /.+/,
24
+ '"name" must not be empty'
25
+
26
+ validate :base_dir, /.+/,
27
+ '"base_dir" must not be empty'
23
28
 
24
29
  def path
25
- required(:name); required(:base_dir)
26
30
  File.join(base_dir, name)
27
31
  end
28
32
 
@@ -30,11 +34,14 @@ module ActiveFolder
30
34
  self.to_h.except(:name, :base_dir)
31
35
  end
32
36
 
33
- private
37
+ class << self
38
+ def model_name
39
+ model = name.to_s.demodulize
40
+ model.underscore.pluralize
41
+ end
34
42
 
35
- def required(attr)
36
- return unless send(attr).to_s.empty?
37
- raise Model::AttributeError.new(attr)
43
+ def model_class; self; end
44
+ def model_base_dir; '/' end
38
45
  end
39
46
  end
40
47
  end
@@ -2,12 +2,6 @@ require 'activefolder/errors'
2
2
 
3
3
  module ActiveFolder
4
4
  module Model
5
- class AttributeError < Error
6
- def initialize(attr)
7
- super("Missing attribute #{attr}")
8
- end
9
- end
10
-
11
5
  class DuplicateError < Error
12
6
  def initialize(name)
13
7
  super("Duplicate object #{name}")
@@ -19,5 +13,13 @@ module ActiveFolder
19
13
  super("Object not found #{name}")
20
14
  end
21
15
  end
16
+
17
+ class ValidationError < Error
18
+ def initialize(attr, schema, msg = nil)
19
+ if msg then super msg
20
+ else super("#{attr.inspect} does not match #{schema.inspect}")
21
+ end
22
+ end
23
+ end
22
24
  end
23
25
  end
@@ -10,16 +10,17 @@ module ActiveFolder
10
10
  included do
11
11
  def load
12
12
  attrs = attributes_file.load
13
+
13
14
  attrs.each_pair do |key,val|
14
15
  self[key] = val
15
16
  end
16
17
 
17
- self
18
+ run_hook :after_load; self
18
19
  end
19
20
 
20
21
  def save
21
22
  attributes_file.save(attributes)
22
- self
23
+ run_hook :before_save; self
23
24
  end
24
25
 
25
26
  def save!; self.save end
@@ -1,4 +1,4 @@
1
- require 'activefolder/model/utilities/collection'
1
+ require 'activefolder/model/utilities/folder'
2
2
  require 'activefolder/model/utilities/symbol'
3
3
  require 'activefolder/metal/files/text'
4
4
  require 'activefolder/model/traits/discovery'
@@ -14,7 +14,7 @@ module ActiveFolder
14
14
  class_methods do
15
15
  def has_many collection
16
16
  define_method collection do
17
- Utilities::Collection.new(self, collection)
17
+ Utilities::Folder.new(self, collection)
18
18
  end
19
19
  end
20
20
 
@@ -25,11 +25,6 @@ module ActiveFolder
25
25
  end
26
26
 
27
27
  def has_one element
28
- define_method :link_file do |name|
29
- params = { dir: path, name: name.to_s }
30
- Metal::Files::Text.new(**params)
31
- end
32
-
33
28
  define_method element do
34
29
  begin
35
30
  path = link_file(element).load
@@ -43,6 +38,13 @@ module ActiveFolder
43
38
  end
44
39
  end
45
40
  end
41
+
42
+ included do
43
+ def link_file name
44
+ params = { dir: path, name: name.to_s }
45
+ Metal::Files::Text.new(**params)
46
+ end
47
+ end
46
48
  end
47
49
  end
48
50
  end
@@ -0,0 +1,25 @@
1
+ require 'activefolder/model/utilities/match'
2
+
3
+ module ActiveFolder
4
+ module Model
5
+ module Traits
6
+ module Validation
7
+ using Utilities::Match
8
+
9
+ def validate attribute, schema, message = nil
10
+ before_save do
11
+ unless schema.match(self.send attribute)
12
+ raise ValidationError.new(attribute, schema, message)
13
+ end
14
+ end
15
+
16
+ after_load do
17
+ unless schema.match(self.send attribute)
18
+ raise ValidationError.new(attribute, schema, message)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -4,7 +4,7 @@ require 'activefolder/model/utilities/symbol'
4
4
  module ActiveFolder
5
5
  module Model
6
6
  module Utilities
7
- class Collection
7
+ class Folder
8
8
  using Utilities::Symbol
9
9
  include Model::Traits::Collection
10
10
 
@@ -1,5 +1,3 @@
1
- require 'activefolder/model/traits/enumeration'
2
-
3
1
  module ActiveFolder
4
2
  module Model
5
3
  module Utilities
@@ -8,6 +6,10 @@ module ActiveFolder
8
6
  def match(object); self == object end
9
7
  end
10
8
 
9
+ refine Class do
10
+ def match(object); object.is_a? self end
11
+ end
12
+
11
13
  refine Range do
12
14
  def match(object); member?(object) end
13
15
  end
@@ -27,12 +29,22 @@ module ActiveFolder
27
29
  refine Array do
28
30
  def match(object)
29
31
  any? do |condition|
30
- object.to_a.any? do |element|
32
+ Array(object).any? do |element|
31
33
  condition.match(element)
32
34
  end
33
35
  end
34
36
  end
35
37
  end
38
+
39
+ refine Regexp do
40
+ alias_method :match!, :match
41
+
42
+ def match(object)
43
+ match! object
44
+ rescue TypeError
45
+ false
46
+ end
47
+ end
36
48
  end
37
49
  end
38
50
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activefolder
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Thorner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-07 00:00:00.000000000 Z
11
+ date: 2016-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -30,6 +30,26 @@ dependencies:
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
32
  version: 4.2.5
33
+ - !ruby/object:Gem::Dependency
34
+ name: hooks
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.4'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 0.4.1
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '0.4'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 0.4.1
33
53
  description: A file system ORM based on ActiveRecord. Objects are files, relations
34
54
  are folders.
35
55
  email: benthorner@outlook.com
@@ -53,7 +73,8 @@ files:
53
73
  - lib/activefolder/model/traits/enumeration.rb
54
74
  - lib/activefolder/model/traits/persistence.rb
55
75
  - lib/activefolder/model/traits/relation.rb
56
- - lib/activefolder/model/utilities/collection.rb
76
+ - lib/activefolder/model/traits/validation.rb
77
+ - lib/activefolder/model/utilities/folder.rb
57
78
  - lib/activefolder/model/utilities/match.rb
58
79
  - lib/activefolder/model/utilities/symbol.rb
59
80
  - lib/activefolder/rspec.rb