file_system_project 0.0.1

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