populate-me 0.0.27 → 0.0.32

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c06dba10c3a16aaecd4bff9aa43dd9b85be0253c0f5456a69dd05c6a8d22d9ae
4
+ data.tar.gz: e8b380b450715787fcc60e1d69181cc1d98bed44be5d5a064c2856f481f8e18f
5
+ SHA512:
6
+ metadata.gz: '0905a6876cd39098d7c30fc86f5604abf64d8a75086b267c8b05b098d8f60e4b023461c0a9718ecd5f3f0f46c610437cc7e2ba9f83bd411172344050e331b05c'
7
+ data.tar.gz: ebe75ce21a787a0ba8bec25665089a3b9e5217e88e768f937cabf038b74353b885c6d09a4b6769a65da630f79fc35524eaf76751bcf79299b692f98751e61cde
@@ -0,0 +1,8 @@
1
+ .DS_STORE
2
+ *.swp
3
+ .ruby-version
4
+ pkg/
5
+ *.gem
6
+ Gemfile.lock
7
+ .bundle/
8
+
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
3
+
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2017 Mickael Riga
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
20
+
@@ -76,7 +76,7 @@ module PopulateMe
76
76
  end,
77
77
  :attachment => proc do |m,c,o|
78
78
  deleter = "<input type='checkbox' name='#{o[:input_name]}' class='deleter' value='nil' /> Delete this file<br />" unless m.doc[c].nil?
79
- "%s%s<input type='file' name='%s' id='%s' class='%s' />%s\n" % [m.to_thumb(c), deleter, o[:input_name], m.field_id_for(c), o[:input_class], o[:required]]
79
+ "%s<input type='file' name='%s' id='%s' class='%s' />%s %s\n" % [m.to_thumb(c), o[:input_name], m.field_id_for(c), o[:input_class], o[:required], deleter]
80
80
  end,
81
81
  :select => proc do |m,c,o|
82
82
  # starter ensures it sends something when multiple is empty
@@ -100,13 +100,13 @@ module PopulateMe
100
100
  select_options.each do |op|
101
101
  key,val = op.kind_of?(Array) ? [op[0],op[1]] : [op,op]
102
102
  if key==:optgroup
103
- out << "<optgroup label='%s'>\n" % [val]
103
+ out << "<optgroup label=\"%s\">\n" % [val]
104
104
  elsif key==:closegroup
105
105
  out << "</optgroup>\n"
106
106
  else
107
107
  # Array case is for multiple select
108
108
  selected = 'selected' if (val==o[:input_value] || (o[:input_value].kind_of?(Array)&&o[:input_value].include?(val)))
109
- out << "<option value='%s' %s>%s</option>\n" % [val,selected,key]
109
+ out << "<option value=\"%s\" %s>%s</option>\n" % [val,selected,key]
110
110
  end
111
111
  end
112
112
  end
@@ -188,7 +188,7 @@ module PopulateMe
188
188
  end
189
189
  def dropdown_cache
190
190
  @dropdown_cache ||= self.find({},:fields=>['_id',label_column]).inject([]) do |out,row|
191
- out.push([row.to_label, row.id.to_s, "<option value='#{row.id}' ", ">#{row.to_label}</option>\n"])
191
+ out.push([row.to_label, row.id.to_s, "<option value=\"#{row.id}\" ", ">#{row.to_label}</option>\n"])
192
192
  end
193
193
  end
194
194
  def reset_dropdown_cache; @dropdown_cache = nil; end
@@ -9,8 +9,8 @@ module PopulateMe
9
9
  def self.included(weak)
10
10
  weak.extend(MutateClass)
11
11
  weak.db = DB if defined?(DB)
12
- weak.schema = BSON::OrderedHash.new
13
- weak.relationships = BSON::OrderedHash.new
12
+ weak.schema = {}
13
+ weak.relationships = {}
14
14
  end
15
15
 
16
16
  module MutateClass
@@ -38,6 +38,13 @@ module PopulateMe
38
38
  def find(selector={},opts={})
39
39
  selector.update(opts.delete(:selector)||{})
40
40
  opts = {:sort=>self.sorting_order}.update(opts)
41
+ if opts.key?(:fields)
42
+ opts[:projection] = opts[:fields].inject({}) do |h, f|
43
+ h[f.to_sym] = 1
44
+ h
45
+ end
46
+ opts.delete(:fields)
47
+ end
41
48
  cur = collection.find(selector,opts)
42
49
  cur.instance_variable_set('@mutant_class', self)
43
50
  cur.extend(CursorMutation)
@@ -45,30 +52,36 @@ module PopulateMe
45
52
  def find_one(spec_or_object_id=nil,opts={})
46
53
  spec_or_object_id.nil? ? spec_or_object_id = opts.delete(:selector) : spec_or_object_id.update(opts.delete(:selector)||{})
47
54
  opts = {:sort=>self.sorting_order}.update(opts)
48
- item = collection.find_one(spec_or_object_id,opts)
55
+ item = collection.find(spec_or_object_id,opts).first
49
56
  item.nil? ? nil : self.new(item)
50
57
  end
51
58
  def count(opts={}); collection.count(opts); end
52
59
 
53
60
  def sorting_order
54
61
  @sorting_order ||= if @schema.key?('position')&&!@schema['position'][:scope].nil?
55
- [[@schema['position'][:scope], :asc], ['position', :asc]]
62
+ {@schema['position'][:scope] => 1, 'position' => 1}
56
63
  elsif @schema.key?('position')
57
- [['position', :asc],['_id', :asc]]
64
+ {'position' => 1, '_id' => 1}
58
65
  else
59
- ['_id', :asc]
66
+ {'_id' => 1}
60
67
  end
61
68
  end
62
69
 
63
- def sort(id_list)
64
- id_list.each_with_index do |id, position|
65
- collection.update(ref(id), {'$set' => {'position'=>position}})
70
+ def sort(ids)
71
+ requests = ids.each_with_index.inject([]) do |list, (id, i)|
72
+ list << {update_one:
73
+ {
74
+ filter: ref(id),
75
+ update: {'$set'=>{'position'=>i}}
76
+ }
77
+ }
66
78
  end
79
+ collection.bulk_write requests
67
80
  end
68
81
 
69
82
  # CRUD
70
- def get(id, opts={}); doc = collection.find_one(ref(id), opts); doc.nil? ? nil : self.new(doc); end
71
- def delete(id); collection.remove(ref(id)); end
83
+ def get(id, opts={}); doc = collection.find(ref(id), opts).first; doc.nil? ? nil : self.new(doc); end
84
+ def delete(id); collection.delete_one(ref(id)); end
72
85
 
73
86
  def get_multiple(ids, opts={})
74
87
  corrected_ids = ids.map{|id| correct_id_class(id) }
@@ -169,7 +182,7 @@ module PopulateMe
169
182
  def children_count(k,sel={})
170
183
  k = resolve_class(k)
171
184
  slot_name = sel.delete(:slot_name) || model.foreign_key_name
172
- k.collection.count(:query => {slot_name=>@doc['_id'].to_s}.update(sel))
185
+ k.collection.count({slot_name=>@doc['_id'].to_s}.update(sel))
173
186
  end
174
187
 
175
188
  # CRUD
@@ -181,7 +194,12 @@ module PopulateMe
181
194
 
182
195
  # saving and hooks
183
196
  def new?; @is_new ||= !@doc.key?('_id'); end
184
- def update_doc(fields); @old_doc = @doc.dup; @doc.update(fields); @is_new = false; self; end
197
+ def update_doc(fields)
198
+ @old_doc = @doc.dup
199
+ @doc.update(fields)
200
+ @is_new = false
201
+ self
202
+ end
185
203
  # Getter and setter in one
186
204
  def errors_on(col,message=nil)
187
205
  message.nil? ? @errors[col] : @errors[col] = (@errors[col]||[]) << message
@@ -206,7 +224,7 @@ module PopulateMe
206
224
  next unless model.schema.key?(k)
207
225
  type = k=='_id' ? :primary_key : model.schema[k][:type]
208
226
  fix_method = "fix_type_#{type}"
209
- if v==''
227
+ if v=='' and type!=:attachment
210
228
  default = model.schema[k][:default]
211
229
  @doc[k] = default.is_a?(Proc) ? default.call : default
212
230
  else
@@ -256,16 +274,18 @@ module PopulateMe
256
274
  before_save
257
275
  if new?
258
276
  before_create
259
- id = model.collection.insert(@doc)
260
- @doc['_id'] = id
277
+ result = model.collection.insert_one(@doc)
278
+ if result.ok? and @doc['_id'].nil?
279
+ @doc['_id'] = result.inserted_id
280
+ end
261
281
  after_create
262
282
  else
263
283
  before_update
264
- id = model.collection.update({'_id'=>@doc['_id']}, @doc)
284
+ result = model.collection.update_one({'_id'=>@doc['_id']}, @doc)
265
285
  after_update
266
286
  end
267
287
  after_save
268
- id.nil? ? nil : self
288
+ result.ok? ? self : nil
269
289
  end
270
290
  def before_save; end
271
291
  def before_create; end
@@ -283,9 +303,16 @@ module PopulateMe
283
303
  # so we should extend on demand.
284
304
  # Meaning the cursor object should be extended, not the cursor class.
285
305
  # @mutant_class should be defined before extending
286
- def next
287
- n = super
288
- n.nil? ? nil : @mutant_class.new(n)
306
+ #
307
+ # def next
308
+ # n = super
309
+ # n.nil? ? nil : @mutant_class.new(n)
310
+ # end
311
+ #
312
+ def each
313
+ super do |doc|
314
+ yield @mutant_class.new(doc)
315
+ end if block_given?
289
316
  end
290
317
  # legacy
291
318
  def each_mutant(&b); each(&b); end
@@ -45,8 +45,14 @@ module PopulateMe
45
45
  delete_files_for(k) unless new?
46
46
  @temp_attachments ||= {}
47
47
  @temp_attachments[k] = v
48
- attachment_id = model.gridfs.put(v[:tempfile], {:filename=>v[:filename], :content_type=>v[:type]})
48
+ attachment_id = model.gridfs.upload_from_stream(
49
+ v[:filename],
50
+ v[:tempfile], {
51
+ :content_type=>v[:type]
52
+ })
49
53
  @doc[k] = {'original'=>attachment_id}
54
+ else # Untouched
55
+ @doc[k] = @old_doc[k]
50
56
  end
51
57
  end
52
58
 
@@ -80,17 +86,17 @@ module PopulateMe
80
86
  def convert(col, convert_steps, style)
81
87
  return if @doc[col].nil?
82
88
  if @temp_attachments.nil? || @temp_attachments[col].nil?
83
- f = model.gridfs.get(@doc[col]['original']) rescue nil
89
+ f = model.gridfs.find({'_id'=>@doc[col]['original']}).first
84
90
  return if f.nil?
85
- return unless f.content_type[/^image\//]
86
91
  src = Tempfile.new('MongoStash_src')
87
92
  src.binmode
88
- src.write(f.read(4096)) until f.eof?
93
+ model.gridfs.download_to_stream(@doc[col]['original'], src)
94
+ return unless f['contentType'].to_s[/^image\//]
89
95
  src.close
90
96
  @temp_attachments ||= {}
91
97
  @temp_attachments[col] ||= {}
92
98
  @temp_attachments[col][:tempfile] = src
93
- @temp_attachments[col][:type] = f.content_type
99
+ @temp_attachments[col][:type] = f['contentType']
94
100
  else
95
101
  return unless @temp_attachments[col][:type][/^image\//]
96
102
  src = @temp_attachments[col][:tempfile]
@@ -107,9 +113,13 @@ module PopulateMe
107
113
  dest.close
108
114
  system "convert \"#{src.path}\" #{convert_steps} \"#{dest.path}\""
109
115
  filename = "#{model.name}/#{self.id}/#{style}"
110
- attachment_id = model.gridfs.put(dest.open, {:filename=>filename, :content_type=>content_type})
116
+ attachment_id = model.gridfs.upload_from_stream(
117
+ filename,
118
+ dest.open,
119
+ {:content_type=>content_type}
120
+ )
111
121
  @doc[col] = @doc[col].update({style=>attachment_id})
112
- model.collection.update({'_id'=>@doc['_id']}, @doc)
122
+ model.collection.update_one({'_id'=>@doc['_id']}, @doc)
113
123
  #src.close!
114
124
  dest.close!
115
125
  end
@@ -138,7 +148,7 @@ module PopulateMe
138
148
  next if old_hash==fixed_hash
139
149
 
140
150
  if for_real
141
- c.collection.update({'_id'=>e.id}, {'$set'=>fixed_hash})
151
+ c.collection.update_one({'_id'=>e.id}, {'$set'=>fixed_hash})
142
152
  else
143
153
  puts old_hash.inspect
144
154
  puts fixed_hash.inspect
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'populate-me'
3
- s.version = "0.0.27"
3
+ s.version = '0.0.32'
4
4
  s.platform = Gem::Platform::RUBY
5
5
  s.summary = "ALPHA !!! Populate Me is relatively complete but simple CMS"
6
6
  s.description = "ALPHA !!! Populate Me is relatively complete but simple CMS. It includes a Rack middleware for putting in your Rack stack, and a bespoke MongoDB ODM. But Populate Me is not really finished yet."
@@ -9,7 +9,16 @@ Gem::Specification.new do |s|
9
9
  s.author = "Mickael Riga"
10
10
  s.email = "mig@mypeplum.com"
11
11
  s.homepage = "https://github.com/mig-hub/populate-me"
12
- s.add_dependency('rack-golem')
13
- s.add_dependency('json')
12
+ s.licenses = ['MIT']
13
+
14
+ s.add_dependency 'rack-golem', '~> 0'
15
+ s.add_dependency 'json', '~> 2.1'
16
+ s.add_dependency 'mongo', '~> 2.0'
17
+
18
+ s.add_development_dependency 'bundler', '~> 1.13'
19
+ s.add_development_dependency 'bacon', '~> 1.2'
20
+ s.add_development_dependency 'rack-test', '~> 0.6'
21
+ s.add_development_dependency 'racksh', '~> 1.0'
22
+
14
23
  end
15
24
 
@@ -26,3 +26,4 @@ describe 'String' do
26
26
  end
27
27
  end
28
28
  end
29
+
@@ -8,12 +8,12 @@ require 'rack/utils'
8
8
  $:.unshift './lib'
9
9
  require 'populate_me/mongo'
10
10
 
11
- MONGO = ::Mongo::MongoClient.new
11
+ MONGO = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test-mongo-mutation')
12
12
  class NoDB
13
13
  include PopulateMe::Mongo::Plug
14
14
  def self.human_name; 'No DB'; end
15
15
  end
16
- DB = MONGO['test-mongo-mutation']
16
+ DB = MONGO.database
17
17
 
18
18
  class Naked; include PopulateMe::Mongo::Plug; end
19
19
 
@@ -54,21 +54,21 @@ describe "PopulateMe::Mongo::Mutation" do
54
54
  end
55
55
  end
56
56
 
57
- shared "Empty BSON" do
58
- it "Should be set to an empty BSON ordered hash by default" do
59
- @bson.class.should==::BSON::OrderedHash
57
+ shared "Empty Hash" do
58
+ it "Should be set to an empty hash by default" do
59
+ @bson.class.should==Hash
60
60
  @bson.empty?.should==true
61
61
  end
62
62
  end
63
63
 
64
64
  describe ".schema" do
65
65
  before { @bson = Naked.schema }
66
- behaves_like "Empty BSON"
66
+ behaves_like "Empty Hash"
67
67
  end
68
68
 
69
69
  describe ".relationships" do
70
70
  before { @bson = Naked.relationships }
71
- behaves_like "Empty BSON"
71
+ behaves_like "Empty Hash"
72
72
  end
73
73
 
74
74
  describe ".human_name" do
@@ -102,9 +102,14 @@ describe "PopulateMe::Mongo::Mutation" do
102
102
  BSON::ObjectId.legal?(string_id).should==true
103
103
  Address.ref(string_id).should=={'_id'=>BSON::ObjectId.from_string(string_id)}
104
104
  end
105
+ it 'Makes a selector for multiple docs if argument is an Array' do
106
+ Address.ref([]).should=={'_id'=>{'$in'=>[]}}
107
+ id = BSON::ObjectId.new
108
+ string_id = '000000000000000000000000'
109
+ Address.ref([id,string_id]).should=={'_id'=>{'$in'=>[id,BSON::ObjectId.from_string(string_id)]}}
110
+ end
105
111
  it 'Just put an empty string in selector for any invalid argument' do
106
112
  Address.ref('abc').should=={'_id'=>''}
107
- Address.ref([]).should=={'_id'=>''}
108
113
  end
109
114
  end
110
115
 
@@ -262,11 +267,13 @@ describe "PopulateMe::Mongo::Mutation" do
262
267
  describe 'CursorMutation' do
263
268
  it 'Should give the correct class of object on iterations' do
264
269
  Address.new('body'=>'42').save
265
- Address.find.to_a[0].model.name.should=='Address'
270
+ Address.find.each do |a|
271
+ a.model.name.should=='Address'
272
+ end
266
273
  end
267
274
  end
268
275
 
269
276
  end
270
277
 
271
- MONGO.drop_database('test-mongo-mutation')
278
+ DB.drop
272
279
 
metadata CHANGED
@@ -1,48 +1,113 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: populate-me
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.27
5
- prerelease:
4
+ version: 0.0.32
6
5
  platform: ruby
7
6
  authors:
8
7
  - Mickael Riga
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2016-04-19 00:00:00.000000000 Z
11
+ date: 2020-06-03 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rack-golem
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: json
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - "~>"
36
32
  - !ruby/object:Gem::Version
37
- version: '0'
33
+ version: '2.1'
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - "~>"
44
39
  - !ruby/object:Gem::Version
45
- version: '0'
40
+ version: '2.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: mongo
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.13'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.13'
69
+ - !ruby/object:Gem::Dependency
70
+ name: bacon
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.2'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.2'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rack-test
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.6'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.6'
97
+ - !ruby/object:Gem::Dependency
98
+ name: racksh
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.0'
46
111
  description: ALPHA !!! Populate Me is relatively complete but simple CMS. It includes
47
112
  a Rack middleware for putting in your Rack stack, and a bespoke MongoDB ODM. But
48
113
  Populate Me is not really finished yet.
@@ -51,6 +116,9 @@ executables: []
51
116
  extensions: []
52
117
  extra_rdoc_files: []
53
118
  files:
119
+ - ".gitignore"
120
+ - Gemfile
121
+ - LICENSE
54
122
  - README.md
55
123
  - lib/populate_me/control.rb
56
124
  - lib/populate_me/control/_public/css/main.css
@@ -98,27 +166,26 @@ files:
98
166
  - test/spec_ext.rb
99
167
  - test/spec_mongo_mutation.rb
100
168
  homepage: https://github.com/mig-hub/populate-me
101
- licenses: []
169
+ licenses:
170
+ - MIT
171
+ metadata: {}
102
172
  post_install_message:
103
173
  rdoc_options: []
104
174
  require_paths:
105
- - ./lib
175
+ - "./lib"
106
176
  required_ruby_version: !ruby/object:Gem::Requirement
107
- none: false
108
177
  requirements:
109
- - - ! '>='
178
+ - - ">="
110
179
  - !ruby/object:Gem::Version
111
180
  version: '0'
112
181
  required_rubygems_version: !ruby/object:Gem::Requirement
113
- none: false
114
182
  requirements:
115
- - - ! '>='
183
+ - - ">="
116
184
  - !ruby/object:Gem::Version
117
185
  version: '0'
118
186
  requirements: []
119
- rubyforge_project:
120
- rubygems_version: 1.8.23
187
+ rubygems_version: 3.0.3
121
188
  signing_key:
122
- specification_version: 3
189
+ specification_version: 4
123
190
  summary: ALPHA !!! Populate Me is relatively complete but simple CMS
124
191
  test_files: []