osaka 0.2.3 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -32,28 +32,33 @@ module Osaka
32
32
 
33
33
  class CheckAction
34
34
  def execute(wrapper, condition, *args, &block)
35
- wrapper.system_event!("#{condition.as_script(*args)};").strip == "true"
35
+ wrapper.system_event!("#{condition.as_script(wrapper, *args)};").strip == "true"
36
36
  end
37
37
  end
38
38
 
39
39
  class ExistsCondition
40
- def as_script(element_to_check)
41
- "exists #{element_to_check}"
40
+ def as_script(wrapper, element_to_check)
41
+ "exists #{wrapper.construct_location(element_to_check)}"
42
42
  end
43
43
  end
44
44
 
45
45
  class Not_existsCondition
46
- def as_script(element_to_check)
47
- "not exists #{element_to_check}"
46
+ def as_script(wrapper, element_to_check)
47
+ "not exists #{wrapper.construct_location(element_to_check)}"
48
48
  end
49
49
  end
50
-
50
+
51
51
  class ApplicationWrapper
52
52
 
53
- attr_accessor :window
53
+ attr_reader :name
54
54
 
55
55
  def initialize(name)
56
56
  @name = name
57
+ @window = Location.new("")
58
+ end
59
+
60
+ def ==(obj)
61
+ @name == obj.name && current_window_name == obj.current_window_name
57
62
  end
58
63
 
59
64
  def tell(command)
@@ -64,6 +69,10 @@ module Osaka
64
69
  ScriptRunner::execute("tell application \"System Events\"; tell process \"#{@name}\"; #{event}; end tell; end tell")
65
70
  end
66
71
 
72
+ def running?
73
+ ScriptRunner::execute("tell application \"System Events\"; (name of processes) contains \"#{@name}\"; end tell").strip == "true"
74
+ end
75
+
67
76
  def print_warning(action, message)
68
77
  puts "Osaka WARNING while doing #{action}: #{message}"
69
78
  end
@@ -122,7 +131,7 @@ module Osaka
122
131
 
123
132
  def click!(element)
124
133
  # Click seems to often output stuff, but it doesn't have much meaning so we ignore it.
125
- system_event!("click #{element}")
134
+ system_event!("click #{construct_location(element)}")
126
135
  self
127
136
  end
128
137
 
@@ -130,30 +139,46 @@ module Osaka
130
139
  activate
131
140
  click!(element)
132
141
  end
142
+
143
+ def click_menu_bar(menu_item, menu_name)
144
+ activate
145
+ menu_bar_location = at.menu_bar_item(menu_name).menu_bar(1)
146
+ click!(menu_item + at.menu(1) + menu_bar_location)
147
+ end
133
148
 
134
149
  def set!(element, location, value)
135
150
  encoded_value = (value.class == String) ? "\"#{value}\"" : value.to_s
136
- check_output( system_event!("set #{element} of #{location} to #{encoded_value}"), "set")
151
+ check_output( system_event!("set #{element}#{construct_prefixed_location(location)} to #{encoded_value}"), "set")
137
152
  end
138
153
 
139
154
  def focus
140
155
  current_windows = window_list
141
- @window = current_windows[0] if @window.nil? || current_windows.index(@window).nil?
142
- set!("value", "attribute \"AXMain\" of window \"#{window}\"", true) if current_windows[0] != @window
156
+ currently_active_window = current_windows[0]
157
+ currently_active_window ||= ""
158
+
159
+ if current_window_invalid?(current_windows)
160
+ @window = at.window(currently_active_window) unless currently_active_window.nil?
161
+ end
162
+
163
+ set!("value", "attribute \"AXMain\"", true) unless currently_active_window == current_window_name
143
164
  end
144
165
 
145
- def construct_window_info(location)
146
- location_string = ""
147
- location_string += " of #{location}" unless location.empty?
148
- location_string += " of window \"#{window}\"" unless window.nil?
149
-
150
- raise(Osaka::InvalidLocation, "Invalid location for command:#{location_string}") if location_string.scan("of window").length > 1
151
-
152
- location_string
166
+ def form_location_with_window(location)
167
+ new_location = Location.new(location)
168
+ new_location += @window unless new_location.has_top_level_element?
169
+ new_location
170
+ end
171
+
172
+ def construct_location(location)
173
+ form_location_with_window(location).to_s
174
+ end
175
+
176
+ def construct_prefixed_location(location)
177
+ form_location_with_window(location).as_prefixed_location
153
178
  end
154
179
 
155
180
  def get!(element, location = "")
156
- system_event!("get #{element}#{construct_window_info(location)}").strip
181
+ system_event!("get #{element}#{construct_prefixed_location(location)}").strip
157
182
  end
158
183
 
159
184
  def get_app!(element)
@@ -171,5 +196,24 @@ module Osaka
171
196
  window[7...window =~ / of application process/].strip
172
197
  }
173
198
  end
199
+
200
+ def set_current_window(window_name)
201
+ @window = at.window(window_name)
202
+ end
203
+
204
+ def current_window_name
205
+ matchdata = @window.to_s.match(/^window "(.*)"/)
206
+ return "" if matchdata.nil? || matchdata[1].nil?
207
+ matchdata[1]
208
+ end
209
+
210
+ def current_window_location
211
+ @window
212
+ end
213
+
214
+ def current_window_invalid?(window_list)
215
+ @window.to_s.empty? || window_list.index(current_window_name).nil?
216
+ end
217
+
174
218
  end
175
219
  end
@@ -37,6 +37,10 @@ module Osaka
37
37
  @wrapper.should_receive(:click).with(location).and_return(@wrapper)
38
38
  end
39
39
 
40
+ def expect_click_menu_bar(menu_item, menu_name)
41
+ @wrapper.should_receive(:click_menu_bar).with(menu_item, menu_name).and_return(@wrapper)
42
+ end
43
+
40
44
  def expect_tell(do_this)
41
45
  @wrapper.should_receive(:tell).with(do_this)
42
46
  end
@@ -6,18 +6,19 @@ module Osaka
6
6
  def initialize
7
7
  @name = "Calculator"
8
8
  @wrapper = ApplicationWrapper.new("Calculator")
9
+ @wrapper.set_current_window(@name)
9
10
  end
10
11
 
11
12
  def activate
12
13
  super
13
- if (@wrapper.window.nil?)
14
+ if (@wrapper.current_window_name.empty?)
14
15
  wait_for_new_window([])
15
- @wrapper.window = @wrapper.window_list[0]
16
+ @wrapper.set_current_window(@wrapper.window_list[0])
16
17
  end
17
18
  end
18
19
 
19
20
  def click(key)
20
- @wrapper.click!("button \"#{key}\" of group 2 of window \"#{@name}\"")
21
+ @wrapper.click!(at.button(key).group(2))
21
22
  end
22
23
 
23
24
  def key(k)
@@ -25,8 +26,7 @@ module Osaka
25
26
  end
26
27
 
27
28
  def result
28
- @wrapper.get!('value', "static text 1 of group 1")
29
+ @wrapper.get!('value', at.static_text(1).group(1))
29
30
  end
30
-
31
31
  end
32
32
  end
data/lib/osaka/keynote.rb CHANGED
@@ -14,5 +14,14 @@ module Osaka
14
14
  def create_print_dialog(location)
15
15
  KeynotePrintDialog.new(location, @wrapper)
16
16
  end
17
+
18
+ def select_all_slides
19
+ if @wrapper.check!.exists(at.button("Slides").group(1).outline(1).scroll_area(2).splitter_group(1).splitter_group(1))
20
+ @wrapper.click(at.button("Slides").group(1).outline(1).scroll_area(2).splitter_group(1).splitter_group(1))
21
+ else
22
+ @wrapper.click(at.button("Slides").group(1).outline(1).scroll_area(1).splitter_group(1).splitter_group(1))
23
+ end
24
+ select_all
25
+ end
17
26
  end
18
27
  end
@@ -0,0 +1,29 @@
1
+
2
+ module CommonFlows
3
+ def self.keynote_combine_files(result_file, files_to_merge)
4
+ keynote = Osaka::Keynote.new
5
+ files_to_merge = [files_to_merge].flatten
6
+ keynote.open(files_to_merge.shift)
7
+ keynote.save_as(result_file)
8
+
9
+ files_to_merge.each { |file|
10
+ combine_keynote = Osaka::Keynote.new
11
+ combine_keynote.open(file)
12
+ combine_keynote.select_all_slides
13
+ combine_keynote.copy
14
+ keynote.select_all_slides
15
+ keynote.paste
16
+ combine_keynote.close
17
+ }
18
+
19
+ keynote.save
20
+ keynote.quit
21
+ end
22
+
23
+ def self.keynote_combine_files_from_directory_sorted(result_file, directory = ".", pattern = /^.*\.key$/)
24
+ files_in_directory = Dir.new(directory).entries
25
+ files_in_directory.select! { |f| f =~ pattern }
26
+ files_to_open = files_in_directory.collect { |f| File.join(directory, f)}
27
+ keynote_combine_files(result_file, files_to_open.sort)
28
+ end
29
+ end
@@ -0,0 +1,132 @@
1
+
2
+ module Osaka
3
+ class Location
4
+
5
+ def initialize(location_name)
6
+ @location_name = location_name.to_s
7
+ validate
8
+ end
9
+
10
+ def validate
11
+ raise(Osaka::InvalidLocation, "Invalid location: #{to_s}") if as_prefixed_location.scan(" of window").length > 1
12
+ end
13
+
14
+ def+(other_location)
15
+ return Location.new(self) if other_location.to_s.empty?
16
+ return Location.new(other_location) if to_s.empty?
17
+ Location.new(to_s + " of " + other_location.to_s)
18
+ end
19
+
20
+ def to_s
21
+ @location_name
22
+ end
23
+
24
+ def as_prefixed_location
25
+ return "" if to_s.empty?
26
+ " of " + to_s
27
+ end
28
+
29
+ def has_top_level_element?
30
+ has_window? || has_menu_bar?
31
+ end
32
+
33
+ def button(name)
34
+ create_location_with_added_name("button", name)
35
+ end
36
+
37
+ def group(name)
38
+ create_location_with_added_name("group", name)
39
+ end
40
+
41
+ def window(name)
42
+ create_location_with_added_name("window", name)
43
+ end
44
+
45
+ def has_window?
46
+ has_element?("window")
47
+ end
48
+
49
+ def static_text(name)
50
+ create_location_with_added_name("static text", name)
51
+ end
52
+
53
+ def menu_button(name)
54
+ create_location_with_added_name("menu button", name)
55
+ end
56
+
57
+ def menu(name)
58
+ create_location_with_added_name("menu", name)
59
+ end
60
+
61
+ def menu_item(name)
62
+ create_location_with_added_name("menu item", name)
63
+ end
64
+
65
+ def menu_bar(name)
66
+ create_location_with_added_name("menu bar", name)
67
+ end
68
+
69
+ def has_menu_bar?
70
+ has_element?("menu bar")
71
+ end
72
+
73
+ def menu_bar_item(name)
74
+ create_location_with_added_name("menu bar item", name)
75
+ end
76
+
77
+ def dialog(name)
78
+ create_location_with_added_name("dialog", name)
79
+ end
80
+
81
+ def checkbox(name)
82
+ create_location_with_added_name("checkbox", name)
83
+ end
84
+
85
+ def sheet(name)
86
+ create_location_with_added_name("sheet", name)
87
+ end
88
+
89
+ def text_field(name)
90
+ create_location_with_added_name("text field", name)
91
+ end
92
+
93
+ def pop_up_button(name)
94
+ create_location_with_added_name("pop up button", name)
95
+ end
96
+
97
+ def splitter_group(name)
98
+ create_location_with_added_name("splitter group", name)
99
+ end
100
+
101
+ def scroll_area(name)
102
+ create_location_with_added_name("scroll area", name)
103
+ end
104
+
105
+ def outline(name)
106
+ create_location_with_added_name("outline", name)
107
+ end
108
+
109
+ def to_location_string(name)
110
+ return name.to_s if name.kind_of? Integer
111
+ '"' + name.to_s + '"'
112
+ end
113
+
114
+ def create_location_with_added_name(element, name)
115
+ self + Location.new(element + " " + to_location_string(name))
116
+ end
117
+
118
+ def has_element?(name)
119
+ as_prefixed_location.scan(" of #{name}").length >= 1
120
+ end
121
+
122
+ def ==(obj)
123
+ @location_name == obj.to_s
124
+ end
125
+
126
+ end
127
+
128
+ end
129
+
130
+ def at
131
+ Osaka::Location.new ""
132
+ end
@@ -0,0 +1,19 @@
1
+
2
+ module CommonFlows
3
+
4
+ def self.number_and_pages_mail_merge(numbers_file, pages_file, output_file)
5
+ numbers = Osaka::Numbers.new
6
+ pages = Osaka::Pages.new
7
+
8
+ numbers.open(numbers_file)
9
+ yield numbers if block_given?
10
+ numbers.save
11
+
12
+ pages.open(pages_file)
13
+ pages.mail_merge_to_pdf(output_file)
14
+
15
+ numbers.quit(:dont_save)
16
+ pages.quit(:dont_save)
17
+
18
+ end
19
+ end
data/lib/osaka/pages.rb CHANGED
@@ -9,7 +9,7 @@ module Osaka
9
9
  end
10
10
 
11
11
  def merge
12
- @wrapper.click!('button "Merge" of sheet 1 of window 1')
12
+ @wrapper.click!(at.button("Merge").sheet(1))
13
13
  print_dialog_location = 'window "Print"'
14
14
  @wrapper.wait_until!.exists("menu button \"PDF\" of #{print_dialog_location}")
15
15
  TypicalPrintDialog.new(print_dialog_location, @wrapper)
@@ -25,9 +25,9 @@ module Osaka
25
25
 
26
26
  private
27
27
  def set_merge_to_document_printer(value)
28
- @wrapper.click("pop up button 2 of #{@location}")
29
- @wrapper.wait_until!.exists("menu item #{value} of menu 1 of pop up button 2 of #{@location}")
30
- @wrapper.click!("menu item #{value} of menu 1 of pop up button 2 of #{@location}")
28
+ @wrapper.click(at.pop_up_button(2).sheet(1))
29
+ @wrapper.wait_until!.exists(at.menu_item(value).menu(1).pop_up_button(2).sheet(1))
30
+ @wrapper.click!(at.menu_item(value).menu(1).pop_up_button(2).sheet(1))
31
31
  end
32
32
  end
33
33
 
@@ -38,9 +38,12 @@ module Osaka
38
38
  end
39
39
 
40
40
  def mail_merge
41
- @wrapper.system_event("tell menu bar 1; tell menu \"Edit\"; click menu item 20; end tell; end tell")
42
- @wrapper.wait_until.exists('button "Merge" of sheet 1 of window 1')
43
- PagesMailMergeDialog.new("sheet 1 of window 1", @wrapper)
41
+ @wrapper.click_menu_bar(at.menu_item(20), "Edit")
42
+ # @wrapper.click!(at.menu_bar_item("Edit").menu_bar(1))
43
+ # @wrapper.wait_until.exists(at.menu(1).menu_bar_item("Edit").menu_bar(1))
44
+ # @wrapper.click!(at.menu_item(20).menu(1).menu_bar_item("Edit").menu_bar(1))
45
+ @wrapper.wait_until.exists(at.button("Merge").sheet(1))
46
+ PagesMailMergeDialog.new(at.sheet(1), @wrapper)
44
47
  end
45
48
 
46
49
  def mail_merge_to_pdf(filename)
@@ -11,8 +11,9 @@ module Osaka
11
11
 
12
12
  @@debug_info_enabled = false
13
13
 
14
- def self.enable_debug_prints
14
+ def self.enable_debug_prints(debug_info_format = :plain_text)
15
15
  @@debug_info_enabled = true
16
+ @@debug_info_format = debug_info_format
16
17
  end
17
18
 
18
19
  def self.disable_debug_prints
@@ -29,7 +30,16 @@ module Osaka
29
30
  script_commands.each { |l|
30
31
  escaped_commands += " -e \"#{l.strip}\""
31
32
  }
32
- puts "Executing: osascript#{escaped_commands}" if debug_prints?
33
+ if (debug_prints?)
34
+ if (@@debug_info_format == :plain_text)
35
+ debug_output = "Executing: osascript#{escaped_commands}"
36
+ elsif (@@debug_info_format == :short_html)
37
+ debug_output = applescript
38
+ debug_output += "<br>"
39
+ end
40
+ puts debug_output
41
+ end
42
+
33
43
 
34
44
  output = ""
35
45
  begin
@@ -38,7 +48,12 @@ module Osaka
38
48
  raise(Osaka::ScriptRunnerError, "Error received while executing: #{applescript}")
39
49
  end
40
50
  if (!output.empty? && debug_prints?)
41
- puts "Output was: #{output}"
51
+ if (@@debug_info_format == :plain_text)
52
+ debug_output = "Output was: #{output}"
53
+ elsif (@@debug_info_format == :short_html)
54
+ debug_output = "Output: <b>#{output}</b><br>"
55
+ end
56
+ puts debug_output
42
57
  end
43
58
  output
44
59
  end
@@ -10,9 +10,9 @@ module Osaka
10
10
 
11
11
  def activate
12
12
  super
13
- if (@wrapper.window.nil?)
13
+ if (@wrapper.current_window_name.empty?)
14
14
  wait_for_new_window([])
15
- @wrapper.window = @wrapper.window_list[0]
15
+ @wrapper.set_current_window(@wrapper.window_list[0])
16
16
  end
17
17
  end
18
18
 
@@ -4,23 +4,24 @@ module Osaka
4
4
  class TypicalSaveDialog
5
5
  attr_accessor :wrapper
6
6
 
7
- def initialize(location, wrapper)
8
- @location = location
9
- @wrapper = wrapper
7
+ def initialize(self_location, wrapper)
8
+ @self_location = self_location
9
+ @wrapper = wrapper.clone
10
+ @wrapper.set_current_window("") if self_location.has_top_level_element?
10
11
  end
11
12
 
12
13
  def set_filename(filename)
13
- @wrapper.set("value", "text field 1 of #{@location}", filename)
14
+ @wrapper.set("value", at.text_field(1) + @self_location, filename)
14
15
  end
15
16
 
16
17
  def set_folder(pathname)
17
- @wrapper.keystroke("g", [ :command, :shift ]).wait_until.exists("sheet 1 of #{@location}")
18
- @wrapper.set("value", "text field 1 of sheet 1 of #{@location}", pathname)
19
- @wrapper.click("button \"Go\" of sheet 1 of #{@location}").wait_until.not_exists("sheet 1 of #{@location}")
18
+ @wrapper.keystroke("g", [ :command, :shift ]).wait_until.exists(at.sheet(1) + @self_location)
19
+ @wrapper.set("value", at.text_field(1).sheet(1) + @self_location, pathname)
20
+ @wrapper.click(at.button("Go").sheet(1) + @self_location).wait_until.not_exists(at.sheet(1) + @self_location)
20
21
  end
21
22
 
22
23
  def click_save
23
- @wrapper.click("button \"Save\" of #{@location}").wait_until.not_exists("#{@location}")
24
+ @wrapper.click(at.button("Save") + @self_location).wait_until.not_exists(@self_location)
24
25
  end
25
26
 
26
27
  def save(filename)
@@ -34,8 +35,8 @@ module Osaka
34
35
  class TypicalPrintDialog
35
36
  attr_accessor :wrapper
36
37
 
37
- def initialize(location, wrapper)
38
- @location = location
38
+ def initialize(parent, wrapper)
39
+ @parent = parent
39
40
  @wrapper = wrapper
40
41
  end
41
42
 
@@ -44,15 +45,15 @@ module Osaka
44
45
  end
45
46
 
46
47
  def save_as_pdf(filename)
47
- @wrapper.click!("menu button \"PDF\" of #{@location}").wait_until!.exists("menu 1 of menu button \"PDF\" of #{@location}")
48
- @wrapper.click!("menu item 2 of menu 1 of menu button \"PDF\" of #{@location}").wait_until!.exists('window "Save"')
49
- save_dialog = create_save_dialog("window \"Save\"", @wrapper)
48
+ @wrapper.click!(at.menu_button("PDF") + @parent).wait_until!.exists(at.menu(1).menu_button("PDF") + @parent)
49
+ @wrapper.click!(at.menu_item(2).menu(1).menu_button("PDF") + @parent).wait_until!.exists('window "Save"')
50
+ save_dialog = create_save_dialog(at.window("Save"), @wrapper)
50
51
  save_dialog.save(filename)
51
52
 
52
- @wrapper.until!.not_exists(@location) {
53
+ @wrapper.until!.not_exists(@parent) {
53
54
  # Weird, but sometimes the dialog "hangs around" and clicking this checkbox will make it go away.
54
55
  # Anyone who knows a better solution, please let me know!
55
- @wrapper.click!('checkbox 1 of window "Print"')
56
+ @wrapper.click!(at.checkbox(1).window("Print"))
56
57
  }
57
58
  end
58
59
  end
@@ -84,22 +85,36 @@ module Osaka
84
85
  def open (filename)
85
86
  abolutePathFileName = File.absolute_path(filename)
86
87
  @wrapper.tell("open \"#{abolutePathFileName}\"")
87
- @wrapper.window = filename
88
+ @wrapper.set_current_window(File.basename(filename))
88
89
  end
89
90
 
90
91
  def wait_for_window_and_dialogs_to_close(option)
91
92
  if (option != :user_chose)
92
- @wrapper.until!.not_exists("window \"#{wrapper.window}\"") {
93
- if (@wrapper.check!.exists("sheet 1 of window \"#{wrapper.window}\""))
94
- @wrapper.click!("button 2 of sheet 1 of window \"#{wrapper.window}\"")
95
- end
93
+ @wrapper.until!.not_exists(@wrapper.current_window_location) {
94
+ close_dialog_sheet_with_dont_save
96
95
  }
97
96
  end
98
97
  end
99
-
98
+
99
+ def wait_for_application_to_quit(option)
100
+ if (option != :user_chose)
101
+ while @wrapper.running?
102
+ close_dialog_sheet_with_dont_save
103
+ end
104
+ end
105
+ end
106
+
107
+ def close_dialog_sheet_with_dont_save
108
+ if (@wrapper.check!.exists(at.sheet(1)))
109
+ @wrapper.click!(at.button(2).sheet(1))
110
+ end
111
+ end
112
+
100
113
  def quit(option = :user_chose)
101
- @wrapper.quit
102
- wait_for_window_and_dialogs_to_close(option)
114
+ if @wrapper.running?
115
+ @wrapper.quit
116
+ wait_for_application_to_quit(option)
117
+ end
103
118
  end
104
119
 
105
120
  def wait_for_new_window(original_window_list)
@@ -113,7 +128,7 @@ module Osaka
113
128
  def new_document
114
129
  window_list = @wrapper.window_list
115
130
  @wrapper.keystroke("n", :command)
116
- @wrapper.window = wait_for_new_window(window_list)
131
+ @wrapper.set_current_window(wait_for_new_window(window_list))
117
132
  @wrapper.focus
118
133
  end
119
134
 
@@ -121,6 +136,17 @@ module Osaka
121
136
  @wrapper.keystroke("s", :command)
122
137
  end
123
138
 
139
+ def save_dialog
140
+ @wrapper.keystroke("s", [:command, :shift]).wait_until.exists(at.sheet(1))
141
+ create_save_dialog(at.sheet(1))
142
+ end
143
+
144
+ def save_as(filename)
145
+ dialog = save_dialog
146
+ dialog.save(filename)
147
+ @wrapper.set_current_window(File.basename(filename))
148
+ end
149
+
124
150
  def close(option = :user_chose)
125
151
  @wrapper.keystroke("w", :command)
126
152
  wait_for_window_and_dialogs_to_close(option)
@@ -129,15 +155,42 @@ module Osaka
129
155
  def activate
130
156
  @wrapper.activate
131
157
  end
158
+
159
+ def focus
160
+ @wrapper.focus
161
+ end
162
+
163
+ def running?
164
+ @wrapper.running?
165
+ end
132
166
 
167
+ def copy
168
+ @wrapper.keystroke("c", :command)
169
+ end
170
+
171
+ def paste
172
+ @wrapper.keystroke("v", :command)
173
+ end
174
+
175
+ def cut
176
+ @wrapper.keystroke("x", :command)
177
+ end
178
+
179
+ def select_all
180
+ @wrapper.keystroke("a", :command)
181
+ end
182
+
133
183
  def create_print_dialog(location)
134
184
  TypicalPrintDialog.new(location, @wrapper)
135
185
  end
186
+
187
+ def create_save_dialog(location)
188
+ TypicalSaveDialog.new(location, @wrapper)
189
+ end
136
190
 
137
191
  def print_dialog
138
- location = "sheet 1#{@wrapper.construct_window_info}"
139
- @wrapper.keystroke("p", :command).wait_until.exists(location)
140
- create_print_dialog(location)
192
+ @wrapper.keystroke("p", :command).wait_until.exists(at.sheet(1))
193
+ create_print_dialog(at.sheet(1))
141
194
  end
142
195
 
143
196
  end
data/lib/osaka/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
 
2
2
  module Osaka
3
- VERSION = "0.2.3"
3
+ VERSION = "0.3.0"
4
4
  end
data/lib/osaka.rb CHANGED
@@ -1,5 +1,6 @@
1
1
 
2
2
  require 'osaka/scriptrunner'
3
+ require 'osaka/location'
3
4
  require 'osaka/applicationwrapper'
4
5
  require 'osaka/applicationwrapperexpectations'
5
6
  require 'osaka/typicalapplication'
@@ -8,4 +9,6 @@ require 'osaka/numbers'
8
9
  require 'osaka/keynote'
9
10
  require 'osaka/calculator'
10
11
  require 'osaka/textedit'
12
+ require 'osaka/mailmergeflow'
13
+ require 'osaka/keynoteflow'
11
14