repo_manager 0.7.1

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.
Files changed (116) hide show
  1. data/.gemfiles +115 -0
  2. data/.gitattributes +1 -0
  3. data/.gitignore +7 -0
  4. data/.rspec +3 -0
  5. data/.yardopts +11 -0
  6. data/Gemfile +11 -0
  7. data/Gemfile.lock +99 -0
  8. data/Guardfile +63 -0
  9. data/HISTORY.markdown +12 -0
  10. data/LICENSE +20 -0
  11. data/README.markdown +192 -0
  12. data/Rakefile +94 -0
  13. data/TODO.markdown +15 -0
  14. data/VERSION +1 -0
  15. data/bin/repo +151 -0
  16. data/cucumber.yml +28 -0
  17. data/examples/pc_saved_game_backup/.gitignore +2 -0
  18. data/examples/pc_saved_game_backup/INSTALL.markdown +420 -0
  19. data/examples/pc_saved_game_backup/README.markdown +108 -0
  20. data/examples/pc_saved_game_backup/remote/.gitignore +2 -0
  21. data/examples/pc_saved_game_backup/repo_manager/Gemfile +12 -0
  22. data/examples/pc_saved_game_backup/repo_manager/Gemfile.lock +66 -0
  23. data/examples/pc_saved_game_backup/repo_manager/assets/.gitignore +2 -0
  24. data/examples/pc_saved_game_backup/repo_manager/features/support/aruba.rb +15 -0
  25. data/examples/pc_saved_game_backup/repo_manager/features/support/env.rb +11 -0
  26. data/examples/pc_saved_game_backup/repo_manager/features/support/steps.rb +3 -0
  27. data/examples/pc_saved_game_backup/repo_manager/features/tasks/update.feature +144 -0
  28. data/examples/pc_saved_game_backup/repo_manager/global/default/asset.conf +2 -0
  29. data/examples/pc_saved_game_backup/repo_manager/repo.conf +64 -0
  30. data/examples/pc_saved_game_backup/repo_manager/tasks/.gitignore +0 -0
  31. data/examples/pc_saved_game_backup/repo_manager/tasks/remote.rb +57 -0
  32. data/examples/pc_saved_game_backup/repo_manager/tasks/update.rb +65 -0
  33. data/examples/pc_saved_game_backup/saved_games/hearts/save1 +1 -0
  34. data/examples/pc_saved_game_backup/saved_games/hearts/save2 +1 -0
  35. data/examples/pc_saved_game_backup/saved_games/mines/my_profile.ini +1 -0
  36. data/examples/pc_saved_game_backup/saved_games/mines/saves/save1 +1 -0
  37. data/examples/pc_saved_game_backup/saved_games/mines/saves/save2 +1 -0
  38. data/features/actions/git.feature +296 -0
  39. data/features/actions/help.feature +53 -0
  40. data/features/actions/list.feature +624 -0
  41. data/features/actions/path.feature +195 -0
  42. data/features/actions/status.feature +261 -0
  43. data/features/actions/task.feature +127 -0
  44. data/features/assets/configuration.feature +204 -0
  45. data/features/assets/rendering.feature +42 -0
  46. data/features/assets/user_attributes.feature +98 -0
  47. data/features/bin.feature +42 -0
  48. data/features/logger.feature +218 -0
  49. data/features/settings.feature +240 -0
  50. data/features/support/aruba.rb +15 -0
  51. data/features/support/env.rb +11 -0
  52. data/features/support/steps.rb +3 -0
  53. data/features/tasks/add/asset.feature +178 -0
  54. data/features/tasks/generate/init.feature +56 -0
  55. data/lib/repo_manager.rb +36 -0
  56. data/lib/repo_manager/actions.rb +8 -0
  57. data/lib/repo_manager/actions/action_helper.rb +39 -0
  58. data/lib/repo_manager/actions/app_action.rb +30 -0
  59. data/lib/repo_manager/actions/base_action.rb +296 -0
  60. data/lib/repo_manager/actions/git_action.rb +113 -0
  61. data/lib/repo_manager/actions/help_action.rb +52 -0
  62. data/lib/repo_manager/actions/list_action.rb +123 -0
  63. data/lib/repo_manager/actions/path_action.rb +22 -0
  64. data/lib/repo_manager/actions/status_action.rb +192 -0
  65. data/lib/repo_manager/actions/task_action.rb +71 -0
  66. data/lib/repo_manager/app.rb +116 -0
  67. data/lib/repo_manager/assets.rb +3 -0
  68. data/lib/repo_manager/assets/app_asset.rb +15 -0
  69. data/lib/repo_manager/assets/asset_accessors.rb +67 -0
  70. data/lib/repo_manager/assets/asset_configuration.rb +137 -0
  71. data/lib/repo_manager/assets/asset_manager.rb +72 -0
  72. data/lib/repo_manager/assets/base_asset.rb +199 -0
  73. data/lib/repo_manager/assets/repo_asset.rb +30 -0
  74. data/lib/repo_manager/core.rb +2 -0
  75. data/lib/repo_manager/core/array.rb +21 -0
  76. data/lib/repo_manager/core/hash.rb +83 -0
  77. data/lib/repo_manager/errors.rb +10 -0
  78. data/lib/repo_manager/extensions/hash.rb +86 -0
  79. data/lib/repo_manager/git.rb +2 -0
  80. data/lib/repo_manager/git/lib.rb +69 -0
  81. data/lib/repo_manager/git/status.rb +196 -0
  82. data/lib/repo_manager/logger.rb +39 -0
  83. data/lib/repo_manager/settings.rb +98 -0
  84. data/lib/repo_manager/tasks.rb +3 -0
  85. data/lib/repo_manager/tasks/add/asset.rb +213 -0
  86. data/lib/repo_manager/tasks/generate/init.rb +42 -0
  87. data/lib/repo_manager/tasks/generate/templates/config/repo.conf.tt +61 -0
  88. data/lib/repo_manager/tasks/generate/templates/init/assets/.gitignore +0 -0
  89. data/lib/repo_manager/tasks/generate/templates/init/global/default/asset.conf +2 -0
  90. data/lib/repo_manager/tasks/generate/templates/init/tasks/.gitignore +0 -0
  91. data/lib/repo_manager/tasks/task_manager.rb +166 -0
  92. data/lib/repo_manager/tasks/thor_helper.rb +29 -0
  93. data/lib/repo_manager/test/asset_steps.rb +19 -0
  94. data/lib/repo_manager/test/base_steps.rb +152 -0
  95. data/lib/repo_manager/test/repo_api.rb +41 -0
  96. data/lib/repo_manager/test/repo_steps.rb +83 -0
  97. data/lib/repo_manager/test/test_api.rb +88 -0
  98. data/lib/repo_manager/views.rb +2 -0
  99. data/lib/repo_manager/views/app_view.rb +15 -0
  100. data/lib/repo_manager/views/base_view.rb +137 -0
  101. data/lib/repo_manager/views/templates/css/basic.css +26 -0
  102. data/lib/repo_manager/views/templates/default.erb +40 -0
  103. data/lib/repo_manager/views/templates/default.slim +37 -0
  104. data/lib/repo_manager/views/view_helper.rb +55 -0
  105. data/repo_manager.gemspec +75 -0
  106. data/spec/basic_app/actions/action_helper_spec.rb +54 -0
  107. data/spec/basic_app/assets/base_asset_spec.rb +210 -0
  108. data/spec/basic_app/core_spec.rb +78 -0
  109. data/spec/basic_app/settings_spec.rb +64 -0
  110. data/spec/basic_app/views/view_helper_spec.rb +28 -0
  111. data/spec/basic_gem/aruba_helper_spec.rb +33 -0
  112. data/spec/basic_gem/basic_gem_spec.rb +84 -0
  113. data/spec/basic_gem/gemspec_spec.rb +68 -0
  114. data/spec/repo_manager/git_spec.rb +31 -0
  115. data/spec/spec_helper.rb +25 -0
  116. metadata +472 -0
@@ -0,0 +1,42 @@
1
+ require 'fileutils'
2
+ require 'repo_manager/views/view_helper'
3
+
4
+ module RepoManager
5
+ class Generate < Thor
6
+ namespace :generate
7
+ include Thor::Actions
8
+ include RepoManager::ThorHelper
9
+ include ::RepoManager::ViewHelper
10
+
11
+ desc "init PATH", "create the initial configuration file and folder structure"
12
+ def init(path)
13
+ logger.debug "init task initial configuration: #{configuration.inspect}"
14
+
15
+ # create instance var so that it can be referenced in templates
16
+ @path = path ? File.expand_path(path) : FileUtils.pwd
17
+
18
+ source = path_to(:repo_manager, File.join('lib', 'repo_manager', 'tasks', 'generate', 'templates', 'config', 'repo.conf.tt'))
19
+ destination = File.join(@path, 'repo.conf')
20
+
21
+ say_status :init, "creating initial config file at '#{destination}'"
22
+ template(source, destination)
23
+
24
+ source = path_to(:repo_manager, File.join('lib', 'repo_manager', 'tasks', 'generate', 'templates', 'init', '.'))
25
+ destination = @path
26
+
27
+ say_status :init, "creating initial file structure in '#{destination}'"
28
+ directory(source, destination)
29
+
30
+ return 0
31
+ end
32
+
33
+ private
34
+
35
+ # where to start looking, required by the template method
36
+ def self.source_root
37
+ File.dirname(__FILE__)
38
+ end
39
+
40
+
41
+ end
42
+ end
@@ -0,0 +1,61 @@
1
+ ---
2
+ # default CLI options
3
+ options:
4
+ color : AUTO
5
+ verbose : false
6
+ short : false
7
+ unmodified : HIDE
8
+ match : ALL
9
+ list : ALL
10
+
11
+ folders:
12
+
13
+ # main repo configuration files
14
+ assets : <%= "#{@path}/assets" %>
15
+
16
+ #
17
+ # repo user tasks, file extentions can be '.rb' or '.thor'
18
+ #
19
+ # @examples:
20
+ #
21
+ # linux:
22
+ #
23
+ # ~/.repo_manager/tasks
24
+ #
25
+ # win32
26
+ #
27
+ # c:/dat/condenser/tasks
28
+ #
29
+ tasks : <%= "#{@path}/tasks" %>
30
+
31
+ # git commands must be whitelisted
32
+ commands:
33
+ - diff
34
+ - grep
35
+ - log
36
+ - ls-files
37
+ - show
38
+ - status
39
+
40
+ logging:
41
+ loggers:
42
+ - name : root
43
+ appenders:
44
+ - logfile
45
+ - stdout
46
+ appenders:
47
+ - type : Stdout
48
+ name : stdout
49
+ level : info
50
+ layout:
51
+ type : Pattern
52
+ pattern : '%l %c : %m\n'
53
+ color_scheme: default
54
+ - type : File
55
+ name : logfile
56
+ level : info
57
+ truncate : true
58
+ filename : '<%= "#{@path}/repo.log" %>'
59
+ layout:
60
+ type : Pattern
61
+ pattern : '[%d] %l %c : %m\n'
@@ -0,0 +1,166 @@
1
+ require 'thor'
2
+ require 'thor/core_ext/file_binary_read'
3
+ require 'thor/util'
4
+
5
+ # embed Thor engine to allow extendable tasks
6
+ module RepoManager
7
+ class TaskManager
8
+
9
+ attr_accessor :configuration
10
+
11
+ def initialize(configuration=nil)
12
+ @configuration = configuration.dup
13
+ options = @configuration[:options]
14
+ self.color = options ? options[:color] : true
15
+ end
16
+
17
+ # @examples:
18
+ #
19
+ # find_by_namespace(sweep:screenshots)
20
+ # find_by_namespace(repo_manager:sweep:screenshots)
21
+ #
22
+ # returns:
23
+ #
24
+ # RepoManager::Sweep, screenshots
25
+ #
26
+ # @return [Class, String] the Thor class and the task
27
+ def find_by_namespace(name)
28
+ names = name.to_s.split(':')
29
+ raise "invalid task namespace" unless names.any?
30
+
31
+ namespace = names.join(":")
32
+
33
+ #puts "searching for task #{namespace}"
34
+ klass, task = ::Thor::Util.find_class_and_task_by_namespace(namespace, fallback = false)
35
+ end
36
+
37
+ #
38
+ # @examples:
39
+ #
40
+ # invoke(sweep:screenshots)
41
+ # invoke(update:models)
42
+ # invoke(generate:init, ["."], nil)
43
+ #
44
+ def invoke(name, args=ARGV)
45
+ logger.debug "invoke name: #{name}, args #{args.inspect}, configuration defined: #{configuration ? 'yes' : 'no'}"
46
+ args = args.dup
47
+ load_tasks
48
+
49
+ logger.debug "find_by_namespace: #{name}"
50
+ klass, task = find_by_namespace(name)
51
+
52
+ if klass
53
+ config = {}
54
+ config[:shell] ||= shell
55
+ klass.send(:dispatch, task, args, nil, config) do |instance|
56
+ if defined?(instance.configuration)
57
+ instance.configuration = configuration.dup
58
+ end
59
+ end
60
+ logger.debug "after invoke"
61
+ result = 0
62
+ else
63
+ puts "Could not find task #{name}"
64
+ result = 1
65
+ end
66
+ result
67
+ end
68
+
69
+ # load all the tasks in this gem plus the user's own repo_manager task folder
70
+ #
71
+ # NOTE: doesn't load any default tasks or non-RepoManager tasks
72
+ def load_tasks
73
+ return if @loaded
74
+
75
+ # By convention, the '*_helper.rb' files are helpers and need to be loaded first. Load
76
+ # them into the Thor::Sandbox namespace
77
+ Dir.glob( File.join(File.dirname(__FILE__), '**', '*.rb') ).each do |task|
78
+ if task.match(/_helper\.rb$/)
79
+ #logger.debug "load_thorfile helper: #{task}"
80
+ ::Thor::Util.load_thorfile task
81
+ end
82
+ end
83
+
84
+ # Now load the thor files
85
+ Dir.glob( File.join(File.dirname(__FILE__), '**', '*.rb') ).each do |task|
86
+ unless task.match(/_helper\.rb$/)
87
+ #logger.debug "load_thorfile: #{task}"
88
+ ::Thor::Util.load_thorfile task
89
+ end
90
+ end
91
+
92
+ # load user tasks
93
+ if user_tasks_folder
94
+ Dir.glob( File.join([user_tasks_folder, '**', '*.{rb,thor}']) ).each { |task| ::Thor::Util.load_thorfile task if task.match(/_helper\.rb$/) }
95
+ Dir.glob( File.join([user_tasks_folder, '**', '*.{rb,thor}']) ).each { |task| ::Thor::Util.load_thorfile task unless task.match(/_helper\.rb$/) }
96
+ end
97
+
98
+ @loaded = true
99
+ end
100
+
101
+ def user_tasks_folder
102
+ return unless configuration
103
+
104
+ folder = configuration[:folders] ? configuration[:folders][:tasks] : nil
105
+ return unless folder
106
+ return folder if Pathname.new(folder).absolute?
107
+
108
+ if configuration[:configuration_filename]
109
+ base_folder = File.dirname(configuration[:configuration_filename])
110
+ folder = File.join(base_folder, folder)
111
+ end
112
+ end
113
+
114
+ def color
115
+ @color
116
+ end
117
+
118
+ def color=(value)
119
+ @color = value
120
+ if value
121
+ ::Thor::Base.shell = Thor::Shell::Color
122
+ else
123
+ ::Thor::Base.shell = Thor::Shell::Basic
124
+ end
125
+ end
126
+
127
+ def shell
128
+ return @shell if @shell
129
+
130
+ @shell = @color ? ::Thor::Shell::Color.new : ::Thor::Shell::Basic.new
131
+ end
132
+
133
+ # display help for the given task
134
+ #
135
+ def task_help(name)
136
+ load_tasks
137
+
138
+ klass, task = find_by_namespace(name)
139
+
140
+ # set '$thor_runner' to true to display full namespace
141
+ $thor_runner = true
142
+
143
+ klass.task_help(shell , task)
144
+ end
145
+
146
+ # display a list of tasks
147
+ def list_tasks
148
+ load_tasks
149
+
150
+ # set '$thor_runner' to true to display full namespace
151
+ $thor_runner = true
152
+
153
+ list = [] #Thor.printable_tasks(all = true, subcommand = true)
154
+ Thor::Base.subclasses.each do |klass|
155
+ list += klass.printable_tasks(false) unless klass == Thor
156
+ end
157
+ list.sort!{ |a,b| a[0] <=> b[0] }
158
+
159
+ title = "repo_manager tasks"
160
+ shell.say shell.set_color(title, :blue, bold=true)
161
+ shell.say "-" * title.size
162
+ shell.print_table(list, :ident => 2, :truncate => true)
163
+ end
164
+
165
+ end
166
+ end
@@ -0,0 +1,29 @@
1
+ require 'pathname'
2
+ require 'rbconfig'
3
+ require 'repo_manager'
4
+ require 'repo_manager/actions/action_helper'
5
+
6
+ module RepoManager
7
+ module ThorHelper
8
+ include ::RepoManager::ActionHelper
9
+
10
+ # main repo_manager configuration setttings file
11
+ def configuration(configuration_file=nil)
12
+ return @configuration if @configuration
13
+ logger.debug "getting repo_manager configuration"
14
+ app_options = {}
15
+ app_options[:config] = configuration_file || options[:config]
16
+ @configuration = ::RepoManager::Settings.new(nil, app_options)
17
+ end
18
+
19
+ def configuration=(value={})
20
+ logger.debug "setting repo_manager configuration"
21
+ @configuration = value.dup
22
+ end
23
+
24
+ def ruby_binary
25
+ File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'])
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,19 @@
1
+ Given /^the folder "([^"]*)" with the following asset configurations:$/ do |folder, table|
2
+ create_dir(folder) unless File.exists?(File.join(current_dir, folder))
3
+
4
+ table.hashes.each do |hash|
5
+ config = {}
6
+ config.merge!('path' => hash[:path]) if hash[:path]
7
+ config.merge!('parent' => hash[:parent]) if hash[:parent]
8
+ config.merge!('binary' => hash[:binary]) if hash[:binary]
9
+ config.merge!('icon' => hash[:icon]) if hash[:icon]
10
+
11
+ asset_name = hash[:name]
12
+ create_dir(File.join(folder, asset_name))
13
+
14
+ filename = File.join(folder, asset_name, 'asset.conf')
15
+ write_file(filename, config.to_conf)
16
+ end
17
+
18
+ end
19
+
@@ -0,0 +1,152 @@
1
+ require 'fileutils'
2
+ require 'chronic'
3
+ require 'repo_manager/test/test_api'
4
+
5
+ World(RepoManager::TestApi)
6
+
7
+ # Given PENDING: some reason
8
+ Given /^PENDING/ do
9
+ pending
10
+ end
11
+
12
+ Then /^its output should contain "([^"]*)"$/ do |expected|
13
+ assert_partial_output(expected, output_from(@commands.last))
14
+ end
15
+
16
+ Then /^its output should not contain "([^"]*)"$/ do |expected|
17
+ assert_no_partial_output(expected, output_from(@commands.last))
18
+ end
19
+
20
+ Then /^its output should contain:$/ do |expected|
21
+ assert_partial_output(expected, output_from(@commands.last))
22
+ end
23
+
24
+ Then /^its output should not contain:$/ do |expected|
25
+ assert_no_partial_output(expected, output_from(@commands.last))
26
+ end
27
+
28
+ # "the output should match" allows regex in the partial_output, if
29
+ # you don't need regex, use "the output should contain" instead since
30
+ # that way, you don't have to escape regex characters that
31
+ # appear naturally in the output
32
+ Then /^its output should match \/([^\/]*)\/$/ do |expected|
33
+ assert_matching_output(expected, output_from(@commands.last))
34
+ end
35
+
36
+ Then /^its output should not match \/([^\/]*)\/$/ do |expected|
37
+ output_from(@commands.last).should_not =~ /#{expected}/
38
+ end
39
+
40
+ Then /^its output should match:$/ do |expected|
41
+ assert_matching_output(expected, output_from(@commands.last))
42
+ end
43
+
44
+ Then /^its output should not match:$/ do |expected|
45
+ output_from(@commands.last).should_not =~ /#{expected}/
46
+ end
47
+
48
+ Then /^the normalized output should contain:$/ do |partial_output|
49
+ str = process_regex_tokens(Regexp.escape(normalize(partial_output)))
50
+ normalize(all_output).should =~ Regexp.compile(str)
51
+ end
52
+
53
+ Then /^the normalized output should not contain:$/ do |partial_output|
54
+ str = process_regex_tokens(Regexp.escape(normalize(partial_output)))
55
+ normalize(all_output).should_not =~ Regexp.compile(str)
56
+ end
57
+
58
+ Then /^the normalized output should contain exactly:$/ do |partial_output|
59
+ normalize(all_output).should == normalize(partial_output)
60
+ end
61
+
62
+ Then /^the normalized output should match \/([^\/]*)\/$/ do |partial_output|
63
+ normalize(all_output).should =~ /#{normalize(partial_output)}/
64
+ end
65
+
66
+ Then /^the normalized output should not match \/([^\/]*)\/$/ do |partial_output|
67
+ normalize(all_output).should_not =~ /#{normalize(partial_output)}/
68
+ end
69
+
70
+ Then /^the normalized output should match:$/ do |partial_output|
71
+ normalize(all_output).should =~ /#{normalize(partial_output)}/m
72
+ end
73
+
74
+ Then /^the normalized output should not match:$/ do |partial_output|
75
+ normalize(all_output).should_not =~ /#{normalize(partial_output)}/m
76
+ end
77
+
78
+ Then /^the file "([^"]*)" should contain:$/ do |file, partial_content|
79
+ process_and_check_file_content(fullpath(file), partial_content, true)
80
+ end
81
+
82
+ Then /^the file "([^"]*)" should not contain:$/ do |file, partial_content|
83
+ process_and_check_file_content(fullpath(file), partial_content, false)
84
+ end
85
+
86
+ Then /^the file "([^"]*)" should match:$/ do |file, partial_content|
87
+ check_file_content(fullpath(file),/#{partial_content}/, true)
88
+ end
89
+
90
+ Then /^the file "([^"]*)" should not match:$/ do |file, partial_content|
91
+ check_file_content(fullpath(file),/#{partial_content}/, false)
92
+ end
93
+
94
+ Then /^the file "([^"]*)", within (\d+) seconds, should contain:$/ do |file, seconds, partial_content|
95
+ seconds = seconds.to_i
96
+
97
+ lambda {
98
+
99
+ timeout(seconds) do
100
+ begin
101
+ sleep 0.2 unless (seconds == 0)
102
+ end until (seconds == 0 || File.exists?(fullpath(file)))
103
+ end
104
+
105
+ }.should_not raise_exception
106
+
107
+ process_and_check_file_content(fullpath(file), partial_content, true)
108
+ end
109
+
110
+ Given /^the fixture "([^"]*)" is copied to "([^"]*)"$/ do |source, destination|
111
+ in_current_dir do
112
+ source = File.join("../../spec/fixtures/", source)
113
+ _mkdir(File.dirname(destination))
114
+ FileUtils.cp(source, destination)
115
+ end
116
+ end
117
+
118
+ # | filename | mtime | content |
119
+ Given /^the folder "([^"]*)" with the following files:$/ do |folder, table|
120
+ create_dir(folder) unless File.exists?(File.join(current_dir, folder))
121
+ table.hashes.each do |hash|
122
+ filename = hash[:filename]
123
+ content = hash[:content]
124
+ filename = File.join(folder,filename)
125
+ mtime = hash[:mtime] ? Chronic.parse(hash[:mtime]) : Time.now
126
+ write_file(filename, content)
127
+ File.utime(mtime, mtime, fullpath(filename))
128
+ end
129
+ end
130
+
131
+ # | filename | mtime | content |
132
+ Given /^the folder "([^"]*)" with the following binary files:$/ do |folder, table|
133
+ create_dir(folder) unless File.exists?(File.join(current_dir, folder))
134
+ table.hashes.each do |hash|
135
+ filename = hash[:filename]
136
+ filename = File.join(folder,filename)
137
+ mtime = hash[:mtime] ? Chronic.parse(hash[:mtime]) : Time.now
138
+ filesize = hash[:size] || 10
139
+ write_fixed_size_file(filename, filesize.to_i)
140
+ File.utime(mtime, mtime, fullpath(filename))
141
+ end
142
+ end
143
+
144
+ Given /^the following empty files:$/ do |files|
145
+ files.raw.map do |file_row|
146
+ write_file(file_row[0], '')
147
+ end
148
+ end
149
+
150
+ Given /^a (\d+) byte file named "([^"]*)"$/ do |file_size, file_name|
151
+ write_fixed_size_file(file_name, file_size.to_i)
152
+ end