activefolder 1.4.0 → 1.5.1

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