dir_model 0.1.0 → 0.2.0

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