file_system_project 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 205f413f0eca0e5f6dc862e9fa058c1cdaba9d90
4
+ data.tar.gz: 859d2fd495f4f123e3ecd34af9d15e50d3656264
5
+ SHA512:
6
+ metadata.gz: 0032859200070d695ccaefcba7e2b91f1ea1edf54ec0212cff7628ba6ced3640ce723185c0f9db84ffc5ce54af13a86681b652c96249dda6ba7ee009ba9a26e1
7
+ data.tar.gz: 6f984f47e2a6f33ee4b78cdae65d1ef13c0a85c177ead1612548257853ce2cce698b4f1848692fdb30e80140f2b0bb8264a3b74fbc1a8409abe933ffd9788797
@@ -0,0 +1,36 @@
1
+ require 'nokogiri'
2
+ require 'ostruct'
3
+
4
+ class DataMapper
5
+ attr_reader :mapper
6
+ def initialize(string)
7
+ @doc = Nokogiri.XML(string)
8
+ @mapper = map(@doc.root)
9
+ end
10
+
11
+ def plural(string)
12
+ string + 's'
13
+ end
14
+
15
+ def adder(el)
16
+ el.elements.empty? ? el.text : map(el)
17
+ end
18
+
19
+ def map(main_el)
20
+ obj = OpenStruct.new
21
+ main_el.elements.each do |el|
22
+ plur = plural(el.name)
23
+ if obj.respond_to?(plur)
24
+ obj.send(plur) << adder(el)
25
+ elsif main_el.css(el.name).size > 1
26
+ obj.send("#{plur}=", [])
27
+ obj.send(plur) << adder(el)
28
+ elsif el.elements.empty?
29
+ obj.send("#{el.name}=", el.text)
30
+ else
31
+ obj.send("#{el.name}=", map(el))
32
+ end
33
+ end
34
+ obj
35
+ end
36
+ end
@@ -0,0 +1,66 @@
1
+ class FileStruct
2
+ attr_accessor :basename, :content, :path
3
+ attr_reader :ext, :version
4
+
5
+ def initialize(path, options = {})
6
+ @path = path
7
+ @basename = File.basename(path)
8
+ @ext = File.extname(path)
9
+ @content = options[:content] || File.read(@path)
10
+ @version = options[:version]
11
+ end
12
+
13
+ def basic_name
14
+ File.basename(@path, @ext)
15
+ end
16
+
17
+ def content
18
+ @content ||= File.read(@path)
19
+ end
20
+
21
+ def reload!
22
+ @content = File.read(@path)
23
+ end
24
+
25
+ def save!
26
+ end
27
+ end
28
+
29
+ class XMLFileStruct < FileStruct
30
+ def doc
31
+ @doc ||= Nokogiri.XML(@content)
32
+ end
33
+
34
+ def reload!
35
+ super
36
+ @doc = Nokogiri.XML(@content)
37
+ end
38
+
39
+ def save!
40
+ @content = @doc.to_xml(encoding: 'UTF-8', indent: 2)
41
+ end
42
+
43
+ def content
44
+ @content ||= @doc.to_xml(encoding: 'UTF-8', indent: 2)
45
+ end
46
+ end
47
+
48
+ class YAMLFileStruct < FileStruct
49
+ def doc
50
+ @doc ||= YAML.load(@content)
51
+ end
52
+
53
+ def reload!
54
+ super
55
+ @doc = YAML.load(@content)
56
+ end
57
+
58
+ def save!
59
+ @content = @doc.to_yaml
60
+ end
61
+
62
+ def content
63
+ @content ||= @doc.to_yaml
64
+ end
65
+ end
66
+
@@ -0,0 +1,130 @@
1
+ require 'nokogiri'
2
+ require_relative 'file_struct'
3
+ require_relative 'data_mapper'
4
+
5
+ class FileSystemProject
6
+ attr_reader :root, :file_system, :data_map
7
+ attr_accessor :error_log
8
+ alias_method :path, :root
9
+
10
+ def initialize(project_dir, file_system)
11
+ @root = project_dir
12
+ fail(ArgumentError, "Project directory does not exist.") unless File.exist?(@root)
13
+ @file_system = file_system
14
+ @data_map = data_file_exists? ? make_data_accessors(file_system) : nil
15
+ add_data_map_methods if @data_map
16
+ @error_log = {}
17
+ end
18
+
19
+ def add_to_error_log(name, error)
20
+ error_log[name] = error
21
+ end
22
+
23
+ def data_file_exists?
24
+ file_system[:data] and File.exists?(data_file_path)
25
+ end
26
+
27
+ def data_file_path
28
+ File.join(root, file_system[:data][:loc], 'data.xml')
29
+ end
30
+
31
+ def make_data_accessors(file_system)
32
+ raw_data = File.read(data_file_path)
33
+ DataMapper.new(raw_data)
34
+ end
35
+
36
+ def add_data_map_methods
37
+ @data_map.mapper.singleton_methods.each do |meth|
38
+ self.class.send(:define_method, meth) do
39
+ data_map.mapper.send(meth)
40
+ end
41
+ end
42
+ end
43
+
44
+ def method_missing(method, *args)
45
+ if dir = directory_accessor(method)
46
+ get_files(dir)
47
+ elsif dir = directory_adder(method)
48
+ add_file(dir, *args)
49
+ else
50
+ super
51
+ end
52
+ end
53
+
54
+ def data_has?(method)
55
+ data and data_for(method)
56
+ end
57
+
58
+ def data_for(method)
59
+ begin
60
+ data_map.mapper.send(method)
61
+ rescue
62
+ false
63
+ end
64
+ end
65
+
66
+ def directory_accessor(method_name)
67
+ @file_system[:dirs].keys.find { |d| method_name.match(/^#{d}_files$/) }
68
+ end
69
+
70
+ def directory_adder(method_name)
71
+ @file_system[:dirs].keys.find { |d| method_name.match(/^add_#{d}_file$/) }
72
+ end
73
+
74
+ def file_struct(type)
75
+ case type
76
+ when 'xml'
77
+ XMLFileStruct
78
+ when 'yaml'
79
+ YAMLFileStruct
80
+ when 'txt'
81
+ FileStruct
82
+ when 'bin'
83
+ FileStruct
84
+ else
85
+ FileStruct
86
+ end
87
+ end
88
+
89
+ def dir_path(dir)
90
+ File.join(@root, dir)
91
+ end
92
+
93
+ def get_files(dir)
94
+ type = @file_system[:dirs][dir][:type]
95
+ locations = Dir.glob(File.join(dir_path(dir), '/**/*')).reject { |d| File.directory?(d) }
96
+ locations.map do |d|
97
+ opts = @file_system[:dirs][dir][:versions] ? {version: get_version(d)} : {}
98
+ file_struct(type).new(d, opts)
99
+ end
100
+ end
101
+
102
+ def get_version(f)
103
+ File.dirname(f)[/(?<=\/)[^\/]+$/]
104
+ end
105
+
106
+ def add_file(dir, *args)
107
+ fail ArgumentError unless valid_adder_args?(args)
108
+ outdir = File.join(@root, dir)
109
+ ensure_dir_exists(outdir)
110
+ outfile = File.join(outdir, args[1])
111
+ write_and_sync(outfile, args[0])
112
+ end
113
+
114
+ def write_and_sync(file, content)
115
+ out = File.open(file, 'w')
116
+ out.write(content)
117
+ out.fsync
118
+ end
119
+
120
+ def ensure_dir_exists(dir)
121
+ Dir.mkdir(dir) unless File.exist?(dir)
122
+ end
123
+
124
+ def valid_adder_args?(args)
125
+ args.size >= 2 and args[0..1].all? { |a| a.is_a?(String) }
126
+ end
127
+ end
128
+
129
+ module ErrorLogging
130
+ end
metadata ADDED
@@ -0,0 +1,102 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: file_system_project
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Dan Corrigan
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pry
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>'
46
+ - !ruby/object:Gem::Version
47
+ version: 5.0.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>'
53
+ - !ruby/object:Gem::Version
54
+ version: 5.0.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: nokogiri
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description:
70
+ email: dcorrigan@scribenet.com
71
+ executables: []
72
+ extensions: []
73
+ extra_rdoc_files: []
74
+ files:
75
+ - lib/data_mapper.rb
76
+ - lib/file_system_project.rb
77
+ - lib/file_struct.rb
78
+ homepage: http://wfdm.scribenet.com
79
+ licenses: []
80
+ metadata: {}
81
+ post_install_message:
82
+ rdoc_options: []
83
+ require_paths:
84
+ - lib
85
+ - lib
86
+ required_ruby_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ required_rubygems_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ requirements: []
97
+ rubyforge_project:
98
+ rubygems_version: 2.0.14
99
+ signing_key:
100
+ specification_version: 4
101
+ summary: Make a file system project object with accessor methods.
102
+ test_files: []