yarii-content-model 0.1.1 → 0.1.2

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
  SHA256:
3
- metadata.gz: 1077ab034fdf4c9d1bb0e81e441034573a48fa2c1c1907dfcc23123db48375f2
4
- data.tar.gz: 61203f7d66445dda0765b88b23c370bd839749f60ae0037d2da8527604527102
3
+ metadata.gz: e14fc98612d9fbb29d8fae96d8a006ffaa8fde3e963280a4febaa116bd1cd031
4
+ data.tar.gz: c49b39d476a5495c57d624c18723491ba8ba5797578ac227e98a69e8ecdc294e
5
5
  SHA512:
6
- metadata.gz: 4dacb9420563487b2fbe64ec773c9bddbf6c63f63063b29a3e91ca01b3ce4df10b8773fe59d19a056f938c0b242d6cfcac703fe989a530357436256c23897ade
7
- data.tar.gz: 6b2f4a08a63c756d68d6b929e237ff38413b1bcaa6dd15045870346458a57b509dbbf703d6b4d330efec497a15928a979914ddb4c70575d9f094dd2c21429b3c
6
+ metadata.gz: 376f680ef0f239f21d50f0b3f55c743e61b591d586eedaaff2e133c58bef844f7b34802818944eb16659f796c93036ee26ade1f349eafb67581f8e14609b3628
7
+ data.tar.gz: 6db67e209966477c0f07f973bdd0c0f6a5097511696d93e213cb086430fd42411eecc0f937d82de5bc2b0a20834513d113eb7878e0ee1b17edf354276f517d6c
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ Gemfile.lock
2
+ .bundle/
3
+ log/*.log
4
+ pkg/
5
+ test/dummy/db/*.sqlite3
6
+ test/dummy/db/*.sqlite3-journal
7
+ test/dummy/log/*.log
8
+ test/dummy/tmp/
9
+ test/tmp/
10
+ .ruby-version
data/Gemfile ADDED
@@ -0,0 +1,14 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Declare your gem's dependencies in yarii_platform.gemspec.
4
+ # Bundler will treat runtime dependencies like base dependencies, and
5
+ # development dependencies will be added by default to the :development group.
6
+ gemspec
7
+
8
+ # Declare any dependencies that are still in development here instead of in
9
+ # your gemspec. These might include edge Rails or gems from your path or
10
+ # Git. Remember to move these dependencies to your gemspec before releasing
11
+ # your gem to rubygems.org.
12
+
13
+ # To use a debugger
14
+ # gem 'byebug', group: [:development, :test]
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2019 Whitefusion
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,9 @@
1
+ # Yarii::ContentModel
2
+
3
+ Provides an ActiveRecord-like method of loading and saving static content files (from Jekyll, Hugo, etc.)
4
+
5
+ Extracted and enhanced based on running production code.
6
+
7
+ Brought to you by [Whitefusion](https://whitefusion.io)
8
+
9
+ (Still WIP — stay tuned for the official release!)
data/Rakefile ADDED
@@ -0,0 +1,38 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'YariiContentModel'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.md')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ # Disabling for now
18
+ #APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
19
+ #load 'rails/tasks/engine.rake'
20
+
21
+
22
+ #load 'rails/tasks/statistics.rake'
23
+
24
+
25
+
26
+ Bundler::GemHelper.install_tasks
27
+
28
+ require 'rake/testtask'
29
+
30
+ Rake::TestTask.new(:test) do |t|
31
+ t.libs << 'lib'
32
+ t.libs << 'test'
33
+ t.pattern = 'test/**/*_test.rb'
34
+ t.verbose = false
35
+ end
36
+
37
+
38
+ task default: :test
@@ -0,0 +1,265 @@
1
+ require 'safe_yaml'
2
+ require 'fileutils'
3
+ require 'rake'
4
+
5
+ class Yarii::ContentModel
6
+ include ActiveModel::Model
7
+ extend ActiveModel::Callbacks
8
+ define_model_callbacks :save, :destroy
9
+
10
+ include Yarii::Serializers::YAML
11
+ extend Yarii::VariableDefinitions
12
+ extend Yarii::FilePathDefinitions
13
+
14
+ # override in ApplicationContentModel
15
+ class_attribute :base_path, instance_accessor: false, default: ""
16
+
17
+ # override in subclass model
18
+ class_attribute :folder_path, instance_accessor: false, default: ""
19
+
20
+ class_attribute :variable_names, instance_accessor: false, default: []
21
+
22
+ attr_accessor :file_path, :content
23
+
24
+ # code snippet from Jekyll
25
+ YAML_FRONT_MATTER_REGEXP = %r!\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)!m
26
+ CHECK_BASE_64_REGEXP = /^([A-Za-z0-9+\/]{4})*([A-Za-z0-9+\/]{4}|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{2}==)$/
27
+ PAGINATION_SIZE = 12
28
+
29
+ def self.find(file_path)
30
+ raise "Missing base path for the #{self.name} content model" if self.base_path.blank?
31
+
32
+ # decode Base64 path if necessary
33
+ if CHECK_BASE_64_REGEXP.match file_path
34
+ file_path = Base64::decode64 file_path
35
+ end
36
+
37
+ file_path = absolute_path(file_path)
38
+
39
+ new(file_path: file_path).tap do |content_model|
40
+ content_model.load_file_from_path
41
+ end
42
+ end
43
+
44
+ def self.absolute_path(path)
45
+ sanitize_filepath File.join(self.base_path, self.folder_path, path)
46
+ end
47
+
48
+ def self.sanitize_filepath(path)
49
+ if path.include? "../"
50
+ # TODO: output better error message ;)
51
+ raise "Nice try, Hacker Dude. You lose."
52
+ end
53
+
54
+ path
55
+ end
56
+
57
+ def self.all(sorted: true, order_by: :posted_datetime, order_direction: :desc, subfolder: nil)
58
+ raise "Missing base path for the #{self.name} content model" if self.base_path.blank?
59
+
60
+ if self.folder_path.present?
61
+ # find all content files in the folder and any direct subfolders
62
+ glob_pattern = File.join(self.base_path, self.folder_path, subfolder.to_s, "**/*.{md,markdown,html}")
63
+
64
+ files = Dir.glob(glob_pattern)
65
+ else
66
+ # find any content files not in special underscore folders
67
+ files = Rake::FileList.new(
68
+ File.join(self.base_path, "**/*.md"),
69
+ File.join(self.base_path, "**/*.markdown"),
70
+ File.join(self.base_path, "**/*.html")
71
+ ) do |fl|
72
+ basename = Pathname.new(self.base_path).basename.sub(/^_/, '')
73
+ fl.exclude(/#{basename}\/\_/)
74
+ end
75
+ end
76
+
77
+ models = files.map do |file_path|
78
+ unless File.directory? file_path
79
+ new(file_path: file_path).tap do |content_model|
80
+ content_model.load_file_from_path
81
+ end
82
+ end
83
+ end.compact
84
+
85
+ if sorted
86
+ models.sort_by! do |content_model|
87
+ content_model.send(order_by)
88
+ end
89
+ order_direction == :desc ? models.reverse : models
90
+ else
91
+ models
92
+ end
93
+ end
94
+
95
+ def save
96
+ run_callbacks :save do
97
+ if file_path.blank?
98
+ self.file_path = generate_new_file_path
99
+ end
100
+
101
+ # Create folders if necessary
102
+ dir = File.dirname(file_path)
103
+ unless File.directory?(dir)
104
+ FileUtils.mkdir_p(dir)
105
+ end
106
+
107
+ File.open(file_path, 'w') do |f|
108
+ f.write(generate_file_output)
109
+ end
110
+
111
+ true
112
+ end
113
+ end
114
+
115
+ def destroy
116
+ run_callbacks :destroy do
117
+ if persisted?
118
+ File.delete(file_path)
119
+ self.file_path = nil
120
+
121
+ true
122
+ end
123
+ end
124
+ end
125
+
126
+ def id
127
+ if persisted?
128
+ Base64.encode64(relative_path).strip
129
+ end
130
+ end
131
+
132
+ def relative_path
133
+ relative_base = File.join(self.class.base_path, self.class.folder_path)
134
+ file_path.sub(/^#{relative_base}/, '')
135
+ end
136
+
137
+ def persisted?
138
+ file_path.present? && File.exist?(file_path)
139
+ end
140
+ def new_record?
141
+ !persisted?
142
+ end
143
+
144
+ def file_name
145
+ file_path&.split('/')&.last
146
+ end
147
+
148
+ def file_stat
149
+ if persisted?
150
+ @file_stat ||= File.stat(file_path)
151
+ end
152
+ end
153
+
154
+ def posted_datetime
155
+ if variable_names.include?(:date) && date
156
+ date.to_datetime
157
+ elsif matched = file_name.to_s.match(/^[0-9]+-[0-9]+-[0-9]+/)
158
+ matched[0].to_datetime
159
+ elsif persisted?
160
+ file_stat.mtime
161
+ end
162
+ end
163
+
164
+ def will_be_published?
165
+ return false if respond_to?(:published) and published === false
166
+ return false if respond_to?(:draft) and draft
167
+ true
168
+ end
169
+
170
+ def generate_new_file_path
171
+ # NOTE: this can totally be subclassed by various content models…
172
+
173
+ if use_date = date && date.to_datetime
174
+ date_prefix = "#{use_date.strftime('%Y-%m-%d')}-"
175
+ else
176
+ date_prefix = "#{Date.current.strftime('%Y-%m-%d')}-"
177
+ end
178
+
179
+ slug = if title
180
+ title.gsub(/['|"]/,'').parameterize
181
+ else
182
+ "untitled_#{self.class.name.parameterize}"
183
+ end
184
+
185
+ self.class.absolute_path("#{date_prefix}#{slug}.md")
186
+ end
187
+
188
+ def generate_file_output
189
+ # NOTE: this can totally be subclassed by various content models…
190
+
191
+ as_yaml + "---\n\n" + content.to_s
192
+ end
193
+
194
+ def variable_names
195
+ @variable_names ||= self.class.variable_names&.dup || []
196
+ end
197
+
198
+ def attributes
199
+ ret = {}
200
+ variable_names.each do |var_name|
201
+ ret[var_name.to_s] = send(var_name.to_sym)
202
+ end
203
+ ret
204
+ end
205
+
206
+ def assign_attributes(new_attributes)
207
+ # Changed from Active Model
208
+ # (we implement our own method of assigning attributes)
209
+
210
+ if !new_attributes.respond_to?(:stringify_keys)
211
+ raise ArgumentError, "When assigning attributes, you must pass a hash as an argument."
212
+ end
213
+ return if new_attributes.empty?
214
+
215
+ attributes = new_attributes.stringify_keys
216
+ update_variables(sanitize_for_mass_assignment(attributes))
217
+ end
218
+
219
+ def update_variables(hash)
220
+ hash.each do |key, value|
221
+ begin
222
+ send("#{key}=", value)
223
+ rescue NoMethodError
224
+ Rails.logger.warn (":#{key}: is not a defined front matter variable, will be available as read-only")
225
+
226
+ # If an unfamiliar variable is present, allow it to be set as a
227
+ # read-only value for future serialization, but it still can't be set
228
+ # via an accessor writer. Kind ugly code, but it works
229
+ instance_variable_set("@#{key}", value)
230
+ unless key.to_sym.in? variable_names
231
+ variable_names << key.to_sym
232
+ define_singleton_method key.to_sym do
233
+ instance_variable_get("@#{key}")
234
+ end
235
+ end
236
+ end
237
+ end
238
+ end
239
+
240
+ def load_file_from_path
241
+ file_data = File.read(file_path)
242
+
243
+ loaded_variables = {}
244
+
245
+ begin
246
+ if file_data =~ YAML_FRONT_MATTER_REGEXP
247
+ self.content = $'
248
+ loaded_variables = ::SafeYAML.load(Regexp.last_match(1))
249
+ end
250
+ rescue SyntaxError => e
251
+ Rails.logger.error "Error: YAML Exception reading #{file_path}: #{e.message}"
252
+ end
253
+
254
+ if loaded_variables.present?
255
+ update_variables(loaded_variables)
256
+ end
257
+ end
258
+
259
+
260
+ def as_json(options={})
261
+ options[:except] = (options[:except] || []) + ["variable_names"]
262
+ super(options)
263
+ end
264
+
265
+ end
@@ -0,0 +1,255 @@
1
+ require 'safe_yaml'
2
+ require 'fileutils'
3
+ require 'rake'
4
+
5
+ class Yarii::DatafileModel
6
+ include ActiveModel::Model
7
+ extend ActiveModel::Callbacks
8
+ define_model_callbacks :save, :destroy
9
+
10
+ include Yarii::Serializers::YAML
11
+ extend Yarii::VariableDefinitions
12
+ extend Yarii::FilePathDefinitions
13
+
14
+ # override in ApplicationContentModel
15
+ class_attribute :base_path, instance_accessor: false, default: ""
16
+
17
+ # override in subclass model
18
+ class_attribute :folder_path, instance_accessor: false, default: ""
19
+
20
+ class_attribute :variable_names, instance_accessor: false, default: []
21
+
22
+ attr_accessor :file_path, :key_path
23
+
24
+ # code snippet from Jekyll
25
+ CHECK_BASE_64_REGEXP = /^([A-Za-z0-9+\/]{4})*([A-Za-z0-9+\/]{4}|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{2}==)$/
26
+ PAGINATION_SIZE = 12
27
+
28
+ def self.find(file_path, key_path)
29
+ raise "Missing base path for the #{self.name} content model" if self.base_path.blank?
30
+
31
+ # decode Base64 path if necessary
32
+ if CHECK_BASE_64_REGEXP.match file_path
33
+ file_path = Base64::decode64 file_path
34
+ end
35
+
36
+ file_path = absolute_path(file_path)
37
+
38
+ new(file_path: file_path, key_path: key_path).tap do |content_model|
39
+ content_model.load_file_from_path
40
+ end
41
+ end
42
+
43
+ def self.absolute_path(path)
44
+ sanitize_filepath File.join(self.base_path, self.folder_path, path)
45
+ end
46
+
47
+ def self.sanitize_filepath(path)
48
+ if path.include? "../"
49
+ # TODO: output better error message ;)
50
+ raise "Nice try, Hacker Dude. You lose."
51
+ end
52
+
53
+ path
54
+ end
55
+
56
+ def self.all(file_path)
57
+ raise "Missing base path for the #{self.name} content model" if self.base_path.blank?
58
+
59
+ if CHECK_BASE_64_REGEXP.match file_path
60
+ file_path = Base64::decode64 file_path
61
+ end
62
+
63
+ file_path = absolute_path(file_path)
64
+
65
+ file_data = File.read(file_path)
66
+
67
+ loaded_variables = {}
68
+
69
+ yaml_data = nil
70
+
71
+ begin
72
+ yaml_data = ::SafeYAML.load(file_data)
73
+ end
74
+
75
+ if yaml_data.nil?
76
+ raise "YAML wasn't loadable"
77
+ end
78
+
79
+ models = []
80
+
81
+ if yaml_data.is_a? Array
82
+ yaml_data.each_with_index do |item, index|
83
+ models << new(file_path: file_path, key_path: index.to_s).tap do |content_model|
84
+ content_model.load_file_from_path
85
+ end
86
+ end
87
+ else
88
+ yaml_data = ActiveSupport::HashWithIndifferentAccess.new(yaml_data)
89
+ yaml_data.keys.each do |key|
90
+ models << new(file_path: file_path, key_path: key.to_s).tap do |content_model|
91
+ content_model.load_file_from_path
92
+ end
93
+ end
94
+ end
95
+
96
+ models
97
+ end
98
+
99
+ def save
100
+ run_callbacks :save do
101
+ if file_path.blank?
102
+ raise "Must supply a file path to save to"
103
+ end
104
+
105
+ file_data = File.read(file_path)
106
+
107
+ loaded_variables = {}
108
+
109
+ yaml_data = nil
110
+
111
+ begin
112
+ yaml_data = ::SafeYAML.load(file_data)
113
+ end
114
+
115
+ if yaml_data.nil?
116
+ raise "YAML wasn't loadable"
117
+ end
118
+
119
+ final_data = nil
120
+
121
+ if yaml_data.is_a? Array
122
+ yaml_data.set_keypath(key_path, as_yaml(as_hash: true))
123
+ final_data = yaml_data.to_yaml
124
+ else
125
+ yaml_data = ActiveSupport::HashWithIndifferentAccess.new(yaml_data)
126
+ yaml_data.set_keypath(key_path, as_yaml(as_hash: true))
127
+ final_data = yaml_data.to_hash.to_yaml
128
+ end
129
+
130
+ final_data.sub!(/^---$\n/,'') # strip off the leading dashes
131
+
132
+ File.open(file_path, 'w') do |f|
133
+ f.write(final_data)
134
+ end
135
+
136
+ # TODO: figure out a better way to hook in repo updates
137
+ # Yarii::Repository.current&.add(file_path_to_use)
138
+
139
+ true
140
+ end
141
+ end
142
+
143
+ def destroy
144
+ # TODO: what does it mean to destroy a keypath?
145
+ raise "TBD"
146
+ run_callbacks :destroy do
147
+ if persisted?
148
+ File.delete(file_path)
149
+ # TODO: figure out a better way to hook in repo updates
150
+ # Yarii::Repository.current&.remove(file_path)
151
+ self.file_path = nil
152
+
153
+ true
154
+ end
155
+ end
156
+ end
157
+
158
+ def id
159
+ if persisted?
160
+ relative_base = File.join(self.class.base_path, self.class.folder_path)
161
+ relative_path = file_path.sub(/^#{relative_base}/, '')
162
+ Base64.encode64(relative_path).strip
163
+ end
164
+ end
165
+
166
+ def persisted?
167
+ file_path.present? && File.exist?(file_path)
168
+ end
169
+ def new_record?
170
+ !persisted?
171
+ end
172
+
173
+ def file_name
174
+ file_path&.split('/')&.last
175
+ end
176
+
177
+ def file_stat
178
+ if persisted?
179
+ @file_stat ||= File.stat(file_path)
180
+ end
181
+ end
182
+
183
+ def posted_datetime
184
+ if variable_names.include?(:date) && date
185
+ date.to_datetime
186
+ elsif persisted?
187
+ file_stat.mtime
188
+ end
189
+ end
190
+
191
+ def variable_names
192
+ @variable_names ||= self.class.variable_names&.dup || []
193
+ end
194
+
195
+ def attributes
196
+ ret = {}
197
+ variable_names.each do |var_name|
198
+ ret[var_name.to_s] = nil
199
+ end
200
+ ret
201
+ end
202
+
203
+ def assign_attributes(new_attributes)
204
+ # Changed from Active Model
205
+ # (we implement our own method of assigning attributes)
206
+
207
+ if !new_attributes.respond_to?(:stringify_keys)
208
+ raise ArgumentError, "When assigning attributes, you must pass a hash as an argument."
209
+ end
210
+ return if new_attributes.empty?
211
+
212
+ attributes = new_attributes.stringify_keys
213
+ update_variables(sanitize_for_mass_assignment(attributes))
214
+ end
215
+
216
+ def update_variables(hash)
217
+ hash.each do |key, value|
218
+ begin
219
+ send("#{key}=", value)
220
+ rescue NoMethodError
221
+ Rails.logger.warn (":#{key}: is not a defined front matter variable, will be available as read-only")
222
+
223
+ # If an unfamiliar variable is present, allow it to be set as a
224
+ # read-only value for future serialization, but it still can't be set
225
+ # via an accessor writer. Kind ugly code, but it works
226
+ instance_variable_set("@#{key}", value)
227
+ unless key.to_sym.in? variable_names
228
+ variable_names << key.to_sym
229
+ define_singleton_method key.to_sym do
230
+ instance_variable_get("@#{key}")
231
+ end
232
+ end
233
+ end
234
+ end
235
+ end
236
+
237
+ def load_file_from_path
238
+ raise "Missing keypath" if key_path.nil?
239
+ file_data = File.read(file_path)
240
+
241
+ loaded_variables = {}
242
+
243
+ begin
244
+ yaml_data = ::SafeYAML.load(file_data)
245
+ loaded_variables = yaml_data.value_at_keypath(key_path)
246
+ rescue SyntaxError => e
247
+ Rails.logger.error "Error: YAML Exception reading #{file_path}: #{e.message}"
248
+ end
249
+
250
+ if loaded_variables.present?
251
+ update_variables(loaded_variables)
252
+ end
253
+ end
254
+
255
+ end
@@ -1,3 +1,3 @@
1
1
  module YariiContentModel
2
- VERSION = '0.1.1'
2
+ VERSION = '0.1.2'
3
3
  end
@@ -0,0 +1,25 @@
1
+ $:.push File.expand_path("../lib", __FILE__)
2
+
3
+ # Maintain your gem's version:
4
+ require "yarii-content-model/version"
5
+
6
+ # Describe your gem and declare its dependencies:
7
+ Gem::Specification.new do |s|
8
+ s.name = "yarii-content-model"
9
+ s.version = YariiContentModel::VERSION
10
+ s.authors = ["Jared White"]
11
+ s.email = ["jared@jaredwhite.com"]
12
+ s.homepage = "https://whitefusion.io"
13
+ s.summary = "Provides an ActiveRecord-like method of loading and saving static content files (from Bridgetown, Jekyll, etc.)"
14
+ s.description = s.summary
15
+ s.license = "MIT"
16
+
17
+ s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r!^(test|script|spec|features)/!) }
18
+
19
+ s.add_dependency "rails", ">= 5.0", "< 7.0"
20
+ s.add_dependency 'safe_yaml', '~> 1.0'
21
+ s.add_dependency 'key_path', '~> 1.2'
22
+ s.add_dependency 'git', '~> 1.3'
23
+
24
+ s.add_development_dependency "rspec-rails", "3.8.2"
25
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yarii-content-model
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jared White
@@ -94,11 +94,19 @@ executables: []
94
94
  extensions: []
95
95
  extra_rdoc_files: []
96
96
  files:
97
+ - ".gitignore"
98
+ - Gemfile
99
+ - LICENSE
100
+ - README.md
101
+ - Rakefile
102
+ - app/models/yarii/content_model.rb
103
+ - app/models/yarii/datafile_model.rb
97
104
  - lib/content_model_mixins.rb
98
105
  - lib/tasks/yarii_content_model_tasks.rake
99
106
  - lib/yarii-content-model.rb
100
107
  - lib/yarii-content-model/engine.rb
101
108
  - lib/yarii-content-model/version.rb
109
+ - yarii-content-model.gemspec
102
110
  homepage: https://whitefusion.io
103
111
  licenses:
104
112
  - MIT