activefolder 0.0.4 → 0.0.5

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: 0c797caee9bc346c2117c06b66e00541b7526c7a
4
- data.tar.gz: 54c7374922603db20c35ac5e6212f5c55d446e60
3
+ metadata.gz: 020e30e40612918e0063d5fa36fb3aff3c293eed
4
+ data.tar.gz: 8e382664812b53c6ec4d315d9d43096e4a62bbb4
5
5
  SHA512:
6
- metadata.gz: ead8a1ac4b1b0c938e06432841dcdaf40db5112ccda118f1ee22009ff865a55b5ae45ba9eab2b69000d9fc11a415029114e4d1ca6771a93bb3a91e83d64d8bb1
7
- data.tar.gz: 999b3312d5c2484c00c833e7ca14fedd6c332e05cf08f5bff6784fcd5cd31d1cae9187bfcbcf4e3350292346f2d2ffb80283e51459ab5f5de0b5824d95b09058
6
+ metadata.gz: c1a8ef1fc3d7553f8c3f6164faa1049e880efa319271ba21e6a49b3aa74e580354debd83e0c539fb950af8adb61be85e200eb8c3b3577fc8d8e8d616f8d346e4
7
+ data.tar.gz: 552e0b30ee18334dbd48092dbbaacb074661e7f546235ebf2c141d6d259dc3b668d24ad3d75d77ce9a7582d733f4f2e712cf4657815caae7383761cdb066fb26
@@ -1,11 +1,13 @@
1
1
  require 'active_folder/metal/adapters/bare'
2
2
  require 'active_folder/metal/connections/bare'
3
+ require 'active_folder/metal/connections/git'
3
4
 
4
5
  module ActiveFolder
5
6
  module Metal
6
7
  class Client
7
8
  def initialize(config)
8
9
  @config = config
10
+ @connection = connect(config)
9
11
  end
10
12
 
11
13
  def load(**args)
@@ -20,14 +22,21 @@ module ActiveFolder
20
22
  adapter.glob(**args)
21
23
  end
22
24
 
25
+ def connection
26
+ @connection
27
+ end
28
+
23
29
  private
24
30
 
25
- def adapter
26
- @adapter ||= Adapters::Bare.new(connection)
31
+ def connect(config)
32
+ case config.root_path
33
+ when :git then Connections::Git.new(config)
34
+ else Connections::Bare.new(config)
35
+ end
27
36
  end
28
37
 
29
- def connection
30
- @connection ||= Connections::Bare.new(@config)
38
+ def adapter
39
+ @adapter ||= Adapters::Bare.new(connection)
31
40
  end
32
41
  end
33
42
  end
@@ -9,6 +9,10 @@ module ActiveFolder
9
9
  def root_path
10
10
  @config.root_path
11
11
  end
12
+
13
+ def current_path
14
+ Dir.pwd
15
+ end
12
16
  end
13
17
  end
14
18
  end
@@ -0,0 +1,25 @@
1
+ require 'rugged'
2
+
3
+ module ActiveFolder
4
+ module Metal
5
+ module Connections
6
+ class Git
7
+ def initialize(config)
8
+ @config = config
9
+ end
10
+
11
+ def current_path; Dir.pwd end
12
+
13
+ def root_path
14
+ rugged.discover(current_path)
15
+ rescue Rugged::RepositoryError => e
16
+ raise SystemError.new(e)
17
+ end
18
+
19
+ private
20
+
21
+ def rugged; Rugged::Repository end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -6,17 +6,25 @@ module ActiveFolder
6
6
  module Collection
7
7
  include Enumeration
8
8
 
9
- def build(**args)
9
+ def build(args, &block)
10
10
  dir = File.join(model_base_dir, model_name)
11
- model_class.new(**args.merge(base_dir: dir))
11
+ args = args.merge(base_dir: dir)
12
+
13
+ instance = model_class.new(args)
14
+ yield instance if block_given?; instance
15
+ end
16
+
17
+ def create(args, &block)
18
+ instance = build(args, &block);
19
+ instance.save!; instance
12
20
  end
13
21
 
14
- def create(**args)
15
- instance = build(**args); instance.save!; instance
22
+ def find_or_create(args, &block)
23
+ find(args[:name]) || create(args, &block)
16
24
  end
17
25
 
18
- def find_or_create(**args)
19
- find(args[:name]) || create(**args)
26
+ def find_or_initialize(args, &block)
27
+ find(args[:name]) || build(args, &block)
20
28
  end
21
29
  end
22
30
  end
@@ -0,0 +1,26 @@
1
+ module ActiveFolder
2
+ module Model
3
+ module Traits
4
+ module Discovery
5
+ extend ActiveSupport::Concern
6
+
7
+ class_methods do
8
+ def current(path = nil)
9
+ client = ActiveFolder.client
10
+ connection = client.connection
11
+
12
+ path ||= connection.current_path
13
+ pathname = Pathname.new(path)
14
+
15
+ dir = pathname.ascend do |file|
16
+ parent_dir = file.parent.basename.to_s
17
+ break(file) if parent_dir == model_name
18
+ end
19
+
20
+ model_class.load(dir) if dir
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -34,6 +34,10 @@ module ActiveFolder
34
34
  def where(**args)
35
35
  all.select { |element| args.match(element) }
36
36
  end
37
+
38
+ def count
39
+ all.count
40
+ end
37
41
  end
38
42
  end
39
43
  end
@@ -3,6 +3,7 @@ require 'pathname'
3
3
  require 'active_folder/model/utilities/collection'
4
4
  require 'active_folder/model/utilities/symbol'
5
5
  require 'active_folder/metal/files/text'
6
+ require 'active_folder/model/traits/discovery'
6
7
 
7
8
  module ActiveFolder
8
9
  module Model
@@ -11,6 +12,8 @@ module ActiveFolder
11
12
  using Utilities::Symbol
12
13
  extend ActiveSupport::Concern
13
14
 
15
+ include Discovery
16
+
14
17
  class_methods do
15
18
  def has_many collection
16
19
  define_method collection do
@@ -42,17 +45,6 @@ module ActiveFolder
42
45
  link_file(element).save(value.path)
43
46
  end
44
47
  end
45
-
46
- def current(path = Dir.pwd)
47
- pathname = Pathname.new(path)
48
-
49
- dir = pathname.ascend do |file|
50
- parent_dir = file.parent.basename.to_s
51
- break(file) if parent_dir == model_name
52
- end
53
-
54
- model_class.load(dir) if dir
55
- end
56
48
  end
57
49
  end
58
50
  end
@@ -10,12 +10,16 @@ module ActiveFolder
10
10
  included do
11
11
  def load!
12
12
  attrs = attributes_file.load
13
- raise TypeError.new(attrs) unless attrs.respond_to?(:each_pair)
14
- attrs.each { |k,v| self[k] = v }
13
+ attrs.each_pair do |key,val|
14
+ self[key] = val
15
+ end
16
+
17
+ self
15
18
  end
16
19
 
17
20
  def save!
18
21
  attributes_file.save(attributes)
22
+ self
19
23
  end
20
24
 
21
25
  def update!(**args)
@@ -8,6 +8,10 @@ module ActiveFolder
8
8
  def match(object); self == object end
9
9
  end
10
10
 
11
+ refine Range do
12
+ def match(object); member?(object) end
13
+ end
14
+
11
15
  refine Hash do
12
16
  def match(object)
13
17
  keys.all? do |key|
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activefolder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Thorner
@@ -30,7 +30,8 @@ dependencies:
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
32
  version: 4.2.5
33
- description: A file system ORM
33
+ description: A file system ORM based on ActiveRecord. Objects are files, relations
34
+ are folders.
34
35
  email: benthorner@outlook.com
35
36
  executables: []
36
37
  extensions: []
@@ -44,11 +45,13 @@ files:
44
45
  - lib/active_folder/metal/client.rb
45
46
  - lib/active_folder/metal/config.rb
46
47
  - lib/active_folder/metal/connections/bare.rb
48
+ - lib/active_folder/metal/connections/git.rb
47
49
  - lib/active_folder/metal/errors.rb
48
50
  - lib/active_folder/metal/files/text.rb
49
51
  - lib/active_folder/metal/files/yaml.rb
50
52
  - lib/active_folder/model/errors.rb
51
53
  - lib/active_folder/model/traits/collection.rb
54
+ - lib/active_folder/model/traits/discovery.rb
52
55
  - lib/active_folder/model/traits/enumeration.rb
53
56
  - lib/active_folder/model/traits/has_belongs.rb
54
57
  - lib/active_folder/model/traits/persistence.rb
@@ -78,5 +81,5 @@ rubyforge_project:
78
81
  rubygems_version: 2.4.5
79
82
  signing_key:
80
83
  specification_version: 4
81
- summary: Active Folder
84
+ summary: A file system ORM based on ActiveRecord.
82
85
  test_files: []