fulcrum_cloudfuji 0.1.0

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,4 @@
1
+ pkg/
2
+ *.gem
3
+ Gemfile.lock
4
+ spec/internal/log/
@@ -0,0 +1,7 @@
1
+ lang: ruby
2
+
3
+ rvm:
4
+ - 1.9.3
5
+
6
+ before_script:
7
+ - sh -c "psql -c 'create database fulcrum_cloudfuji_test;' -U postgres"
data/Gemfile ADDED
@@ -0,0 +1,17 @@
1
+ source :rubygems
2
+
3
+ gem 'rake'
4
+
5
+ gem 'bundler_local_development', :group => :development, :require => false
6
+ begin
7
+ require 'bundler_local_development'
8
+ rescue LoadError
9
+ end
10
+
11
+ gemspec
12
+
13
+ gem 'cloudfuji', :git => 'git://github.com/cloudfuji/cloudfuji_client.git'
14
+
15
+ group :test, :development do
16
+ gem 'pg' # Default database for testing
17
+ end
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 [name of plugin creator]
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,6 @@
1
+ Errbit - Cloudfuji Integration
2
+ ====================================
3
+
4
+ Integrates Errbit with the Cloudfuji hosting platform.
5
+
6
+ Copyright (c) 2012 Cloudfuji
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env rake
2
+ require 'rake'
3
+
4
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,53 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title><%= "#{@project.name} - " if @project %><%= t('fulcrum') %></title>
5
+ <%= csrf_meta_tags %>
6
+ <link rel="stylesheet" type="text/css" href="//ajax.googleapis.com/ajax/libs/jqueryui/1/themes/smoothness/jquery-ui.css">
7
+ <%= stylesheet_link_tag :application %>
8
+ <%= stylesheet_link_tag "http://ajax.googleapis.com/ajax/libs/jqueryui/1/themes/smoothness/jquery-ui.css" %>
9
+ <%= javascript_include_tag :application %>
10
+ </head>
11
+ <body>
12
+
13
+ <div id="header">
14
+ <ul id="primary-nav">
15
+ <li class="root"><%= link_to t('fulcrum'), root_path %></li>
16
+ <% if current_user %>
17
+ <li<%= ' class="secondary"'.html_safe if current_user.projects.present? %>>
18
+ <%= link_to Project.model_name.human.pluralize, root_path %>
19
+ <%- if current_user.projects.present? -%>
20
+ <ul>
21
+ <%- current_user.projects.each do |project| -%>
22
+ <li><%= link_to project, project %></li>
23
+ <%- end -%>
24
+ </ul>
25
+ <%- end %>
26
+ </li>
27
+ (<%= current_user.email %>)
28
+ <% unless Devise.on_cloudfuji? %>
29
+ <li><%= link_to current_user.email, edit_user_registration_path %></li>
30
+ <% end %>
31
+ <li><%= link_to t('log out'), destroy_user_session_path %></li>
32
+ <% else %>
33
+ <li><%= link_to t('log in'), new_user_session_path %></li>
34
+ <% unless Devise.on_cloudfuji? %>
35
+ <li><%= link_to t('sign up'), new_user_registration_path %></li>
36
+ <% end %>
37
+ <% end %>
38
+ </ul>
39
+ </div>
40
+
41
+ <div id="title_bar">
42
+ <%= yield :title_bar %>
43
+ </div>
44
+
45
+ <div id="main">
46
+ <%= show_messages %>
47
+
48
+ <%= yield %>
49
+ </div>
50
+
51
+ </body>
52
+ </html>
53
+
@@ -0,0 +1,39 @@
1
+ <% content_for :title_bar do %>
2
+ <%= render :partial => 'projects/nav', :locals => {:project => @project} %>
3
+ <% end %>
4
+ <h2>Project members</h2>
5
+ <ul>
6
+ <% @users.each do |user| %>
7
+ <li><%= user %>
8
+ <% unless Devise.on_cloudfuji? %>
9
+ <%= link_to 'Remove', project_user_path(@project, user),
10
+ :confirm => "Are you sure you want to remove #{user.email} from this project?",
11
+ :method => :delete %>
12
+ <% end %>
13
+ </li>
14
+ <% end %>
15
+ </ul>
16
+ <% unless Devise.on_cloudfuji? %>
17
+ <h2>Add a new member</h2>
18
+ <div class="form-wrapper">
19
+ <%= form_for project_users_path(@project, @user) do |f| %>
20
+ <% fields_for :user do |u| %>
21
+ <div class="field-wrapper">
22
+ <%= u.label :email %>
23
+ <div class="field"><%= u.text_field :email %></div>
24
+ </div>
25
+ <div class="field-wrapper">
26
+ <%= u.label :name %>
27
+ <div class="field"><%= u.text_field :name %></div>
28
+ </div>
29
+ <div class="field-wrapper">
30
+ <%= u.label :initials %>
31
+ <div class="field"><%= u.text_field :initials %></div>
32
+ </div>
33
+ <div class="actions">
34
+ <%= u.submit 'Add user' %>
35
+ </div>
36
+ <% end %>
37
+ <% end %>
38
+ </div>
39
+ <% end %>
@@ -0,0 +1,7 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+
4
+ Bundler.require :default, :development
5
+
6
+ Combustion.initialize!
7
+ run Combustion::Application
@@ -0,0 +1 @@
1
+ require 'fulcrum/cloudfuji'
@@ -0,0 +1,8 @@
1
+ if ::Cloudfuji::Platform.on_cloudfuji?
2
+ # Override Fulcrum.devise_modules with Cloudfuji authentication
3
+ module Fulcrum
4
+ def self.devise_modules
5
+ [:cloudfuji_authenticatable, :trackable, :token_authenticatable]
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ class AddCloudfujiAuthenticatableFieldsToUser < ActiveRecord::Migration
2
+ def change
3
+ change_table :users do |t|
4
+ begin
5
+ t.cloudfuji_authenticatable
6
+ rescue
7
+ puts "Already added Cloudfuji columns to user!"
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ class AddIdoIdToModels < ActiveRecord::Migration
2
+ def change
3
+ add_column :notes, :ido_id, :string
4
+ add_column :projects, :ido_id, :string
5
+ add_column :stories, :ido_id, :string
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ class AddActiveToUsers < ActiveRecord::Migration
2
+ def change
3
+ add_column :users, :active, :boolean, :default => true
4
+ end
5
+ end
@@ -0,0 +1,18 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+ require 'fulcrum_cloudfuji/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'fulcrum_cloudfuji'
7
+ s.authors = ['Sean Grove', 'Nathan Broadbent']
8
+ s.email = 's@cloudfuji.com'
9
+ s.homepage = 'http://cloudfuji.com'
10
+ s.summary = 'Fulcrum - Cloudfuji Integration'
11
+ s.description = 'Integrates Fulcrum with the Cloudfuji hosting platform.'
12
+ s.files = `git ls-files`.split("\n")
13
+ s.version = Fulcrum::Cloudfuji::VERSION
14
+
15
+ s.add_dependency 'cloudfuji', '>= 0.0.42'
16
+ s.add_dependency 'devise_cloudfuji_authenticatable'
17
+
18
+ end
@@ -0,0 +1,98 @@
1
+ module Fulcrum
2
+ module Cloudfuji
3
+ class << self
4
+ def enable_cloudfuji!
5
+ load_observers!
6
+ extend_user!
7
+ extend_project!
8
+ disable_devise_for_cloudfuji_controllers!
9
+ end
10
+
11
+ def extend_user!
12
+ puts "Extending the User model"
13
+ User.class_eval do
14
+ validates_presence_of :ido_id
15
+ validates_uniqueness_of :ido_id
16
+
17
+ attr_accessible :ido_id
18
+
19
+ after_create :add_all_projects!
20
+ before_destroy :remove_all_projects!
21
+
22
+ def set_random_password_if_blank
23
+ # Not needed with Cloudfuji authentication
24
+ super unless ::Cloudfuji::Platform.on_cloudfuji?
25
+ end
26
+ alias :set_reset_password_token :set_random_password_if_blank
27
+
28
+ def cloudfuji_extra_attributes(extra_attributes)
29
+ self.name = "#{extra_attributes['first_name'].to_s} #{extra_attributes['last_name'].to_s}"
30
+ if extra_attributes['first_name'] && extra_attributes['last_name']
31
+ self.initials = "#{extra_attributes['first_name'][0].upcase}#{extra_attributes['last_name'][0].upcase}"
32
+ else
33
+ self.initials = "#{extra_attributes['email'][0].upcase}#{extra_attributes['email'][1].upcase}"
34
+ end
35
+
36
+ self.email = extra_attributes["email"]
37
+ end
38
+
39
+ def add_all_projects!
40
+ Project.all.each { |project| project.users << self unless project.users.member?(self) }
41
+ end
42
+
43
+ def remove_all_projects!
44
+ Project.all.each { |project| project.users.delete(self) if project.users.member?(self) }
45
+ end
46
+
47
+ def active_for_authentication?
48
+ super && active?
49
+ end
50
+ end
51
+ end
52
+
53
+ def extend_project!
54
+ puts "Extending the Project model"
55
+ Project.class_eval do
56
+ after_create :add_all_users!
57
+
58
+ def add_all_users!
59
+ User.all.each do |user|
60
+ unless self.users.include?(user)
61
+ self.users << user
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+
68
+ def load_observers!
69
+ Dir[File.expand_path("../cloudfuji/event_observers/*.rb", __FILE__)].each { |file| require file }
70
+ end
71
+
72
+ # Temporary hack because all routes require authentication in
73
+ # Fulcrum
74
+ def disable_devise_for_cloudfuji_controllers!
75
+ puts "Disabling devise auth protection on cloudfuji controllers"
76
+
77
+ ::Cloudfuji::DataController.instance_eval { before_filter :authenticate_user!, :except => [:index] }
78
+ ::Cloudfuji::EnvsController.instance_eval { before_filter :authenticate_user!, :except => [:update] }
79
+ ::Cloudfuji::MailController.instance_eval { before_filter :authenticate_user!, :except => [:index] }
80
+
81
+ puts "Devise checks disabled for Cloudfuji controllers"
82
+ end
83
+ end
84
+ end
85
+ end
86
+
87
+ if Cloudfuji::Platform.on_cloudfuji?
88
+ class CloudfujiRailtie < Rails::Railtie
89
+ # Enabling it via this hook means that it'll be reloaded on each
90
+ # request in development mode, so you can make changes in here and
91
+ # it'll be immeidately reflected
92
+ config.to_prepare do
93
+ puts "Enabling Cloudfuji"
94
+ Fulcrum::Cloudfuji.enable_cloudfuji!
95
+ puts "Finished enabling Cloudfuji"
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,18 @@
1
+ module Fulcrum
2
+ module Cloudfuji
3
+ module EventObservers
4
+ class AppObserver < ::Cloudfuji::EventObserver
5
+
6
+ # This is here for eventual lazy-registration. Create a fake user on
7
+ # rake cloudfuji:install, and when the app is claimed, we'll get this
8
+ # event with the user info, so we convert the existing user and
9
+ # update their info here.
10
+ def app_claimed
11
+ User.order("created_at").first.update_attributes(:email => params['data']['email'],
12
+ :ido_id => params['data']['ido_id'])
13
+ end
14
+
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,31 @@
1
+ module Fulcrum
2
+ module Cloudfuji
3
+ module EventObservers
4
+ class ProjectObserver < ::Cloudfuji::EventObserver
5
+
6
+ def project_created
7
+ puts params.inspect
8
+ puts "prarm"
9
+ data = params['data']
10
+
11
+ project = Project.find_by_ido_id(data['ido_id'])
12
+ project ||= Project.new
13
+
14
+ # Just in case
15
+ project.ido_id ||= data['ido_id']
16
+ project.name = data['name']
17
+ project.point_scale = 'linear' || data['point_scale'] # TODO: Put in a reverse lookup
18
+ project.iteration_start_day = data['iteration_start_day']
19
+ project.iteration_length = data['iteration_length']
20
+
21
+ project.save!
22
+ end
23
+
24
+ def project_imported
25
+ project_created
26
+ end
27
+
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,30 @@
1
+ module Fulcrum
2
+ module Cloudfuji
3
+ module EventObservers
4
+ class ProjectTaskNoteObserver < ::Cloudfuji::EventObserver
5
+
6
+ def project_task_note_created
7
+ data = params['data']
8
+
9
+ note = Note.find_by_ido_id(data['ido_id'])
10
+ note ||= Note.new
11
+
12
+ # Just in case
13
+ note.ido_id ||= data['ido_id']
14
+ note.note = data['note']
15
+ note.user = User.find_by_ido_id( data['author_id'] )
16
+ note.story = Story.find_by_ido_id( data['story_id'] )
17
+
18
+ puts note.inspect
19
+
20
+ note.save!
21
+ end
22
+
23
+ def project_task_note_imported
24
+ project_task_note_created
25
+ end
26
+
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,39 @@
1
+ module Fulcrum
2
+ module Cloudfuji
3
+ module EventObservers
4
+ class ProjectTaskObserver < ::Cloudfuji::EventObserver
5
+
6
+ def project_task_created
7
+ data = params['data']
8
+
9
+ story = Story.find_by_ido_id(data['ido_id'])
10
+ story ||= Story.new
11
+
12
+ # Just in case
13
+ story.ido_id ||= data['ido_id']
14
+ story.title = data['title']
15
+ story.description = data['description']
16
+ story.estimate = data['estimate']
17
+ story.story_type = data['task_type']
18
+ story.state = data['state']
19
+ story.accepted_at = data['accepted_at']
20
+ story.requested_by_id = User.find_by_ido_id(data['requested_by_id'])
21
+ story.owned_by_id = User.find_by_ido_id(data['owned_by_id'])
22
+ story.project = Project.find_by_ido_id(data['project_id'])
23
+ story.labels = data['labels']
24
+
25
+ story.save!
26
+ end
27
+
28
+ def project_task_updated
29
+ project_task_created
30
+ end
31
+
32
+ def project_task_imported
33
+ project_task_created
34
+ end
35
+
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,49 @@
1
+ module Fulcrum
2
+ module Cloudfuji
3
+ module EventObservers
4
+ class UserObserver < ::Cloudfuji::EventObserver
5
+
6
+ def user_added
7
+ puts "Adding a new user with incoming data #{params.inspect}"
8
+ puts "Devise username column: #{::Devise.cas_username_column}="
9
+ puts "Setting username to: #{params['data'].try(:[], 'ido_id')}"
10
+
11
+ user = User.send("find_or_initialize_by_#{::Devise.cas_username_column}".to_sym, params['data'].try(:[], 'ido_id'))
12
+ user.email = params['data'].try(:[], 'email')
13
+ user.name = user.email.split('@').first
14
+ user.initials = user.email[0..1].upcase
15
+ user.active = true
16
+ user.save
17
+
18
+ # Add the new user to all existing projects
19
+ Project.all.each(&:add_all_users!)
20
+ end
21
+
22
+ def user_removed
23
+ puts "Removing user based on incoming data #{params.inspect}"
24
+ puts "Devise username column: #{::Devise.cas_username_column}="
25
+
26
+ user = User.find_by_ido_id(params['data']['ido_id'])
27
+ user.update_attribute(:active, false)
28
+ end
29
+
30
+ def user_updated
31
+ puts "Updating user based on incoming data #{params.inspect}"
32
+ puts "Devise username column: #{::Devise.cas_username_column}="
33
+
34
+ data = params['data']
35
+ user = User.find_by_ido_id(data['ido_id'])
36
+
37
+ if user
38
+ # Re-use the CAS login method to set all the extra attributes we
39
+ # care about (first_name, last_name, email, local, timezone,
40
+ # etc.)
41
+ user.cloudfuji_extra_attributes(data)
42
+ user.save
43
+ end
44
+ end
45
+
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,6 @@
1
+ # Gem Dependencies
2
+ require 'cloudfuji'
3
+ require 'devise_cloudfuji_authenticatable'
4
+
5
+ # Rails Engine
6
+ require 'fulcrum_cloudfuji/engine'
@@ -0,0 +1,23 @@
1
+ module Fulcrum
2
+ module Cloudfuji
3
+ class Engine < Rails::Engine
4
+ config.to_prepare do
5
+ ::Fulcrum::Application.class_eval do
6
+ # Add migrations from engine to main migrations
7
+ config.paths['db/migrate'] += Fulcrum::Cloudfuji::Engine.paths['db/migrate'].existent
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+
14
+ # Override engine view paths so that this gem's views can override application views
15
+ Rails::Engine.initializers.detect{|i| i.name == :add_view_paths }.
16
+ instance_variable_set("@block", Proc.new {
17
+ views = paths["app/views"].to_a
18
+ unless views.empty?
19
+ ActiveSupport.on_load(:action_controller){ append_view_path(views) }
20
+ ActiveSupport.on_load(:action_mailer){ append_view_path(views) }
21
+ end
22
+ }
23
+ )
@@ -0,0 +1,5 @@
1
+ module Fulcrum
2
+ module Cloudfuji
3
+ VERSION = '0.1.0'
4
+ end
5
+ end
@@ -0,0 +1,32 @@
1
+ namespace :cloudfuji do
2
+ desc "Run the initial setup for a Busido app. Copies config files and seeds db."
3
+ task :install => :environment do
4
+ user = User.first
5
+
6
+ if user.nil?
7
+ puts "Creating default user..."
8
+ user = User.new
9
+ user.email = "#{::Cloudfuji::Platform.name}@#{ENV['CLOUDFUJI_HOST']}"
10
+ user.initials = ::Cloudfuji::Platform.name[0..1].upcase
11
+ user.name = ::Cloudfuji::Platform.name
12
+ user.ido_id = "temporary_user"
13
+ user.save!
14
+ end
15
+
16
+ project = Project.first
17
+
18
+ if project.nil?
19
+ puts "Creating default project..."
20
+ project = Project.new
21
+ project.name = "Default Project"
22
+ project.point_scale = "fibonacci"
23
+ project.start_date = Date.today
24
+ project.iteration_start_day = 1
25
+ project.iteration_length = 1
26
+ project.created_at = Time.now
27
+ project.updated_at = Time.now
28
+ project.default_velocity = 10
29
+ project.save!
30
+ end
31
+ end
32
+ end
metadata ADDED
@@ -0,0 +1,108 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fulcrum_cloudfuji
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Sean Grove
9
+ - Nathan Broadbent
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2012-05-29 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: cloudfuji
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: 0.0.42
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: 0.0.42
31
+ - !ruby/object:Gem::Dependency
32
+ name: devise_cloudfuji_authenticatable
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ type: :runtime
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ description: Integrates Fulcrum with the Cloudfuji hosting platform.
48
+ email: s@cloudfuji.com
49
+ executables: []
50
+ extensions: []
51
+ extra_rdoc_files: []
52
+ files:
53
+ - .gitignore
54
+ - .travis.yml
55
+ - Gemfile
56
+ - MIT-LICENSE
57
+ - README
58
+ - Rakefile
59
+ - app/views/layouts/application.html.erb
60
+ - app/views/users/index.html.erb
61
+ - config.ru
62
+ - config/initializers/cloudfuji.rb
63
+ - config/initializers/cloudfuji_config.rb
64
+ - db/migrate/20120309045850_add_cloudfuji_authenticatable_fields_to_user.rb
65
+ - db/migrate/20120318053922_add_ido_id_to_models.rb
66
+ - db/migrate/20120405224034_add_active_to_users.rb
67
+ - fulcrum_cloudfuji.gemspec
68
+ - lib/fulcrum/cloudfuji.rb
69
+ - lib/fulcrum/cloudfuji/event_observers/app_observer.rb
70
+ - lib/fulcrum/cloudfuji/event_observers/project_observer.rb
71
+ - lib/fulcrum/cloudfuji/event_observers/project_task_note_observer.rb
72
+ - lib/fulcrum/cloudfuji/event_observers/project_task_observer.rb
73
+ - lib/fulcrum/cloudfuji/event_observers/user_observer.rb
74
+ - lib/fulcrum_cloudfuji.rb
75
+ - lib/fulcrum_cloudfuji/engine.rb
76
+ - lib/fulcrum_cloudfuji/version.rb
77
+ - lib/tasks/cloudfuji.rake
78
+ homepage: http://cloudfuji.com
79
+ licenses: []
80
+ post_install_message:
81
+ rdoc_options: []
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ segments:
91
+ - 0
92
+ hash: 4575079031632976573
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ segments:
100
+ - 0
101
+ hash: 4575079031632976573
102
+ requirements: []
103
+ rubyforge_project:
104
+ rubygems_version: 1.8.24
105
+ signing_key:
106
+ specification_version: 3
107
+ summary: Fulcrum - Cloudfuji Integration
108
+ test_files: []