fwtoolkit 0.0.6

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.
data/bin/fwt ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'fwtoolkit/cli'
4
+
5
+ FWToolkit::CLI.start
@@ -0,0 +1,68 @@
1
+ require 'fwtoolkit'
2
+ require 'frank-cucumber/cli'
3
+ require 'rake'
4
+
5
+ module FWToolkit
6
+ class CLI < Thor
7
+
8
+ include Rake::DSL
9
+ include Thor::Actions
10
+
11
+ desc "model CORE_DATA_MODEL", "create model files for cucumber"
12
+ method_option :no_prefix, :aliases => "-np", :default => false, :type => :boolean
13
+ def model(core_data_model_path)
14
+ # validation step - core_data_model should be of type .xcdatamodel
15
+ output_dir = File.join('Frank', 'features', 'support', 'models')
16
+ FWToolkit::CLI.source_root(FWToolkit.root)
17
+
18
+ @no_prefix = options.no_prefix
19
+
20
+ model = CoreData::DataModel.new(File.join(core_data_model_path, 'contents'))
21
+ @models = model.entities
22
+
23
+ @models.each do |entity|
24
+ @model = entity
25
+ factory_template = File.join 'templates', 'models', 'model.rb.erb'
26
+ template(factory_template, File.join(output_dir, "#{class_name(@model).ruby_format}.rb"))
27
+ end
28
+
29
+ factory_template = File.join 'templates', 'models', 'factories.rb.erb'
30
+ template(factory_template, File.join(output_dir, 'factories.rb'))
31
+ end
32
+
33
+ no_tasks do
34
+ def class_name(entity)
35
+ @no_prefix ? entity.name : entity.name[3..-1]
36
+ end
37
+ end
38
+
39
+ desc "setup", "setup FWToolkit testing for the current workspace"
40
+ def setup
41
+ Frank::CLI.start(["setup"])
42
+ end
43
+
44
+ desc "build", "build the frankified App for testing"
45
+ method_option :workspace, :aliases => "-w", :default => "#{File.basename(Dir.getwd)}.xcworkspace"
46
+ method_option :scheme, :aliases => "-s", :default => File.basename(Dir.getwd)
47
+ def build
48
+ workspace = options[:workspace]
49
+ scheme = options[:scheme]
50
+ Frank::CLI.start(["build", "--workspace", workspace, "--scheme", scheme])
51
+ end
52
+
53
+ desc "test [TAG]", "run cucumber tests"
54
+ def test(tag = nil)
55
+ Dir.chdir('Frank') do
56
+ command = 'cucumber'
57
+ if tag
58
+ command = "cucumber --tag #{tag}"
59
+ end
60
+
61
+ sh command do |ok,res|
62
+ exit res.exitstatus
63
+ end
64
+ end
65
+ end
66
+ end
67
+
68
+ end
@@ -0,0 +1,62 @@
1
+ require 'pickle'
2
+
3
+ module FWToolkit
4
+ module Test
5
+ class FrankModel
6
+
7
+ attr_accessor :id, :core_data_entity
8
+
9
+ module PickleAdapter
10
+ include Pickle::Adapter::Base
11
+
12
+ # Gets a list of the available models for this adapter
13
+ def self.model_classes
14
+ klasses = ::FWToolkit::Test::FrankModel.__send__(:descendants)
15
+
16
+ #klasses.select do |klass|
17
+ # !klass.abstract_class? && klass.table_exists? && !except_classes.include?(klass.name)
18
+ #end
19
+ end
20
+
21
+ # get a list of column names for a given class
22
+ def self.column_names(klass)
23
+ #klass.column_names
24
+ []
25
+ end
26
+
27
+ # Get an instance by id of the model
28
+ def self.get_model(klass, id)
29
+ FWToolkit::Test::FrankModel.object_in_cache(id)
30
+ end
31
+
32
+ # Find the first instance matching conditions
33
+ def self.find_first_model(klass, conditions)
34
+ #klass.find(:first, :conditions => conditions)
35
+ puts "find_first_model"
36
+ end
37
+
38
+ # Find all models matching conditions
39
+ def self.find_all_models(klass, conditions)
40
+ #klass.find(:all, :conditions => conditions)
41
+ puts "find_all_models"
42
+ end
43
+
44
+ # Create a model using attributes
45
+ def self.create_model(klass, attributes)
46
+ puts "create_model"
47
+ end
48
+ end
49
+
50
+ @@object_cache = {}
51
+
52
+ def self.object_in_cache(id)
53
+ return @@object_cache[id.to_s]
54
+ end
55
+
56
+ def save!
57
+ self.id = self.object_id
58
+ @@object_cache[self.object_id.to_s] = self
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,9 @@
1
+ # This file is generated by FWToolkit and is covered by the license at
2
+ #
3
+ require 'fwtoolkit/test/model_helper'
4
+
5
+ Given /^the app is (online|offline)$/ do |val|
6
+ online = (val.eql? "online")
7
+ fwt_app_exec("setRKObjectManagerIsOnline:", online)
8
+ sleep 5
9
+ end
@@ -0,0 +1,141 @@
1
+ require 'mimic'
2
+ require 'socket'
3
+ require 'net/http'
4
+ require 'json'
5
+ require 'erb'
6
+ require 'frank-cucumber/gateway'
7
+ require 'pickle/world'
8
+ require 'cfpropertylist'
9
+
10
+ module FWToolkit
11
+ module Test
12
+ module ModelHelpers
13
+
14
+ def mimic_server(port=11988)
15
+ @mimic = Mimic.mimic(:port => port) unless @mimic
16
+ @mimic
17
+ end
18
+
19
+ # todo: remove default response_content_type
20
+ def queue_mimic_get_response(path, content, response_content_type = 'application/xml')
21
+ mimic_server.get(path).returning(content, 200, {'Content-Type' => response_content_type})
22
+ end
23
+
24
+ def fwt_app_exec(method_name, *method_args)
25
+ operation_map = Frank::Cucumber::Gateway.build_operation_map(method_name,method_args)
26
+
27
+ res = frank_server.send_post(
28
+ 'app_exec',
29
+ :operation => operation_map
30
+ )
31
+
32
+ return Frank::Cucumber::Gateway.evaluate_frankly_response( res, "app_exec #{method_name}" )
33
+ end
34
+
35
+ def fwt_template_response(template_file_name, capture_models = [], options = nil)
36
+
37
+ # probably should put some asserts in here
38
+ # template_file_name should be single if capture_models.count == 0
39
+ # template_file_name should be plural if capture_models.count > 0
40
+ unless capture_models.empty?
41
+ factory, name_or_index = *parse_model(capture_models[0])
42
+ unless template_file_name
43
+ template_file_name = factory.pluralize
44
+ end
45
+
46
+ objects = []
47
+ capture_models.each do |capture_model|
48
+ objects << model!(capture_model)
49
+ end
50
+
51
+ eval("@#{factory.pluralize} = objects")
52
+ eval("@#{factory} = objects.first")
53
+ end
54
+
55
+ if options
56
+ options.each do |option|
57
+ key, value = option.split(":")
58
+ eval("@#{key} = value")
59
+ end
60
+ end
61
+
62
+ template_file = File.join(Dir.pwd, 'features', 'support', 'templates', "#{template_file_name}.erb")
63
+ erb = ERB.new(File.open(template_file).read, 0,"")
64
+ result = erb.result(binding)
65
+
66
+ # cleanup
67
+ unless capture_models.empty?
68
+ eval("@#{factory.pluralize} = nil")
69
+ eval("@#{factory} = nil")
70
+ end
71
+
72
+ if options
73
+ options.each do |option|
74
+ key, value = option.split(":")
75
+ eval("@#{key} = nil")
76
+ end
77
+ end
78
+
79
+ result
80
+ end
81
+
82
+ def fwt_simulator_applications_dir
83
+ File.join(Dir.home, 'Library', 'Application Support', 'iPhone Simulator', fwt_ios_sdk, 'Applications')
84
+ end
85
+
86
+ def fwt_kill_simulator
87
+ `echo 'application "iPhone Simulator" quit' | osascript`
88
+ end
89
+
90
+ def fwt_simulator_reset_data(sdk)
91
+ fwt_kill_simulator
92
+ FileUtils.rm_rf(fwt_simulator_applications_dir)
93
+ end
94
+
95
+ def fwt_launch_app(device='iphone')
96
+ launch_app fwt_app_path, fwt_ios_sdk, device
97
+ end
98
+
99
+ def fwt_ios_sdk
100
+ raise "IOS_SDK not defined. Please define this in your env.rb, i.e. IOS_SDK='5.1'" unless defined?(IOS_SDK)
101
+ IOS_SDK
102
+ end
103
+
104
+ def fwt_app_path
105
+ raise "APP_BUNDLE_PATH not defined. Please define this in your env.rb, i.e. APP_BUNDLE_PATH='File.expand_path( '../../../frankified_build/Frankified.app', __FILE__ )'" unless defined?(APP_BUNDLE_PATH)
106
+ raise "File defined in APP_BUNDLE_PATH (#{APP_BUNDLE_PATH}) does not exist" unless File.exists?(APP_BUNDLE_PATH)
107
+ APP_BUNDLE_PATH
108
+ end
109
+
110
+ def fwt_seed_app(model_names=[])
111
+ objects = model_names.collect{|n| model!(n)}
112
+ fwt_app_exec("seedCoreData:", objects.to_json)
113
+ end
114
+
115
+ def fwt_set_user_defaults(bundle_identifier, user_defaults)
116
+
117
+ app_dir = Dir.entries(fwt_simulator_applications_dir)
118
+ app_dir.delete "."
119
+ app_dir.delete ".."
120
+ plist_file = File.join(fwt_simulator_applications_dir, app_dir.first, 'Library', 'Preferences', "#{bundle_identifier}.plist")
121
+
122
+ plist = CFPropertyList::List.new(:file => plist_file)
123
+ data = CFPropertyList.native_types(plist.value)
124
+ data.merge! user_defaults
125
+ plist.value = CFPropertyList.guess(data)
126
+ plist.save(plist_file, CFPropertyList::List::FORMAT_BINARY)
127
+
128
+ end
129
+
130
+ end
131
+ end
132
+ end
133
+ World(FWToolkit::Test::ModelHelpers)
134
+
135
+ Before do |scenario|
136
+ fwt_simulator_reset_data(fwt_ios_sdk)
137
+ end
138
+
139
+ After do |scenario|
140
+ Mimic.cleanup!
141
+ end
@@ -0,0 +1,19 @@
1
+ # This file is generated by FWToolkit and is covered by the license at
2
+ #
3
+ require 'fwtoolkit/test/model_helper.rb'
4
+
5
+ Given /^the server responds with(?: "([^\"]*)" for)? path "([^\"]*)" 0 ([^"]*)$/ do |template_file_name, path, variable_name|
6
+ eval("@#{variable_name} = []")
7
+ content = fwt_template_response(template_file_name != nil ? template_file_name : variable_name)
8
+ queue_mimic_get_response(path, content)
9
+ end
10
+
11
+ Given /^the server responds with "([^\"]*)" for path "([^\"]*)" with #{capture_model}(?: with #{capture_fields})?$/ do |template_file_name, path, capture_model, options|
12
+ content = fwt_template_response(template_file_name, [capture_model], options)
13
+ queue_mimic_get_response(path, content)
14
+ end
15
+
16
+ Given /^the server responds with "([^\"]*)" for path "([^\"]*)" with #{capture_model} and #{capture_model}(?: with #{capture_fields})?$/ do |template_file_name, path, capture_model_1, capture_model_2, options|
17
+ content = fwt_template_response(template_file_name, [capture_model_1, capture_model_2], options)
18
+ queue_mimic_get_response(path, content)
19
+ end
@@ -0,0 +1,60 @@
1
+ module FWToolkit
2
+ module Test
3
+ module NetworkHelpers
4
+
5
+ #Given /^the network simulates a 3G connection
6
+ #ipfw add pipe 1 all from any to any out
7
+ #ipfw add pipe 2 all from any to any in
8
+ #ipfw pipe 1 config bw 64Kbit/s
9
+ #ipfw pipe 2 config bw 128Kbit/s
10
+
11
+ def ipfw_reset_rule_number
12
+ @@ipfw_rule_number = 1
13
+ end
14
+
15
+ def ipfw_exit_unless_clean
16
+ ipfw_list = `sudo ipfw list`
17
+ if ipfw_list =~ /^(?!65535 allow ip from any to any$).*/
18
+ puts 'The firewall table contains rules other than the default. Run `sudo ipfw flush` before rerunning cucumber if you don\'t need these rules.'
19
+ exit -1
20
+ end
21
+ end
22
+
23
+ def ipfw_deny(host='localhost')
24
+ `sudo ipfw add #{@@ipfw_rule_number} deny tcp from any to #{host}`
25
+ @@ipfw_rule_number += 1
26
+ end
27
+
28
+ def ipfw_flush
29
+ `sudo ipfw flush`
30
+ end
31
+ end
32
+ end
33
+ end
34
+ World(FWToolkit::Test::NetworkHelpers)
35
+
36
+ # Check IPFW because we flush firewall rules at the end of each scenario
37
+ # If we have anything but the default rule, warn the user and exit
38
+ Before do
39
+ ipfw_exit_unless_clean
40
+ ipfw_reset_rule_number
41
+ end
42
+
43
+ After do
44
+ ipfw_flush
45
+ end
46
+
47
+ #
48
+ # Steps
49
+ #
50
+ Given /^the network has no connection$/ do
51
+ ipfw_deny
52
+ end
53
+
54
+ Then /^the network is returned to its original state$/ do
55
+ ipfw_flush
56
+ end
57
+
58
+
59
+
60
+
@@ -0,0 +1,101 @@
1
+ # this file generated by script/generate pickle
2
+ require 'pickle/world'
3
+
4
+ # create a model
5
+ Given(/^#{capture_model} exists?(?: with #{capture_fields})?$/) do |name, fields|
6
+ create_model(name, fields)
7
+ end
8
+
9
+ # create n models
10
+ Given(/^(\d+) #{capture_plural_factory} exist(?: with #{capture_fields})?$/) do |count, plural_factory, fields|
11
+ count.to_i.times { create_model(plural_factory.singularize, fields) }
12
+ end
13
+
14
+ # create models from a table
15
+ Given(/^the following #{capture_plural_factory} exists?:?$/) do |plural_factory, table|
16
+ create_models_from_table(plural_factory, table)
17
+ end
18
+
19
+ # find a model
20
+ Then(/^#{capture_model} should exist(?: with #{capture_fields})?$/) do |name, fields|
21
+ find_model!(name, fields)
22
+ end
23
+
24
+ # not find a model
25
+ Then(/^#{capture_model} should not exist(?: with #{capture_fields})?$/) do |name, fields|
26
+ find_model(name, fields).should be_nil
27
+ end
28
+
29
+ # find models with a table
30
+ Then(/^the following #{capture_plural_factory} should exists?:?$/) do |plural_factory, table|
31
+ find_models_from_table(plural_factory, table).should_not be_any(&:nil?)
32
+ end
33
+
34
+ # find exactly n models
35
+ Then(/^(\d+) #{capture_plural_factory} should exist(?: with #{capture_fields})?$/) do |count, plural_factory, fields|
36
+ find_models(plural_factory.singularize, fields).size.should == count.to_i
37
+ end
38
+
39
+ # assert equality of models
40
+ Then(/^#{capture_model} should be #{capture_model}$/) do |a, b|
41
+ model!(a).should == model!(b)
42
+ end
43
+
44
+ # assert model is in another model's has_many assoc
45
+ Then(/^#{capture_model} should be (?:in|one of|amongst) #{capture_model}(?:'s)? (\w+)$/) do |target, owner, association|
46
+ model!(owner).send(association).should include(model!(target))
47
+ end
48
+
49
+ # assert model is not in another model's has_many assoc
50
+ Then(/^#{capture_model} should not be (?:in|one of|amongst) #{capture_model}(?:'s)? (\w+)$/) do |target, owner, association|
51
+ model!(owner).send(association).should_not include(model!(target))
52
+ end
53
+
54
+ # assert model is another model's has_one/belongs_to assoc
55
+ Then(/^#{capture_model} should be #{capture_model}(?:'s)? (\w+)$/) do |target, owner, association|
56
+ model!(owner).send(association).should == model!(target)
57
+ end
58
+
59
+ # assert model is not another model's has_one/belongs_to assoc
60
+ Then(/^#{capture_model} should not be #{capture_model}(?:'s)? (\w+)$/) do |target, owner, association|
61
+ model!(owner).send(association).should_not == model!(target)
62
+ end
63
+
64
+ # assert model.predicate?
65
+ Then(/^#{capture_model} should (?:be|have) (?:an? )?#{capture_predicate}$/) do |name, predicate|
66
+ if model!(name).respond_to?("has_#{predicate.gsub(' ', '_')}")
67
+ model!(name).should send("have_#{predicate.gsub(' ', '_')}")
68
+ else
69
+ model!(name).should send("be_#{predicate.gsub(' ', '_')}")
70
+ end
71
+ end
72
+
73
+ # assert not model.predicate?
74
+ Then(/^#{capture_model} should not (?:be|have) (?:an? )?#{capture_predicate}$/) do |name, predicate|
75
+ if model!(name).respond_to?("has_#{predicate.gsub(' ', '_')}")
76
+ model!(name).should_not send("have_#{predicate.gsub(' ', '_')}")
77
+ else
78
+ model!(name).should_not send("be_#{predicate.gsub(' ', '_')}")
79
+ end
80
+ end
81
+
82
+ # model.attribute.should eql(value)
83
+ # model.attribute.should_not eql(value)
84
+ Then(/^#{capture_model}'s (\w+) (should(?: not)?) be #{capture_value}$/) do |name, attribute, expectation, expected|
85
+ actual_value = model(name).send(attribute)
86
+ expectation = expectation.gsub(' ', '_')
87
+
88
+ case expected
89
+ when 'nil', 'true', 'false'
90
+ actual_value.send(expectation, send("be_#{expected}"))
91
+ when /^[+-]?[0-9_]+(\.\d+)?$/
92
+ actual_value.send(expectation, eql(expected.to_f))
93
+ else
94
+ actual_value.to_s.send(expectation, eql(eval(expected)))
95
+ end
96
+ end
97
+
98
+ # assert size of association
99
+ Then /^#{capture_model} should have (\d+) (\w+)$/ do |name, size, association|
100
+ model!(name).send(association).size.should == size.to_i
101
+ end
@@ -0,0 +1,19 @@
1
+ module FWToolkit
2
+ module Test
3
+ module UIHelpers
4
+ def fwt_set_textfield_text(text_field_mark, text_to_type)
5
+ text_field_selector = "textField marked:'#{text_field_mark}'"
6
+ if element_exists(text_field_selector)
7
+ touch( text_field_selector )
8
+ else
9
+ raise "Could not find [#{text_field_mark}], it does not exist."
10
+ end
11
+
12
+ frankly_map( text_field_selector, 'becomeFirstResponder' )
13
+ frankly_map( text_field_selector, 'setText:', text_to_type )
14
+ frankly_map( text_field_selector, 'endEditing:', true )
15
+ end
16
+ end
17
+ end
18
+ end
19
+ World(FWToolkit::Test::UIHelpers)
@@ -0,0 +1,17 @@
1
+ # This file is generated by FWToolkit and is covered by the license at
2
+ #
3
+
4
+ require 'fwtoolkit/test/ui_helper.rb'
5
+
6
+ When /^I touch the "(.*?)" button on the alert view$/ do |arg1|
7
+ touch("view:'UIAlertButton' marked:'#{arg1}'")
8
+ end
9
+
10
+ When /^I type "([^\"]*)"$/ do |cmd|
11
+ type_into_keyboard(cmd, :append_return => false)
12
+ end
13
+
14
+ Then /^"([^\"]*)" is disabled$/ do |mark|
15
+ raise "#{mark} is not disabled" unless frankly_map("view marked:'#{mark}'", 'isEnabled')
16
+ end
17
+
@@ -0,0 +1,3 @@
1
+ module FWToolkit
2
+ VERSION = "0.0.6"
3
+ end
data/lib/fwtoolkit.rb ADDED
@@ -0,0 +1,22 @@
1
+ require 'erb'
2
+ require 'thor'
3
+ require 'rexml/document'
4
+ require 'core_data'
5
+
6
+ require 'fwtoolkit/version'
7
+ require 'fwtoolkit/test/frank_model'
8
+
9
+ module FWToolkit
10
+ def self.root
11
+ File.expand_path '../..', __FILE__
12
+ end
13
+ end
14
+
15
+ class String
16
+ def ruby_format
17
+ self.gsub(/(.)([A-Z])/,'\1_\2').downcase
18
+ end
19
+ def ruby_format!
20
+ replace ruby_format
21
+ end
22
+ end
@@ -0,0 +1,10 @@
1
+ # Generated code
2
+ require 'factory_girl'
3
+
4
+ FactoryGirl.define do
5
+ <% @models.each do |next_model| %>
6
+ factory :<%= class_name(next_model).ruby_format %> do
7
+
8
+ end
9
+ <% end %>
10
+ end
@@ -0,0 +1,33 @@
1
+ # Generated code
2
+ class <%= class_name(@model) %> < FWToolkit::Test::FrankModel
3
+ # attributes
4
+ attr_accessor <%= @model.attributes.map{|p| ":#{p.name.ruby_format}"}.join(', ') %>
5
+ # relationships
6
+ attr_reader <%= @model.relationships.select{|r| r.inverse != nil}.map{|r| ":#{r.name.ruby_format}"}.join(', ') %>
7
+
8
+ def initialize
9
+ @core_data_entity = '<%= @model.name %>'
10
+ end
11
+
12
+ # inverse relationship setters
13
+ <% @model.relationships.select{|r| not r.to_many? and r.inverse}.each do |r| %><% name = r.name.ruby_format %>
14
+ def <%= name %>=(_<%= name %>)
15
+ @<%= name %> = _<%= name %>
16
+ unless @<%= name %>.<%= r.inverse.ruby_format %>
17
+ @<%= name %>.<%= r.inverse.ruby_format %> = []
18
+ end
19
+ @<%= name %>.<%= r.inverse.ruby_format %> << self
20
+ end
21
+ <% end %>
22
+
23
+ # lazy initialisation of to_many relationships
24
+ <% @model.relationships.select{|r| r.to_many? and r.inverse}.each do |r| %><% name = r.name.ruby_format %>
25
+ def <%= name %>
26
+ @<%= name %> ||= []
27
+ end
28
+ <% end %>
29
+
30
+ def as_json(options={})
31
+ {'<%= @model.name %>' => {<%= @model.attributes.map {|p| ":#{p.name} => @#{p.name.ruby_format}"}.join(', ') %>}}
32
+ end
33
+ end
metadata ADDED
@@ -0,0 +1,236 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fwtoolkit
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.6
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Matt Brooke-Smith
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-09-14 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: cucumber
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: aruba
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: ruby-debug19
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: thor
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - '='
68
+ - !ruby/object:Gem::Version
69
+ version: 0.14.6
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - '='
76
+ - !ruby/object:Gem::Version
77
+ version: 0.14.6
78
+ - !ruby/object:Gem::Dependency
79
+ name: core_data
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - '='
84
+ - !ruby/object:Gem::Version
85
+ version: 0.0.4
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - '='
92
+ - !ruby/object:Gem::Version
93
+ version: 0.0.4
94
+ - !ruby/object:Gem::Dependency
95
+ name: factory_girl
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: pickle
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - '='
116
+ - !ruby/object:Gem::Version
117
+ version: 0.4.10
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - '='
124
+ - !ruby/object:Gem::Version
125
+ version: 0.4.10
126
+ - !ruby/object:Gem::Dependency
127
+ name: activesupport
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - '='
132
+ - !ruby/object:Gem::Version
133
+ version: 3.2.6
134
+ type: :runtime
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - '='
140
+ - !ruby/object:Gem::Version
141
+ version: 3.2.6
142
+ - !ruby/object:Gem::Dependency
143
+ name: mimic
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - '='
148
+ - !ruby/object:Gem::Version
149
+ version: 0.4.3
150
+ type: :runtime
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - '='
156
+ - !ruby/object:Gem::Version
157
+ version: 0.4.3
158
+ - !ruby/object:Gem::Dependency
159
+ name: frank-cucumber
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - '='
164
+ - !ruby/object:Gem::Version
165
+ version: 0.9.5.pre6
166
+ type: :runtime
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - '='
172
+ - !ruby/object:Gem::Version
173
+ version: 0.9.5.pre6
174
+ - !ruby/object:Gem::Dependency
175
+ name: CFPropertyList
176
+ requirement: !ruby/object:Gem::Requirement
177
+ none: false
178
+ requirements:
179
+ - - '='
180
+ - !ruby/object:Gem::Version
181
+ version: 2.1.1
182
+ type: :runtime
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - '='
188
+ - !ruby/object:Gem::Version
189
+ version: 2.1.1
190
+ description: ''
191
+ email:
192
+ - matt@futureworkshops.com
193
+ executables:
194
+ - fwt
195
+ extensions: []
196
+ extra_rdoc_files: []
197
+ files:
198
+ - bin/fwt
199
+ - lib/fwtoolkit.rb
200
+ - lib/fwtoolkit/cli.rb
201
+ - lib/fwtoolkit/test/frank_model.rb
202
+ - lib/fwtoolkit/test/misc_steps.rb
203
+ - lib/fwtoolkit/test/model_helper.rb
204
+ - lib/fwtoolkit/test/model_steps.rb
205
+ - lib/fwtoolkit/test/network_steps.rb
206
+ - lib/fwtoolkit/test/pickle_steps.rb
207
+ - lib/fwtoolkit/test/ui_helper.rb
208
+ - lib/fwtoolkit/test/ui_steps.rb
209
+ - lib/fwtoolkit/version.rb
210
+ - templates/models/factories.rb.erb
211
+ - templates/models/model.rb.erb
212
+ homepage: ''
213
+ licenses: []
214
+ post_install_message:
215
+ rdoc_options: []
216
+ require_paths:
217
+ - lib
218
+ required_ruby_version: !ruby/object:Gem::Requirement
219
+ none: false
220
+ requirements:
221
+ - - ! '>='
222
+ - !ruby/object:Gem::Version
223
+ version: '0'
224
+ required_rubygems_version: !ruby/object:Gem::Requirement
225
+ none: false
226
+ requirements:
227
+ - - ! '>='
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ requirements: []
231
+ rubyforge_project:
232
+ rubygems_version: 1.8.24
233
+ signing_key:
234
+ specification_version: 3
235
+ summary: ''
236
+ test_files: []