Skip to content

Instantly share code, notes, and snippets.

@Asher-
Created October 14, 2010 01:59
Show Gist options
  • Save Asher-/625399 to your computer and use it in GitHub Desktop.
Save Asher-/625399 to your computer and use it in GitHub Desktop.
website :open_source_publishing do |prototype|
agents :users, :groups, :admins, :superusers
default_agent :non_user
root :index do |site_map|
# make a forum at /forum
plugin :forum, 'forum'
end
get :index do
page_class RPWeb::Page
content_class OpenSourcePublishing
view :index
end
plugin :forum do
end
# post :url_name
# put :url_name
# delete :url_name
# any :url_name
# resource :url_name
end
agent :non_user do |interface|
can do |privileges|
perform :register
end
end
agent :user do |interface|
has :login_info, :username, :password, :email_address, :snailmail_address
actions :login, :logout
answers :logged_in?, :owns?, :belongs_to?, :can_access?
can do |privileges|
create :group
perform :login, :logout
end
workflow do
before( :anything ).except :register do |these_prerequisites|
demand :logged_in? or declare_error :login_required
end
# event hooks
every :inquiry do |inquiry_hook|
log inquiry_hook
end
inquiry :user_data do
demand :username
demand :email_address
ask :snailmail_address do
demand :zipcode
end
end
action :register do
inquire :user_data
prompt :login
end
action :login do
demand :username, :password or declare_error :login_failed
end
end
end
ability :group do |interface|
has :users, :groups
is_a :privilege_object, :user
can do |abilities|
provides do |services|
agent :owners, :invite
everyone :join, :leave
end
end
answers :owns?, :belongs_to?, :can_access?
end
asset :email_address do |interface|
has :username, :hostname
end
asset :hostname do |interface|
has :domain_name, :host
end
asset :snailmail_address do |interface|
has :street_address, :street_sub_address
end
# maps two abilities - :send and :receive
# :send can target any object that can :receive
ability :send do |object, recipient|
expect recipient, :receive
recipient :receive, object
end
ability :receive do |object, from|
end
# automatic inclusion of singulars in plurals - ie admin in admins
agent :admin do |interface|
is_a :user
can do |privileges|
create :users, :groups
delete :users, :groups
end
end
agent :superuser do
is_a :user, :admin
can do |privileges|
create :admins
delete :admins
end
end
plugin :forum do
has_urls :index, :subindex, :forum_posts, :post
root :forum do |location|
asset :forums => '%forum%' do |forum_name|
# threads in a forum [joe: why aspects? why not agents/assets?]
aspect :threads => '%thread%' do |thread_name| # [joe -- thread?]
end
# track which users use which forums and their posts by user
aspect :users => '%user%' do |user_name|
end
# pinned posts
aspect :pinned => 'pinned' do |pinned_topics|
asset :overview => 'topics' do |list_of_pinned_topics|
list forum_name, :pinned_topics
end
asset :topics => '%topic%' do |topic_name|
end
end
# [joe -- other forum stuff: account management interface, 'achievements' for good forum behavior (creating, upvoting posts, respondoning to posts, writing popular comments, etc.) ]
end
end
has_agents :users, :moderators, :admins, :superusers
agent :user do
can do |privileges|
create :thread, :post, :private_message
end
end
agent :moderator do
can do |privileges|
create :forum
end
end
web_module :forum do
# ...
end
end
plugin_extension :forum, :achievements do
agent :user do
can do
receive :award
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment