dir_model 0.1.0 → 0.2.0

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: 9e2aa05d706d3f1d0062abcabac6716361245c35
4
- data.tar.gz: 35ef12280756a22d8c6be20be30fe5530478a73b
3
+ metadata.gz: 446e930d0a4af01c2fd5a48cbfb3e742e0a35b32
4
+ data.tar.gz: 8abc4fe852ccdfb4a259babd81e3ee080f33e8ab
5
5
  SHA512:
6
- metadata.gz: 6e1ed34d9a1a8f5a5b1fe6a28adc19ab7ecbc0679972cada464e4b80828a4306c41505387ad0e09b85822168d8f4bac4fcd997c486b33b125c402551e3057a73
7
- data.tar.gz: 8765c79b182f2c5b6d38a676b4bb1bf678f30e85b5b1dd3a5073ac17c69b13e5ceb18916d3f7c1745db9798516515a819cfa90256353c54954be56d2fc44b78b
6
+ metadata.gz: 58278e1b4641a695da21cc21f91c696517d85807ff0824175cfe32884e097863b5658871571498092c2b2b46a3990c9f65d7d27be6b5ee5a7ad7cc948a89206d
7
+ data.tar.gz: 409e249c4c01de393961daef38df9c464ee8c79870efa7fc4633a65fba65743d0d57248b6bf59a709c17d6f82f7e698c50912e10e52825ba8196707542c47892
data/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ ### VERSION 0.2.0
2
+
3
+ * Apply [CsvRowModel](https://github.com/FinalCAD/csv_row_model) pattern for export.
4
+
5
+ ### VERSION 0.1.0
6
+
7
+ * First extraction
data/Gemfile CHANGED
@@ -3,6 +3,8 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in dir_model.gemspec
4
4
  gemspec
5
5
 
6
+ # gem 'inherited_class_var', path: '../inherited_class_var'
7
+
6
8
  gem "bundler", "> 1.3"
7
9
  gem "rake", "~> 10.0"
8
10
 
@@ -10,4 +12,4 @@ group :test do
10
12
  gem "rspec"
11
13
  gem "codeclimate-test-reporter"
12
14
  gem 'pry-byebug'
13
- end
15
+ end
data/README.md CHANGED
@@ -21,28 +21,50 @@ Or install it yourself as:
21
21
  ## Usage
22
22
 
23
23
  ### Export
24
+
24
25
  ```ruby
25
- class ImageDir < DirModel::Export
26
- file :zone_image
26
+ class ImageDir
27
+ include DirModel
28
+
29
+ file :image, path: -> { "#{dir}/#{sub_dir}" }, name: -> { "#{image_name}.png" }
30
+ end
27
31
 
28
- def zone_image_source
29
- File.new("spec/fixtures/image.png")
32
+ class ImageExportDir < ImageDir
33
+ include DirModel::Export
34
+
35
+ def dir
36
+ 'Sectors'
30
37
  end
31
- def zone_image_name
32
- "testing.png"
38
+
39
+ def sub_dir
40
+ source_model.sector_name
33
41
  end
34
42
 
35
- def _generate
36
- mk_chdir "level1" do
37
- mk_chdir "level2" do
38
- copy_file :zone_image
39
- end
40
- end
43
+ def image_name
44
+ source_model.zone_name
41
45
  end
46
+
47
+ def image
48
+ source_model.zone
49
+ end
50
+ end
51
+
52
+ fixture_models = [
53
+ OpenStruct.new({
54
+ id: 42,
55
+ sector_name: 'sector_name',
56
+ zone_name: 'zone_name',
57
+ zone: File.new('spec/fixtures/image.png'),
58
+ })
59
+ ]
60
+
61
+ exporter = DirModel::Export::AggregateDir.new(ImageExportDir)
62
+
63
+ exporter.generate do |dir|
64
+ models.each { |model| dir << model }
42
65
  end
43
66
 
44
- image_dir = ImageDir.new
45
- image_dir.path # => path representing the above: "#{image_dir.path}/level1/level2/testing.png"
67
+ exporter.dir_path # => path of generated dir .../Sectors
46
68
  ```
47
69
 
48
70
  ## zip_dir
@@ -55,56 +77,4 @@ zip_file = zipper.generate do |z|
55
77
  end
56
78
  ```
57
79
 
58
- **Ensure that `require zip_dir` occurs before `dir_model`**
59
-
60
- ## Future
61
- Define a schema for the directory.
62
- ```ruby
63
- class ImageDir
64
- include DirModel
65
-
66
- file :zone_image, path: "{{root}}/{{branch}}", name: "{{zone_name}}"
67
- end
68
- ```
69
-
70
- To export, define your export model like [`ActiveModel::Serializer`](https://github.com/rails-api/active_model_serializers)
71
- and generate the directory requirements:
72
-
73
- ```ruby
74
- class ImageExportDir < ImageDir
75
- include DirModel::Export
76
-
77
- # below are method overrides with default implementation
78
- #
79
- # overriding is recommended
80
- #
81
- def root; source_model.root end
82
- def branch; source_model.branch end
83
- def zone_name; source_model.zone_name end
84
-
85
- # define your image source
86
- #
87
- # override with something like: File.new("path/to/image.png")
88
- #
89
- def zone_image
90
- source_model.zone_image
91
- end
92
- end
93
- ```
94
-
95
- To import, define your import model, which works like [`ActiveRecord`](http://guides.rubyonrails.org/active_record_querying.html)
96
- wrapping over a directory:
97
-
98
- ```ruby
99
- class ImageImportDir < ImageDir
100
- include DirModel::Import
101
-
102
- #
103
- # below are method overrides with default implementation
104
- #
105
- def root; "level1" end
106
- def branch; "level2" end
107
- def zone_name; "testing" end
108
- def zone_image; File.new("....") end
109
- end
110
- ```
80
+ **Ensure that `require zip_dir` occurs before `dir_model` (for now)**
data/UPGRADE.md ADDED
@@ -0,0 +1,26 @@
1
+ # Upgrading
2
+
3
+ # Upgrading from 0.1.0 to 0.2.0
4
+
5
+ You have to change
6
+
7
+ ```
8
+ def _generate
9
+ mk_chdir "level1" do
10
+ mk_chdir "level2" do
11
+ copy_file :zone_image
12
+ end
13
+ end
14
+ end
15
+ ```
16
+
17
+ for a DirModel
18
+
19
+ ```
20
+ class ImageDir
21
+ include DirModel
22
+
23
+ file :image, path: -> { "#{dir}/#{sub_dir}" }, name: -> { "#{image_name}.png" }
24
+ end
25
+ ```
26
+ see the README
data/dir_model.gemspec CHANGED
@@ -17,4 +17,7 @@ Gem::Specification.new do |spec|
17
17
  spec.bindir = "exe"
18
18
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
19
  spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency 'activesupport', '~> 4.2'
22
+ spec.add_dependency 'inherited_class_var', '~> 0.1'
20
23
  end
@@ -2,9 +2,9 @@ class Dir
2
2
  class << self
3
3
  def clean_entries(dir)
4
4
  entries = entries(dir)
5
- entries.delete "."
6
- entries.delete ".."
5
+ entries.delete '.'
6
+ entries.delete '..'
7
7
  entries
8
8
  end
9
9
  end
10
- end
10
+ end
@@ -7,4 +7,4 @@ if defined?(ZipDir)
7
7
  dir.cleanup
8
8
  end
9
9
  end
10
- end
10
+ end
@@ -0,0 +1,33 @@
1
+ require 'active_support/hash_with_indifferent_access'
2
+
3
+ module DirModel
4
+ module Export
5
+ class AggregateDir
6
+ include Utils
7
+
8
+ attr_reader :export_dir_model_class, :context, :dir_path
9
+
10
+ # @param [Export] export_model export model class
11
+ def initialize(export_dir_model_class, context={})
12
+ @export_dir_model_class = export_dir_model_class
13
+ @context = context.to_h.symbolize_keys
14
+ @dir_path = Dir.mktmpdir
15
+ end
16
+
17
+ # Add a row_model to the
18
+ # @param [] source_model the source model of the export file model
19
+ # @param [Hash] context the extra context given to the instance of the file model
20
+ def append_model(source_model, context={})
21
+ source_path = export_dir_model_class.new(source_model, context.reverse_merge(self.context)).path
22
+ FileUtils.cp_r Dir.glob("#{source_path}/*"), dir_path
23
+ end
24
+ alias_method :<<, :append_model
25
+
26
+ def generate
27
+ yield self
28
+ self
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -1,82 +1,45 @@
1
1
  module DirModel
2
- class Export
3
- def path
4
- generate unless generated?
5
- @temp_path
6
- end
2
+ module Export
7
3
 
8
- def entry_paths
9
- Dir.clean_entries(path).map {|entry| File.join path, entry }
10
- end
4
+ attr_reader :source_model, :context
11
5
 
12
- def valid?
13
- !file_sources.any? { |file_source| file_source.nil? || file_source.read.nil? }
14
- rescue
15
- false
6
+ # @param [Model] source_model object to export to files
7
+ # @param [Hash] context
8
+ def initialize(source_model, context={})
9
+ @source_model = source_model
10
+ @context = OpenStruct.new(context)
11
+ @root_path = Dir.mktmpdir
16
12
  end
17
13
 
18
- def file_sources
19
- self.class.files.map { |file| file_source(file) }
20
- end
21
- def file_source(file)
22
- public_send(self.class.file_source_method_name(file))
23
- end
24
- def file_name(file)
25
- File.join(*pwd, public_send(self.class.file_name_method_name(file)))
14
+ def path
15
+ generate unless generated?
16
+ @root_path
26
17
  end
27
18
 
19
+ private
20
+
28
21
  def generated?
29
22
  !!@generated
30
23
  end
24
+
31
25
  def generate
32
26
  cleanup if generated?
33
- @temp_path = Dir.mktmpdir
34
27
 
35
- @pwd = [@temp_path]
36
- _generate
28
+ self.class.files.each do |file_name, options|
29
+ dir_path = instance_exec(&options[:path])
30
+ file_path = File.join(dir_path, instance_exec(&options[:name]))
31
+
32
+ mkdir { File.join(@root_path, dir_path) }
33
+
34
+ File.open(File.join(@root_path, file_path), 'wb') {|f| f.write(self.public_send(file_name).read) }
35
+ end
37
36
  ensure
38
37
  @generated = true
39
38
  end
40
39
 
41
40
  def cleanup
42
- FileUtils.remove_entry_secure @temp_path
41
+ FileUtils.remove_entry @root_path
43
42
  @generated = false
44
43
  end
45
-
46
- protected
47
- attr_reader :pwd
48
-
49
- def copy_file(file)
50
- File.open(file_name(file), 'wb') {|f| f.write(file_source(file).read) }
51
- end
52
-
53
- def _generate
54
- raise NotImplementedError.new("Missing #{self.class} implementation")
55
- end
56
-
57
- def mk_chdir(dir, *permissions_int)
58
- @pwd << dir
59
- Dir.mkdir(File.join(*pwd), *permissions_int)
60
- yield
61
- ensure
62
- @pwd.pop
63
- end
64
-
65
- class << self
66
- attr_reader :files
67
-
68
- def file(*files)
69
- @files ||= []
70
- @files += files
71
- end
72
-
73
- def file_name_method_name(file)
74
- "#{file}_name"
75
- end
76
-
77
- def file_source_method_name(file)
78
- "#{file}_source"
79
- end
80
- end
81
44
  end
82
- end
45
+ end
@@ -0,0 +1,7 @@
1
+ module Utils
2
+ extend ActiveSupport::Concern
3
+
4
+ def mkdir
5
+ FileUtils.mkdir_p(yield)
6
+ end
7
+ end
@@ -1,3 +1,3 @@
1
1
  module DirModel
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/dir_model.rb CHANGED
@@ -1,10 +1,37 @@
1
- require "dir_model/version"
1
+ require 'dir_model/version'
2
+
3
+ require 'active_support/concern'
4
+
5
+ require 'dir_model/utils'
2
6
 
3
7
  require 'dir_model/core_ext/dir'
4
8
  require 'dir_model/core_ext/zip_dir/zipper'
5
9
 
6
10
  require 'dir_model/export'
11
+ require 'dir_model/export/aggregate_dir'
12
+
13
+ require 'inherited_class_var'
7
14
 
8
15
  module DirModel
9
- # Your code goes here...
16
+ extend ActiveSupport::Concern
17
+
18
+ included do
19
+ include Utils
20
+ include InheritedClassVar
21
+ inherited_class_hash :files
22
+ end
23
+
24
+ module ClassMethods
25
+
26
+ # @return [Array<Symbol>] file names
27
+ def file_names
28
+ files.keys
29
+ end
30
+
31
+ protected
32
+
33
+ def file(file_name, options={})
34
+ merge_files(file_name.to_sym => options)
35
+ end
36
+ end
10
37
  end
metadata CHANGED
@@ -1,15 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dir_model
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Chung
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-10-27 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2015-11-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: inherited_class_var
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.1'
13
41
  description:
14
42
  email:
15
43
  - hello@stevenchung.ca
@@ -20,10 +48,12 @@ files:
20
48
  - ".gitignore"
21
49
  - ".rspec"
22
50
  - ".travis.yml"
51
+ - CHANGELOG.md
23
52
  - Gemfile
24
53
  - LICENSE.txt
25
54
  - README.md
26
55
  - Rakefile
56
+ - UPGRADE.md
27
57
  - bin/console
28
58
  - bin/setup
29
59
  - dir_model.gemspec
@@ -31,6 +61,8 @@ files:
31
61
  - lib/dir_model/core_ext/dir.rb
32
62
  - lib/dir_model/core_ext/zip_dir/zipper.rb
33
63
  - lib/dir_model/export.rb
64
+ - lib/dir_model/export/aggregate_dir.rb
65
+ - lib/dir_model/utils.rb
34
66
  - lib/dir_model/version.rb
35
67
  homepage: https://github.com/FinalCAD/dir_model
36
68
  licenses: