platform 3.1.2 → 3.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.rvmrc +2 -0
- data/Gemfile.lock +4 -4
- data/README.rdoc +0 -3
- data/app/assets/javascripts/platform/api_explorer.js +4 -1
- data/app/controllers/platform/api/base_controller.rb +39 -20
- data/app/models/platform/application.rb +2 -4
- data/app/models/platform/developer.rb +4 -2
- data/app/models/platform/logged_exception.rb +2 -2
- data/app/models/platform/media/media.rb +6 -3
- data/app/views/platform/admin/apps/index.html.erb +1 -1
- data/app/views/platform/apps/index.html.erb +2 -2
- data/app/views/platform/developer/api_explorer/index.html.erb +9 -5
- data/app/views/platform/developer/apps/_form.html.erb +4 -2
- data/app/views/platform/developer/apps/index.html.erb +6 -4
- data/app/views/platform/developer/common/_header.html.erb +0 -1
- data/app/views/platform/developer/dashboard/_statistics.html.erb +1 -1
- data/app/views/platform/developer/dashboard/index.html.erb +1 -1
- data/app/views/platform/developer/help/oauth_mobile.html.erb +5 -3
- data/app/views/platform/developer/registration/index.html.erb +8 -123
- data/lib/generators/platform/api_generator.rb +74 -0
- data/lib/generators/platform/platform_generator.rb +1 -1
- data/lib/generators/platform/proxy_generator.rb +1 -2
- data/lib/generators/platform/templates/config/platform/config.yml +9 -8
- data/lib/generators/platform/templates/config/platform/data/default_applications.yml +1 -23
- data/lib/generators/platform/templates/config/platform/data/default_categories.yml +1 -6
- data/lib/generators/platform/templates/config/platform/data/default_permissions.yml +16 -0
- data/lib/generators/platform/templates/config/platform/site/features.yml +1 -6
- data/lib/generators/platform/templates/db/create_platform_tables.rb +36 -47
- data/lib/platform/api/proxy/base.rb +4 -0
- data/lib/platform/config.rb +12 -16
- data/lib/platform/extensions/action_view_extension.rb +13 -1
- data/lib/platform/extensions/hash_extension.rb +69 -0
- data/lib/platform/railtie.rb +1 -0
- data/lib/platform/version.rb +1 -1
- data/lib/tasks/platform.rake +1 -0
- data/platform.gemspec +0 -1
- data/test/dummy/app/assets/images/logo.png +0 -0
- data/test/dummy/app/controllers/api/bookmarks_controller.rb +1 -1
- data/test/dummy/app/models/bookmark.rb +0 -2
- data/test/dummy/app/models/user.rb +1 -2
- data/test/dummy/app/views/home/index.html.erb +2 -2
- data/test/dummy/app/views/layouts/_footer.html.erb +1 -1
- data/test/dummy/app/views/layouts/_header.html.erb +1 -1
- data/test/dummy/config/application.rb +0 -1
- data/test/dummy/config/environments/development.rb +3 -1
- data/test/dummy/config/initializers/platform.rb +3 -0
- data/test/dummy/config/platform/api/1/bookmark.yml +2 -2
- data/test/dummy/config/platform/config.yml +10 -9
- data/test/dummy/config/platform/data/default_applications.yml +4 -23
- data/test/dummy/config/platform/data/default_categories.yml +1 -6
- data/test/dummy/config/platform/site/features.yml +1 -6
- data/test/dummy/config/routes.rb +1 -1
- data/test/dummy/config/tr8n/config.yml +2 -2
- data/test/dummy/db/migrate/20111004075531_create_platform_tables.rb +1 -1
- data/test/dummy/public/developer_agreement.html +123 -0
- metadata +52 -46
- data/db/migrate/20110602232141_create_platform_tables.rb +0 -262
@@ -48,6 +48,10 @@ module Platform
|
|
48
48
|
def to_api_hash(opts = {})
|
49
49
|
raise NotImplementedError, 'Must be implemented in descendant class'
|
50
50
|
end
|
51
|
+
|
52
|
+
def sanitize_api_hash(hash)
|
53
|
+
hash.select{|key, value| !value.blank?}
|
54
|
+
end
|
51
55
|
|
52
56
|
def to_api_path(opts = {})
|
53
57
|
"#{Platform::Config.api_scheme}://#{Platform::Config.api_base_url}/#{instance.class.name.underscore}/#{instance.id}"
|
data/lib/platform/config.rb
CHANGED
@@ -89,17 +89,11 @@ module Platform
|
|
89
89
|
end
|
90
90
|
|
91
91
|
init_default_categories
|
92
|
-
init_default_applications
|
93
92
|
|
94
93
|
puts "Done."
|
95
94
|
end
|
96
95
|
|
97
96
|
def self.system_user
|
98
|
-
if user_class_name == "Platform::PlatformUser"
|
99
|
-
@system_user ||= Platform::PlatformUser.first || Platform::PlatformUser.create(:name => "System User")
|
100
|
-
return @system_user
|
101
|
-
end
|
102
|
-
|
103
97
|
return nil unless site_info[:system_user_id]
|
104
98
|
@system_user ||= user_class_name.constantize.find_by_id(site_info[:system_user_id])
|
105
99
|
end
|
@@ -116,16 +110,8 @@ module Platform
|
|
116
110
|
end
|
117
111
|
|
118
112
|
default_applications.each do |keyword, description|
|
119
|
-
category_keywords = description.delete("category_keywords")
|
120
|
-
icon_path = description.delete("icon_path")
|
121
|
-
logo_path = description.delete("logo_path")
|
122
|
-
|
123
113
|
app = Platform::Application.create(description.merge(:developer => system_developer))
|
124
|
-
app.store_icon(File.new("#{root}/#{icon_path}", "r")) if icon_path
|
125
|
-
app.store_logo(File.new("#{root}/#{logo_path}", "r")) if logo_path
|
126
|
-
|
127
114
|
puts "Initialized #{app.name}."
|
128
|
-
app.approve!
|
129
115
|
end
|
130
116
|
end
|
131
117
|
|
@@ -158,8 +144,9 @@ module Platform
|
|
158
144
|
end
|
159
145
|
|
160
146
|
def self.load_yml(file_path, for_env = env)
|
161
|
-
|
162
|
-
yml =
|
147
|
+
yml_path = "#{root}#{file_path}"
|
148
|
+
yml = YAML.load_file(yml_path)
|
149
|
+
yml = yml['defaults'].rmerge(yml[for_env] || {}) unless for_env.nil?
|
163
150
|
HashWithIndifferentAccess.new(yml)
|
164
151
|
end
|
165
152
|
|
@@ -191,6 +178,10 @@ module Platform
|
|
191
178
|
config[:enable_developer_agreement]
|
192
179
|
end
|
193
180
|
|
181
|
+
def self.developer_agreement_path
|
182
|
+
config[:developer_agreement_path]
|
183
|
+
end
|
184
|
+
|
194
185
|
def self.enable_app_statistics?
|
195
186
|
config[:enable_app_statistics]
|
196
187
|
end
|
@@ -602,6 +593,11 @@ module Platform
|
|
602
593
|
config[:api_explorer_app_id]
|
603
594
|
end
|
604
595
|
|
596
|
+
def self.api_explorer_app
|
597
|
+
return if api_explorer_app_id.blank?
|
598
|
+
@api_explorer_app ||= Platform::Application.find_by_id(api_explorer_app_id)
|
599
|
+
end
|
600
|
+
|
605
601
|
def self.api_explorer_app?
|
606
602
|
!api_explorer_app_id.blank?
|
607
603
|
end
|
@@ -126,6 +126,18 @@ module Platform
|
|
126
126
|
end
|
127
127
|
end
|
128
128
|
|
129
|
+
def platform_app_icon_tag(app, options = {})
|
130
|
+
options[:style] ||= ""
|
131
|
+
options[:style] << "width:16px;height:16px;"
|
132
|
+
image_tag(app.icon_url, :style => options[:style])
|
133
|
+
end
|
134
|
+
|
135
|
+
def platform_app_logo_tag(app, options = {})
|
136
|
+
options[:style] ||= ""
|
137
|
+
options[:style] << "width:75px;height:75px;"
|
138
|
+
image_tag(app.logo_url, :style => options[:style])
|
139
|
+
end
|
140
|
+
|
129
141
|
def platform_user_mugshot_tag(user, options = {})
|
130
142
|
if user and !Platform::Config.user_mugshot(user).blank?
|
131
143
|
img_url = Platform::Config.user_mugshot(user)
|
@@ -183,7 +195,7 @@ module Platform
|
|
183
195
|
return platform_when_string_tr("{hours||hour} ago", :hours => (elapsed_seconds / 1.hour).to_i) if elapsed_seconds < 1.day
|
184
196
|
return platform_when_string_tr("Yesterday") if elapsed_seconds < 48.hours
|
185
197
|
return platform_when_string_tr("{days||day} ago", :days => elapsed_seconds.to_i / 1.day) if elapsed_seconds < 14.days
|
186
|
-
return platform_when_string_tr("{weeks||week} ago", :weeks => (elapsed_seconds / 1.day / 7).to_i) if
|
198
|
+
return platform_when_string_tr("{weeks||week} ago", :weeks => (elapsed_seconds / 1.day / 7).to_i) if elapsed_seconds < 4.weeks
|
187
199
|
return platform_display_time(time, :monthname_abbr) if Date.today.year == time.year
|
188
200
|
return platform_display_time(time, :monthname_abbr_year)
|
189
201
|
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
#
|
2
|
+
# = Hash Recursive Merge
|
3
|
+
#
|
4
|
+
# Merges a Ruby Hash recursively, Also known as deep merge.
|
5
|
+
# Recursive version of Hash#merge and Hash#merge!.
|
6
|
+
#
|
7
|
+
# Category:: Ruby
|
8
|
+
# Package:: Hash
|
9
|
+
# Author:: Simone Carletti <weppos@weppos.net>
|
10
|
+
# Copyright:: 2007-2008 The Authors
|
11
|
+
# License:: MIT License
|
12
|
+
# Link:: http://www.simonecarletti.com/
|
13
|
+
# Source:: http://gist.github.com/gists/6391/
|
14
|
+
|
15
|
+
class Hash
|
16
|
+
#
|
17
|
+
# Recursive version of Hash#merge!
|
18
|
+
#
|
19
|
+
# Adds the contents of +other_hash+ to +hsh+,
|
20
|
+
# merging entries in +hsh+ with duplicate keys with those from +other_hash+.
|
21
|
+
#
|
22
|
+
# Compared with Hash#merge!, this method supports nested hashes.
|
23
|
+
# When both +hsh+ and +other_hash+ contains an entry with the same key,
|
24
|
+
# it merges and returns the values from both arrays.
|
25
|
+
#
|
26
|
+
# h1 = {"a" => 100, "b" => 200, "c" => {"c1" => 12, "c2" => 14}}
|
27
|
+
# h2 = {"b" => 254, "c" => 300, "c" => {"c1" => 16, "c3" => 94}}
|
28
|
+
# h1.rmerge!(h2) #=> {"a" => 100, "b" => 254, "c" => {"c1" => 16, "c2" => 14, "c3" => 94}}
|
29
|
+
#
|
30
|
+
# Simply using Hash#merge! would return
|
31
|
+
#
|
32
|
+
# h1.merge!(h2) #=> {"a" => 100, "b" = >254, "c" => {"c1" => 16, "c3" => 94}}
|
33
|
+
#
|
34
|
+
def rmerge!(other_hash)
|
35
|
+
merge!(other_hash) do |key, oldval, newval|
|
36
|
+
oldval.class == self.class ? oldval.rmerge!(newval) : newval
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
#
|
41
|
+
# Recursive version of Hash#merge
|
42
|
+
#
|
43
|
+
# Compared with Hash#merge!, this method supports nested hashes.
|
44
|
+
# When both +hsh+ and +other_hash+ contains an entry with the same key,
|
45
|
+
# it merges and returns the values from both arrays.
|
46
|
+
#
|
47
|
+
# Compared with Hash#merge, this method provides a different approch
|
48
|
+
# for merging nasted hashes.
|
49
|
+
# If the value of a given key is an Hash and both +other_hash+ abd +hsh
|
50
|
+
# includes the same key, the value is merged instead replaced with
|
51
|
+
# +other_hash+ value.
|
52
|
+
#
|
53
|
+
# h1 = {"a" => 100, "b" => 200, "c" => {"c1" => 12, "c2" => 14}}
|
54
|
+
# h2 = {"b" => 254, "c" => 300, "c" => {"c1" => 16, "c3" => 94}}
|
55
|
+
# h1.rmerge(h2) #=> {"a" => 100, "b" => 254, "c" => {"c1" => 16, "c2" => 14, "c3" => 94}}
|
56
|
+
#
|
57
|
+
# Simply using Hash#merge would return
|
58
|
+
#
|
59
|
+
# h1.merge(h2) #=> {"a" => 100, "b" = >254, "c" => {"c1" => 16, "c3" => 94}}
|
60
|
+
#
|
61
|
+
def rmerge(other_hash)
|
62
|
+
r = {}
|
63
|
+
merge(other_hash) do |key, oldval, newval|
|
64
|
+
r[key] = oldval.class == self.class ? oldval.rmerge(newval) : newval
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
data/lib/platform/railtie.rb
CHANGED
@@ -35,6 +35,7 @@ require 'pp'
|
|
35
35
|
end
|
36
36
|
|
37
37
|
require File.join(File.dirname(__FILE__), 'extensions/object_extension')
|
38
|
+
require File.join(File.dirname(__FILE__), 'extensions/hash_extension')
|
38
39
|
require File.join(File.dirname(__FILE__), 'extensions/action_view_extension')
|
39
40
|
require File.join(File.dirname(__FILE__), 'extensions/action_controller_extension')
|
40
41
|
|
data/lib/platform/version.rb
CHANGED
data/lib/tasks/platform.rake
CHANGED
@@ -26,6 +26,7 @@ namespace :platform do
|
|
26
26
|
desc "Initializes all of the tables with default data"
|
27
27
|
task :init => :environment do
|
28
28
|
raise "This action is prohibited in this environment" if ['production', 'stage', 'staging'].include?(Rails.env) and env('force') != 'true'
|
29
|
+
Tr8n::Config.reset_all!
|
29
30
|
Platform::Config.reset_all!
|
30
31
|
end
|
31
32
|
|
data/platform.gemspec
CHANGED
@@ -30,7 +30,6 @@ Gem::Specification.new do |s|
|
|
30
30
|
s.add_dependency 'coffee-script', ['>= 0']
|
31
31
|
s.add_dependency 'acts_as_tree', ['>= 0']
|
32
32
|
s.add_dependency 'acts_as_state_machine', ['>= 0']
|
33
|
-
# s.add_dependency 'rmagick', ['>= 0']
|
34
33
|
s.add_development_dependency 'pry', ['>= 0']
|
35
34
|
s.add_development_dependency 'bundler', ['>= 1.0.0']
|
36
35
|
s.add_development_dependency 'sqlite3', ['>= 0']
|
Binary file
|
@@ -14,7 +14,7 @@
|
|
14
14
|
<div class="content_bd">
|
15
15
|
<h3><%=tr("If you are trying out Platform functionality, here are some helpful links to get started:")%></h3>
|
16
16
|
<ul style="list-style-type:decimal; margin-left:30px; font-size:14px;">
|
17
|
-
<li><%= link_to(tr("Register for
|
17
|
+
<li><%= link_to(tr("Register for an account"), "/login/register")%></li>
|
18
18
|
<li><%= link_to(tr("Create a new application"), "/platform/developer/apps")%></li>
|
19
19
|
<li><%= link_to(tr("Explore existing applications"), "/platform/apps")%></li>
|
20
20
|
<li><%= link_to(tr("View your application dashboard"), "/platform/developer/dashboard")%></li>
|
@@ -31,7 +31,7 @@
|
|
31
31
|
<%=tr("Drag the link below to your browser's toolbar or add it to your bookmark list:") %>
|
32
32
|
</p>
|
33
33
|
<p>
|
34
|
-
<a href="javascript:(function(){location.href='http://localhost:3000/api/bookmark/create?bookmarklet=1&title=' + escape(document.title) + '&url='+escape(location.href);})()">Post to
|
34
|
+
<a href="javascript:(function(){location.href='http://localhost:3000/api/bookmark/create?bookmarklet=1&title=' + escape(document.title) + '&url='+escape(location.href);})()">Post to Bookmarklet</a>
|
35
35
|
</p>
|
36
36
|
<p>
|
37
37
|
<%=tr("When you're surfing the web and find a page that you want to bookmark, just click the \"Post to Sample Application\" button on your toolbar or choose it in your bookmark list.") %>
|
@@ -7,7 +7,7 @@
|
|
7
7
|
<li><%=link_to(tr("Credits"), "/platform/developer/help/credits", :class => "quiet")%></li>
|
8
8
|
<li><%=link_to(tr("License"), "/platform/developer/help/license", :class => "quiet")%></li>
|
9
9
|
</ul>
|
10
|
-
© Copyright 2010-2011
|
10
|
+
© Copyright 2010-2011
|
11
11
|
</div>
|
12
12
|
|
13
13
|
</div>
|
@@ -12,7 +12,7 @@
|
|
12
12
|
<li><%= tr8n_language_selector_tag(:lightbox=>false) %></li>
|
13
13
|
</ul>
|
14
14
|
<h1 class="logo">
|
15
|
-
<%=link_to("
|
15
|
+
<%=link_to("Bookmarklet", "/home", :style=>"text-decorations:none;")%>
|
16
16
|
</h1>
|
17
17
|
</div>
|
18
18
|
</div>
|
@@ -4,7 +4,9 @@ Dummy::Application.configure do
|
|
4
4
|
# In the development environment your application's code is reloaded on
|
5
5
|
# every request. This slows down response time but is perfect for development
|
6
6
|
# since you don't have to restart the web server when you make code changes.
|
7
|
-
|
7
|
+
|
8
|
+
# must be enabled for injectable proxies - TODO: figure out how to unload them
|
9
|
+
config.cache_classes = true
|
8
10
|
|
9
11
|
# Log error messages when you accidentally call methods on nil.
|
10
12
|
config.whiny_nils = true
|
@@ -70,8 +70,8 @@ bookmark:
|
|
70
70
|
description: "The bookmark's creation date as a timestamp"
|
71
71
|
type: "Number"
|
72
72
|
status: updated
|
73
|
-
|
74
|
-
path: "bookmark/
|
73
|
+
destroy:
|
74
|
+
path: "bookmark/destroy"
|
75
75
|
method: POST
|
76
76
|
status: added
|
77
77
|
description: "Removes a bookmark."
|
@@ -9,16 +9,23 @@
|
|
9
9
|
# Alternatively, you can overload any of the methods of Platform::Config
|
10
10
|
#############################################################################
|
11
11
|
|
12
|
-
defaults:
|
12
|
+
defaults:
|
13
13
|
enable_platform: true
|
14
14
|
enable_app_directory: true
|
15
15
|
enable_embedded_applications: true
|
16
16
|
enable_mobile_applications: true
|
17
|
-
enable_developer_agreement: false
|
18
17
|
enable_app_statistics: false
|
19
18
|
enable_api_verification: false
|
20
19
|
api_explorer_app_id: 1 # make sure to create an application for the test tool
|
21
20
|
|
21
|
+
#############################################################################
|
22
|
+
# You can enforce users to accept the developers agreement before they
|
23
|
+
# become developers. To do so, enable the line below and provide path
|
24
|
+
# to your dev agreement.
|
25
|
+
#############################################################################
|
26
|
+
enable_developer_agreement: true
|
27
|
+
developer_agreement_path: /developer_agreement.html
|
28
|
+
|
22
29
|
#############################################################################
|
23
30
|
# Platform best run with caching enabled
|
24
31
|
# You can configure cache adapter and store parameters by providing the
|
@@ -52,7 +59,7 @@ defaults: &defaults
|
|
52
59
|
# Site Integration Settings
|
53
60
|
#############################################################################
|
54
61
|
site_info:
|
55
|
-
title: "
|
62
|
+
title: "Bookmarklet"
|
56
63
|
logo_url: "/assets/platform/platform5.png"
|
57
64
|
base_url: "localhost:3000"
|
58
65
|
contact_email: feedback@oauthx.com
|
@@ -118,19 +125,13 @@ defaults: &defaults
|
|
118
125
|
# You can overload any feature defined in the defaults for any environment
|
119
126
|
#############################################################################
|
120
127
|
development:
|
121
|
-
<<: *defaults
|
122
128
|
|
123
129
|
test:
|
124
|
-
<<: *defaults
|
125
130
|
|
126
131
|
qa:
|
127
|
-
<<: *defaults
|
128
132
|
|
129
133
|
stage:
|
130
|
-
<<: *defaults
|
131
134
|
|
132
135
|
production:
|
133
|
-
<<: *defaults
|
134
136
|
|
135
137
|
sandbox:
|
136
|
-
<<: *defaults
|
@@ -1,39 +1,20 @@
|
|
1
|
-
defaults:
|
2
|
-
|
3
|
-
name: "
|
4
|
-
description: "
|
5
|
-
url: "http://www.google.com"
|
6
|
-
contact_email: "apps@railsplatform.org"
|
7
|
-
category_keywords: ["all"]
|
8
|
-
icon_path: "/public/platform/images/apps/app_icon.gif"
|
9
|
-
logo_path: "/public/platform/images/apps/app_logo.gif"
|
10
|
-
|
11
|
-
yahoo:
|
12
|
-
name: "Yahoo"
|
13
|
-
description: "Yahoo Search Engine"
|
14
|
-
url: "http://www.yahoo.com"
|
15
|
-
contact_email: "apps@railsplatform.org"
|
16
|
-
category_keywords: ["all"]
|
17
|
-
icon_path: "/public/platform/images/apps/app_icon.gif"
|
18
|
-
logo_path: "/public/platform/images/apps/app_logo.gif"
|
1
|
+
defaults:
|
2
|
+
api_explorer:
|
3
|
+
name: "API Explorer"
|
4
|
+
description: "Allows developers to test API without having to create any applications"
|
19
5
|
|
20
6
|
#############################################################################
|
21
7
|
# Environment Settings
|
22
8
|
# You can overload any feature defined in the defaults for any environment
|
23
9
|
#############################################################################
|
24
10
|
development:
|
25
|
-
<<: *defaults
|
26
11
|
|
27
12
|
test:
|
28
|
-
<<: *defaults
|
29
13
|
|
30
14
|
qa:
|
31
|
-
<<: *defaults
|
32
15
|
|
33
16
|
stage:
|
34
|
-
<<: *defaults
|
35
17
|
|
36
18
|
production:
|
37
|
-
<<: *defaults
|
38
19
|
|
39
20
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
defaults:
|
1
|
+
defaults:
|
2
2
|
all:
|
3
3
|
position: 1
|
4
4
|
name: "All Apps"
|
@@ -39,18 +39,13 @@ defaults: &defaults
|
|
39
39
|
# You can overload any feature defined in the defaults for any environment
|
40
40
|
#############################################################################
|
41
41
|
development:
|
42
|
-
<<: *defaults
|
43
42
|
|
44
43
|
test:
|
45
|
-
<<: *defaults
|
46
44
|
|
47
45
|
qa:
|
48
|
-
<<: *defaults
|
49
46
|
|
50
47
|
stage:
|
51
|
-
<<: *defaults
|
52
48
|
|
53
49
|
production:
|
54
|
-
<<: *defaults
|
55
50
|
|
56
51
|
|