Skip to content

Commit

Permalink
Add the rest of the functionality, and some cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
olabini committed Apr 3, 2009
1 parent c80d5e7 commit 6094923
Show file tree
Hide file tree
Showing 18 changed files with 187 additions and 320 deletions.
5 changes: 3 additions & 2 deletions TODO
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
- Create a framework for interacting with DataStore
- Create a small framework for interacting with UserService
CSS on stuff
Fix pooling for Rack
Check times

41 changes: 33 additions & 8 deletions app/controllers/blogs_controller.rb
Original file line number Diff line number Diff line change
@@ -1,28 +1,53 @@
class BlogsController < ApplicationController
layout 'blog'
require_admin :new, :create, :remove
require_admin :new_post, :create_post, :create, :remove, :remove_post

def start
@posts = Post.all({}, :limit => 15, :iorder => :created_at)
end

def index
@blogs = Blog.all
end

def blog
@blog = Blog.get(params[:id].to_i)
@blog = Blog.get(params[:id])
@posts = @blog.posts
end

def post
@post = Post.get(params[:post_id])
@blog = @post.blog
end

def remove
Blog.delete(params[:id].to_i)
Blog.delete(params[:id])
redirect_to blogs_url
end

def create
name = params[:name]

blog = Blog.new
blog.name = name
blog.owner = @person
blog.save!
blog = Blog.create :name => name, :owner => @person, :created_at => Time.now

redirect_to blogs_url
end

def new_post
@blog = Blog.get(params[:id])
end

def create_post
@blog = Blog.get(params[:id])
Post.create :title => params[:title], :content => params[:content], :blog => @blog, :created_at => Time.now

redirect_to blog_url(@blog)
end

def remove_post
post = Post.get(params[:id])
blog = post.blog
post.delete!

redirect_to blog_url(blog)
end
end
16 changes: 3 additions & 13 deletions app/models/blog.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,10 @@ class Blog
include Bumble

ds :name, :owner_id, :created_at
belongs_to :owner, Person
# has_many :posts, :Post, :iorder => :created_at

def owner
if self.owner_id
Person.get(self.owner_id)
else
nil
end
end

def owner=(person)
self.owner_id = person.key
end

def posts
[]
Post.all({:blog_id => self.key}, :iorder => :created_at)
end
end
1 change: 1 addition & 0 deletions app/models/person.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ class Person
include Bumble

ds :given_name, :sur_name, :email
# has_many :blogs, Blog
end
7 changes: 1 addition & 6 deletions app/models/post.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,5 @@ class Post
include Bumble

ds :title, :content, :created_at, :blog_id

def blog=(b)
end

def blog
end
belongs_to :blog, Blog
end
9 changes: 7 additions & 2 deletions app/views/blogs/blog.html.erb
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
<h1><%=@blog.name%></h1>

<% @blog.posts.each do |p| %>
<h3><%=p.title%></h3>
<% if @admin %>
<%=link_to "New post", new_post_url(@blog) %><br/>
<% end %>

<% @posts.each do |p| %>
<hr/>
<h3><%=link_to p.title, post_url(@blog, p)%><%= @admin ? " - <i>#{link_to("Remove post", remove_post_url(p), {:method => :post})}</i>" : ""%></h3>
<pre>
<%=p.content%>
</pre>
Expand Down
2 changes: 1 addition & 1 deletion app/views/blogs/index.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

<table cellpadding="0" border="0" cellspacing="0" style="width: 30em">
<% @blogs.each do |b| %>
<tr><td align="left"><%=link_to b.name, blog_url(b.key) %></td><%= @admin ? "<td align=\"right\">#{link_to("Remove blog", remove_blog_url(b.key), {:method => :post})}</td>" : ""%></tr>
<tr><td align="left"><%=link_to b.name, blog_url(b.key) %></td><%= @admin ? "<td align=\"right\">#{link_to("Remove blog", remove_blog_url(b), {:method => :post})}</td>" : ""%></tr>
<% end %>
</table>

Expand Down
8 changes: 8 additions & 0 deletions app/views/blogs/new_post.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<h1>New post</h1>
<p><i>In <%=link_to @blog.name, blog_url(@blog)%></i></p>

<% form_tag create_post_url(@blog) do -%>
<p><%=text_field_tag :title, nil, :size => 50 %></p>
<p><%=text_area_tag :content, nil, :rows => 40, :cols => 70 %></p>
<p><%=submit_tag "Publish post"%></p>
<% end %>
9 changes: 9 additions & 0 deletions app/views/blogs/post.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@

<h1><%=@post.title%></h1>
<p><i>In <%=link_to @blog.name, blog_url(@blog)%></i></p>
<% if @admin %>
<p><i><%=link_to("Remove post", remove_post_url(@post), {:method => :post})%></i></p>
<% end %>
<pre>
<%=@post.content%>
</pre>
10 changes: 10 additions & 0 deletions app/views/blogs/start.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<h1>Latest posts</h1>

<% @posts.each do |p| %>
<hr/>
<h3><%=link_to p.title, post_url(p.blog, p)%><%= @admin ? " - <i>#{link_to("Remove post", remove_post_url(p), {:method => :post})}</i>" : ""%></h3>
<p><i>In <%=link_to p.blog.name, blog_url(p.blog)%></i></p>
<pre>
<%=p.content%>
</pre>
<% end %>
1 change: 1 addition & 0 deletions app/views/layouts/blog.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
<% else %>
<%=link_to "Log in!", BeeU.login(request)%>
<% end -%>
| <%= link_to "Blogs", blogs_url %>
</td>
</tr>
<tr>
Expand Down
7 changes: 5 additions & 2 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,15 @@
# Note: These default routes make all actions in every controller accessible via GET requests. You should
# consider removing the them or commenting them out if you're using named routes and resources.

map.root :controller => "blogs", :action => "index"
map.root :controller => "blogs", :action => "start"
map.blogs 'blogs', :controller => "blogs", :action => "index"
map.create_blog 'blogs/create', :controller => "blogs", :action => "create"
map.remove_blog 'blogs/remove/:id', :controller => "blogs", :action => "remove"
map.new_post 'blog/:id/new', :controller => "blogs", :action => "new_post"
map.create_post 'blog/:id/create', :controller => "blogs", :action => "create_post"
map.blog 'blog/:id', :controller => "blogs", :action => "blog"
# map.post 'blog/:blog_id/:post_id', :controller => "blogs", :action => "post"
map.post 'blog/:blog_id/:post_id', :controller => "blogs", :action => "post"
map.remove_post 'post/:id/remove', :controller => "blogs", :action => "remove_post"

map.connect ':controller/:action/:id'
map.connect ':controller/:action/:id.:format'
Expand Down
2 changes: 1 addition & 1 deletion config/warble.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
config.dirs = %w(app config lib log vendor tmp)

# Additional files/directories to include, above those in config.dirs
config.includes = FileList["appengine-web.xml"]
config.includes = FileList["appengine-web.xml", "datastore-indexes.xml"]

# Additional files/directories to exclude
# config.excludes = FileList["lib/tasks/*"]
Expand Down
8 changes: 8 additions & 0 deletions datastore-indexes.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>

<datastore-indexes autoGenerate="true">
<datastore-index kind="Post" ancestor="false">
<property name="blog_id" direction="asc"/>
<property name="created_at" direction="desc"/>
</datastore-index>
</datastore-indexes>
8 changes: 8 additions & 0 deletions deploy.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#!/bin/sh

jruby -S warble
cd ../tmp/yarbl_web
rm -rf *
jar xf ../../yarbl/yarbl.war
~/Desktop/Secrets/appengine-java-sdk/bin/appcfg.sh update .

95 changes: 86 additions & 9 deletions lib/bumble/bumble.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,38 @@ module Bumble
module DS
import com.google.appengine.api.datastore.DatastoreServiceFactory
import com.google.appengine.api.datastore.Entity
import com.google.appengine.api.datastore.FetchOptions
import com.google.appengine.api.datastore.KeyFactory
import com.google.appengine.api.datastore.Key
import com.google.appengine.api.datastore.EntityNotFoundException
import com.google.appengine.api.datastore.Query
import com.google.appengine.api.datastore.Text
Service = DatastoreServiceFactory.datastore_service
end

module InstanceMethods
def initialize(*args)
super
def initialize(attrs = {}, *args)
super(*args)
@__entity = DS::Entity.new(self.class.name)
attrs.each do |k,v|
self.send "#{k}=", v
end
end

def key
__ds_key.get_id
end

def to_param
self.key
end

def save!
DS::Service.put(@__entity)
end

def delete!
DS::Service.delete(__ds_key)
self.class.delete(self.key)
end

def __ds_key
Expand All @@ -37,18 +46,45 @@ def __ds_key
def __ds_get(name)
name = name.to_s
if @__entity.has_property(name)
@__entity.get_property(name)
ret = @__entity.get_property(name)
if ret.is_a?(DS::Text)
ret.value
else
ret
end
else
nil
end
end

def __ds_set(name, value)
@__entity.set_property(name.to_s, value)
if value.is_a?(String) && value.length > 499
@__entity.set_property(name.to_s, DS::Text.new(value))
else
@__entity.set_property(name.to_s, value)
end
end
end

module ClassMethods
def belongs_to(attr, type)
self.ds "#{attr}_id"
type_name = (type.is_a?(Symbol) || type.is_a?(String)) ? type : type.name
self.class_eval <<DEF
def #{attr}
if self.#{attr}_id
#{type_name}.get(self.#{attr}_id)
else
nil
end
end
def #{attr}=(value)
self.#{attr}_id = value.key
end
DEF
end

# defines zero or more data store attributes - will create attribute accessors for these
def ds(*names)
names.each do |name|
Expand All @@ -65,11 +101,11 @@ def #{name}=(value)
end

def get(key)
create_from_entity(DS::Service.get(DS::KeyFactory.create_key(self.name, key)))
create_from_entity(DS::Service.get(DS::KeyFactory.create_key(self.name, key.to_i)))
end

def delete(key)
DS::Service.delete([DS::KeyFactory.create_key(self.name, key)].to_java(DS::Key))
DS::Service.delete([DS::KeyFactory.create_key(self.name, key.to_i)].to_java(DS::Key))
end

# returns either an object matching the conditions, or nil
Expand All @@ -86,9 +122,50 @@ def find(conditions = {})
result
end
end

def create(attrs = {})
val = new(attrs)
val.save!
val
end

def all(conditions = {})
DS::Service.prepare(DS::Query.new(self.name)).as_iterable.map do |ent|
def all(conditions = {}, options = {})
q = DS::Query.new(self.name)
conditions.each do |k, v|
q = q.add_filter(k.to_s, DS::Query::FilterOperator::EQUAL, v)
end

fo = nil

if options[:limit]
fo = DS::FetchOptions::Builder.with_limit(options[:limit])
end

if options[:offset]
if fo
fo = fo.offset(options[:offset])
else
fo = DS::FetchOptions::Builder.with_limit(options[:offset])
end
end

if options[:order]
q = q.add_sort(options[:order].to_s)
end

if options[:iorder]
q = q.add_sort(options[:iorder].to_s, DS::Query::SortDirection::DESCENDING)
end

$servlet_context.log "doing search: #{q.to_s}"

iter = if fo
DS::Service.prepare(q).as_iterable(fo)
else
DS::Service.prepare(q).as_iterable
end

iter.map do |ent|
create_from_entity(ent)
end
end
Expand Down
4 changes: 2 additions & 2 deletions lib/bumble/simple_tests.rb
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,14 @@ class TestBumbleTwo
t3.save!
k1, k2, k3 = t1.key, t2.key, t3.key

eq TestBumbleTwo.all.map { |tt| tt.key }, [k1,k2,k3]
eq TestBumbleTwo.all.map { |tt| tt.key }.sort, [k1,k2,k3].sort
ensure
begin
TestBumbleTwo.all.each do |ee|
ee.delete!
end
rescue Exception => e
$servlet_context.log(e)
$servlet_context.log(e.inspect)
end
end
end
Expand Down
Loading

0 comments on commit 6094923

Please sign in to comment.