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 +7 -0
- data/lib/data_mapper.rb +36 -0
- data/lib/file_struct.rb +66 -0
- data/lib/file_system_project.rb +130 -0
- metadata +102 -0
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
|
data/lib/data_mapper.rb
ADDED
@@ -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
|
data/lib/file_struct.rb
ADDED
@@ -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: []
|