populate-me 0.0.27 → 0.0.32

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []