fulcrum_cloudfuji 0.1.0

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