rb-scpt 1.0.1 → 1.0.2

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 (50) hide show
  1. checksums.yaml +4 -4
  2. data/bin/rb-scpt-1.0.1.gem +0 -0
  3. data/extconf.rb +12 -12
  4. data/rb-scpt.gemspec +10 -10
  5. data/sample/AB_export_vcard.rb +16 -16
  6. data/sample/AB_list_people_with_emails.rb +4 -4
  7. data/sample/Add_iCal_event.rb +12 -12
  8. data/sample/Create_daily_iCal_todos.rb +28 -28
  9. data/sample/Export_Address_Book_phone_numbers.rb +52 -52
  10. data/sample/Hello_world.rb +10 -10
  11. data/sample/List_iTunes_playlist_names.rb +3 -3
  12. data/sample/Make_Mail_message.rb +24 -24
  13. data/sample/Open_file_in_TextEdit.rb +5 -5
  14. data/sample/Organize_Mail_messages.rb +46 -46
  15. data/sample/Print_folder_tree.rb +5 -5
  16. data/sample/Select_all_HTML_files.rb +6 -6
  17. data/sample/Set_iChat_status.rb +12 -12
  18. data/sample/Simple_Finder_GUI_Scripting.rb +6 -6
  19. data/sample/Stagger_Finder_windows.rb +9 -9
  20. data/sample/TextEdit_demo.rb +71 -71
  21. data/sample/iTunes_top40_to_html.rb +28 -30
  22. data/src/SendThreadSafe.c +293 -293
  23. data/src/SendThreadSafe.h +108 -108
  24. data/src/lib/_aem/aemreference.rb +997 -998
  25. data/src/lib/_aem/codecs.rb +609 -610
  26. data/src/lib/_aem/connect.rb +197 -197
  27. data/src/lib/_aem/encodingsupport.rb +67 -67
  28. data/src/lib/_aem/findapp.rb +75 -75
  29. data/src/lib/_aem/mactypes.rb +241 -242
  30. data/src/lib/_aem/send.rb +268 -268
  31. data/src/lib/_aem/typewrappers.rb +52 -52
  32. data/src/lib/_appscript/defaultterminology.rb +266 -266
  33. data/src/lib/_appscript/referencerenderer.rb +230 -233
  34. data/src/lib/_appscript/reservedkeywords.rb +106 -106
  35. data/src/lib/_appscript/safeobject.rb +125 -125
  36. data/src/lib/_appscript/terminology.rb +448 -449
  37. data/src/lib/aem.rb +238 -238
  38. data/src/lib/kae.rb +1487 -1487
  39. data/src/lib/osax.rb +647 -647
  40. data/src/lib/rb-scpt.rb +1065 -1065
  41. data/src/rbae.c +595 -595
  42. data/test/test_aemreference.rb +104 -107
  43. data/test/test_appscriptcommands.rb +131 -134
  44. data/test/test_appscriptreference.rb +96 -99
  45. data/test/test_codecs.rb +166 -168
  46. data/test/test_findapp.rb +13 -16
  47. data/test/test_mactypes.rb +70 -72
  48. data/test/test_osax.rb +46 -48
  49. data/test/testall.sh +4 -4
  50. metadata +8 -7
@@ -5,9 +5,9 @@
5
5
  # Note: if using the appscript gem, rubygems must be required first:
6
6
  begin; require 'rubygems'; rescue LoadError; end
7
7
 
8
- require "appscript"
9
- include Appscript
8
+ require "appscript"
9
+ include Appscript
10
10
 
11
- te = app('TextEdit')
12
- te.activate
13
- te.open(MacTypes::Alias.path('/Users/USERNAME/ReadMe.txt'))
11
+ te = app('TextEdit')
12
+ te.activate
13
+ te.open(MacTypes::Alias.path('/Users/USERNAME/ReadMe.txt'))
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- # Set up a Mail mailbox folder for organising incoming emails from a
3
+ # Set up a Mail mailbox folder for organising incoming emails from a
4
4
  # particular sender.
5
5
  #
6
6
  # Based on an AppleScript by Michelle Steiner.
@@ -14,48 +14,48 @@
14
14
  # Note: if using the appscript gem, rubygems must be required first:
15
15
  begin; require 'rubygems'; rescue LoadError; end
16
16
 
17
- require "appscript"
18
- include Appscript
19
-
20
- mail = app('Mail')
21
-
22
- # get the current selection in Mail and make sure it's an email message
23
- selection = mail.selection.get
24
-
25
- if selection == [] or selection[0].class_.get != :message
26
- puts "Please select a message and try again."
27
- exit
28
- end
29
-
30
- # get a reference to the first selected message
31
- msg = selection[0]
32
-
33
- recipient = msg.to_recipients[1]
34
- address = recipient.address.get
35
-
36
- # determine the new mailbox's name based on the sender's name/address
37
- if recipient.name.exists
38
- folder_name = recipient.name.get
39
- else
40
- folder_name = /^[^@]*/.match(address)[0]
41
- end
42
-
43
- # make a new mailbox if one doesn't already exist
44
- if not mail.mailboxes[folder_name].exists
45
- mail.mailboxes.end.make(:new=>:mailbox, :with_properties=>{
46
- :name=>folder_name})
47
- end
48
-
49
- # make a new mail rule to move list messages to the mailbox
50
- if not mail.rules[folder_name].exists
51
- new_rule = mail.rules[1].after.make(:new=>:rule, :with_properties=>{
52
- :name=>folder_name,
53
- :should_move_message=>true,
54
- :move_message=>app.mailboxes[folder_name],
55
- :stop_evaluating_rules=>true})
56
- new_rule.make(:new=>:rule_condition, :with_properties=>{
57
- :expression=>address,
58
- :rule_type=>:to_header,
59
- :qualifier=>:does_contain_value})
60
- new_rule.enabled.set(true)
61
- end
17
+ require "appscript"
18
+ include Appscript
19
+
20
+ mail = app('Mail')
21
+
22
+ # get the current selection in Mail and make sure it's an email message
23
+ selection = mail.selection.get
24
+
25
+ if selection == [] or selection[0].class_.get != :message
26
+ puts "Please select a message and try again."
27
+ exit
28
+ end
29
+
30
+ # get a reference to the first selected message
31
+ msg = selection[0]
32
+
33
+ recipient = msg.to_recipients[1]
34
+ address = recipient.address.get
35
+
36
+ # determine the new mailbox's name based on the sender's name/address
37
+ if recipient.name.exists
38
+ folder_name = recipient.name.get
39
+ else
40
+ folder_name = /^[^@]*/.match(address)[0]
41
+ end
42
+
43
+ # make a new mailbox if one doesn't already exist
44
+ if not mail.mailboxes[folder_name].exists
45
+ mail.mailboxes.end.make(:new=>:mailbox, :with_properties=>{
46
+ :name=>folder_name})
47
+ end
48
+
49
+ # make a new mail rule to move list messages to the mailbox
50
+ if not mail.rules[folder_name].exists
51
+ new_rule = mail.rules[1].after.make(:new=>:rule, :with_properties=>{
52
+ :name=>folder_name,
53
+ :should_move_message=>true,
54
+ :move_message=>app.mailboxes[folder_name],
55
+ :stop_evaluating_rules=>true})
56
+ new_rule.make(:new=>:rule_condition, :with_properties=>{
57
+ :expression=>address,
58
+ :rule_type=>:to_header,
59
+ :qualifier=>:does_contain_value})
60
+ new_rule.enabled.set(true)
61
+ end
@@ -5,12 +5,12 @@
5
5
  # Note: if using the appscript gem, rubygems must be required first:
6
6
  begin; require 'rubygems'; rescue LoadError; end
7
7
 
8
- require "appscript"
9
- include Appscript
8
+ require "appscript"
9
+ include Appscript
10
10
 
11
- def print_folder_tree(folder, indent='')
11
+ def print_folder_tree(folder, indent='')
12
12
  puts indent + folder.name.get
13
13
  folder.folders.get.each { |folder| print_folder_tree(folder, indent + "\t") }
14
- end
14
+ end
15
15
 
16
- print_folder_tree(app('Finder').home.folders['Documents'])
16
+ print_folder_tree(app('Finder').home.folders['Documents'])
@@ -5,10 +5,10 @@
5
5
  # Note: if using the appscript gem, rubygems must be required first:
6
6
  begin; require 'rubygems'; rescue LoadError; end
7
7
 
8
- require "appscript"
9
- include Appscript
8
+ require "appscript"
9
+ include Appscript
10
10
 
11
- finder = app('Finder')
12
- finder.activate
13
- folder = finder.Finder_windows[1].target.get
14
- folder.files[its.name_extension.is_in(['htm', 'html'])].select
11
+ finder = app('Finder')
12
+ finder.activate
13
+ folder = finder.Finder_windows[1].target.get
14
+ folder.files[its.name_extension.is_in(['htm', 'html'])].select
@@ -9,16 +9,16 @@
9
9
  # Note: if using the appscript gem, rubygems must be required first:
10
10
  begin; require 'rubygems'; rescue LoadError; end
11
11
 
12
- require "appscript"
13
- include Appscript
12
+ require "appscript"
13
+ include Appscript
14
14
 
15
- begin
16
- track_name = app("iTunes").current_track.name.get
17
- rescue CommandError => e
18
- if e.to_i == -1728 # Can't get reference.
19
- track_name = 'No track selected.'
20
- else
21
- raise
22
- end
23
- end
24
- app("iChat").status_message.set(track_name)
15
+ begin
16
+ track_name = app("iTunes").current_track.name.get
17
+ rescue CommandError => e
18
+ if e.to_i == -1728 # Can't get reference.
19
+ track_name = 'No track selected.'
20
+ else
21
+ raise
22
+ end
23
+ end
24
+ app("iChat").status_message.set(track_name)
@@ -8,11 +8,11 @@
8
8
  # Note: if using the appscript gem, rubygems must be required first:
9
9
  begin; require 'rubygems'; rescue LoadError; end
10
10
 
11
- require 'appscript'
12
- include Appscript
11
+ require 'appscript'
12
+ include Appscript
13
13
 
14
- se = app('System Events')
14
+ se = app('System Events')
15
15
 
16
- app('Finder').activate
17
- se.keystroke('n', :using=>[:command_down, :option_down])
18
- se.keystroke('ruby')
16
+ app('Finder').activate
17
+ se.keystroke('n', :using=>[:command_down, :option_down])
18
+ se.keystroke('ruby')
@@ -7,19 +7,19 @@
7
7
  # Note: if using the appscript gem, rubygems must be required first:
8
8
  begin; require 'rubygems'; rescue LoadError; end
9
9
 
10
- require "appscript"
11
- include Appscript
10
+ require "appscript"
11
+ include Appscript
12
12
 
13
- x, y = 0, 44
14
- offset = 22
13
+ x, y = 0, 44
14
+ offset = 22
15
15
 
16
- # Get list of window references, ignoring any minimised windows
17
- window_list = app('Finder').windows[its.collapsed.not].get
16
+ # Get list of window references, ignoring any minimised windows
17
+ window_list = app('Finder').windows[its.collapsed.not].get
18
18
 
19
- # Move windows while preserving their original sizes
20
- window_list.reverse.each do |window|
19
+ # Move windows while preserving their original sizes
20
+ window_list.reverse.each do |window|
21
21
  x1, y1, x2, y2 = window.bounds.get
22
22
  window.bounds.set([x, y, x2 - x1 + x, y2 - y1 + y])
23
23
  x += offset
24
24
  y += offset
25
- end
25
+ end
@@ -5,126 +5,126 @@
5
5
  # Note: if using the appscript gem, rubygems must be required first:
6
6
  begin; require 'rubygems'; rescue LoadError; end
7
7
 
8
- require "appscript"
9
- include Appscript
8
+ require "appscript"
9
+ include Appscript
10
10
 
11
- textedit = app('TextEdit') # get an application object for TextEdit
11
+ textedit = app('TextEdit') # get an application object for TextEdit
12
12
 
13
13
 
14
- # tell application "TextEdit" to activate
15
- textedit.activate
14
+ # tell application "TextEdit" to activate
15
+ textedit.activate
16
16
 
17
17
 
18
- # tell application "TextEdit" to make new document at end of documents
19
- textedit.documents.end.make(:new => :document)
18
+ # tell application "TextEdit" to make new document at end of documents
19
+ textedit.documents.end.make(:new => :document)
20
20
 
21
21
 
22
- # tell application "TextEdit" to set text of document 1 to "Hello World\n"
23
- textedit.documents[1].text.set('Hello World\n')
22
+ # tell application "TextEdit" to set text of document 1 to "Hello World\n"
23
+ textedit.documents[1].text.set('Hello World\n')
24
24
 
25
25
 
26
- # tell application "TextEdit" to get a reference to every window
27
- p textedit.windows
26
+ # tell application "TextEdit" to get a reference to every window
27
+ p textedit.windows
28
28
 
29
29
 
30
- # tell application "TextEdit" to get a reference to document 1
31
- p textedit.documents
30
+ # tell application "TextEdit" to get a reference to document 1
31
+ p textedit.documents
32
32
 
33
33
 
34
- # tell application "TextEdit" to get every document
35
- p textedit.documents.get
34
+ # tell application "TextEdit" to get every document
35
+ p textedit.documents.get
36
36
 
37
37
 
38
- # tell application "TextEdit" to get a reference to document 1
39
- p textedit.documents[1]
38
+ # tell application "TextEdit" to get a reference to document 1
39
+ p textedit.documents[1]
40
40
 
41
41
 
42
- # tell application "TextEdit" to get document 1
43
- p textedit.documents[1].get
42
+ # tell application "TextEdit" to get document 1
43
+ p textedit.documents[1].get
44
44
 
45
45
 
46
- # tell application "TextEdit" to get window id 3210
47
- # p textedit.windows.ID(3210).get
46
+ # tell application "TextEdit" to get window id 3210
47
+ # p textedit.windows.ID(3210).get
48
48
 
49
49
 
50
- # tell application "TextEdit" to get a reference to text of document 1
51
- p textedit.documents[1].text
50
+ # tell application "TextEdit" to get a reference to text of document 1
51
+ p textedit.documents[1].text
52
52
 
53
53
 
54
- # tell application "TextEdit" to get text of document 1
55
- p textedit.documents[1].text.get
54
+ # tell application "TextEdit" to get text of document 1
55
+ p textedit.documents[1].text.get
56
56
 
57
57
 
58
- # tell application "TextEdit" to make new document at end of documents
59
- textedit.documents.end.make(:new => :document)
58
+ # tell application "TextEdit" to make new document at end of documents
59
+ textedit.documents.end.make(:new => :document)
60
60
 
61
61
 
62
- # tell application "TextEdit" to set text of document 1 to "Happy Happy Joy Joy\n"
63
- textedit.documents[1].text.set("Happy Happy Joy Joy\n")
62
+ # tell application "TextEdit" to set text of document 1 to "Happy Happy Joy Joy\n"
63
+ textedit.documents[1].text.set("Happy Happy Joy Joy\n")
64
64
 
65
65
 
66
- # tell application "TextEdit" to get text of every document
67
- p textedit.documents.text.get
66
+ # tell application "TextEdit" to get text of every document
67
+ p textedit.documents.text.get
68
68
 
69
69
 
70
- # tell application "TextEdit" to count each word of text of document 1
71
- p textedit.documents[1].text.count(:each => :word)
70
+ # tell application "TextEdit" to count each word of text of document 1
71
+ p textedit.documents[1].text.count(:each => :word)
72
72
 
73
73
 
74
- # tell application "TextEdit" to get words 3 thru -1 of document 1
75
- p textedit.documents[1].words[3, -1].get
74
+ # tell application "TextEdit" to get words 3 thru -1 of document 1
75
+ p textedit.documents[1].words[3, -1].get
76
76
 
77
77
 
78
- # tell application "TextEdit" to set size of character 1 of every word
79
- # of document 1 to 24
80
- textedit.documents[1].words.characters[1].size.set(24)
78
+ # tell application "TextEdit" to set size of character 1 of every word
79
+ # of document 1 to 24
80
+ textedit.documents[1].words.characters[1].size.set(24)
81
81
 
82
82
 
83
- # tell application "TextEdit" to set color of any word of document 1 to {65535, 0, 0}
84
- textedit.documents[1].words.any.color.set([65535, 0, 0])
83
+ # tell application "TextEdit" to set color of any word of document 1 to {65535, 0, 0}
84
+ textedit.documents[1].words.any.color.set([65535, 0, 0])
85
85
 
86
86
 
87
- # tell application "TextEdit" to make new paragraph at
88
- # (after last paragraph of text of document 1) with data "Silly Rabbit\n"
89
- textedit.documents[1].text.paragraphs.last.after.make(
90
- :new => :paragraph, :with_data => "Silly Rabbit\n")
87
+ # tell application "TextEdit" to make new paragraph at
88
+ # (after last paragraph of text of document 1) with data "Silly Rabbit\n"
89
+ textedit.documents[1].text.paragraphs.last.after.make(
90
+ :new => :paragraph, :with_data => "Silly Rabbit\n")
91
91
 
92
92
 
93
- # tell application "TextEdit" to get paragraph after paragraph 1 of document 1
94
- p textedit.documents[1].paragraphs[1].next(:paragraph).get
93
+ # tell application "TextEdit" to get paragraph after paragraph 1 of document 1
94
+ p textedit.documents[1].paragraphs[1].next(:paragraph).get
95
95
 
96
96
 
97
- # tell application "TextEdit" to make new document at end of documents
98
- # with properties {text:"foo\nbar\n\n\nbaz\n\nfub\n"}
99
- textedit.documents.end.make(:new => :document,
100
- :with_properties => {:text => "foo\nbar\n\n\nbaz\n\nfub\n"})
97
+ # tell application "TextEdit" to make new document at end of documents
98
+ # with properties {text:"foo\nbar\n\n\nbaz\n\nfub\n"}
99
+ textedit.documents.end.make(:new => :document,
100
+ :with_properties => {:text => "foo\nbar\n\n\nbaz\n\nfub\n"})
101
101
 
102
102
 
103
- # tell application "TextEdit" to get every paragraph of text of document 1
104
- p textedit.documents[1].text.paragraphs.get
103
+ # tell application "TextEdit" to get every paragraph of text of document 1
104
+ p textedit.documents[1].text.paragraphs.get
105
105
 
106
106
 
107
- # tell application "TextEdit" to get every paragraph of document 1
108
- # where it is not "\n" -- get non-empty paragraphs
109
- p textedit.documents[1].paragraphs[its.ne("\n")].get
107
+ # tell application "TextEdit" to get every paragraph of document 1
108
+ # where it is not "\n" -- get non-empty paragraphs
109
+ p textedit.documents[1].paragraphs[its.ne("\n")].get
110
110
 
111
111
 
112
- # tell application "TextEdit" to get text of every document
113
- # whose text begins with "H"
114
- p textedit.documents[its.text.begins_with('H')].text.get
112
+ # tell application "TextEdit" to get text of every document
113
+ # whose text begins with "H"
114
+ p textedit.documents[its.text.begins_with('H')].text.get
115
115
 
116
116
 
117
117
 
118
- # The following examples don't work in TextEdit but will work in,
119
- # for example, Tex-Edit Plus:
120
- #
121
- # # tell application "Tex-Edit Plus" to get words (character 5)
122
- # # thru (paragraph 9) of document 1
123
- # p app('Tex-Edit Plus').documents[1] \
124
- # .words[con.characters[5], con.paragraphs[9]].get
125
- #
126
- #
127
- # # tell application "Tex-Edit Plus" to get every word of text
128
- # # of document 1 whose color is {0, 0, 0}
129
- # p app('Tex-Edit Plus').documents[1].text.paragraphs \
130
- # [its.color.equals((0, 0, 0))].get
118
+ # The following examples don't work in TextEdit but will work in,
119
+ # for example, Tex-Edit Plus:
120
+ #
121
+ # # tell application "Tex-Edit Plus" to get words (character 5)
122
+ # # thru (paragraph 9) of document 1
123
+ # p app('Tex-Edit Plus').documents[1] \
124
+ # .words[con.characters[5], con.paragraphs[9]].get
125
+ #
126
+ #
127
+ # # tell application "Tex-Edit Plus" to get every word of text
128
+ # # of document 1 whose color is {0, 0, 0}
129
+ # p app('Tex-Edit Plus').documents[1].text.paragraphs \
130
+ # [its.color.equals((0, 0, 0))].get
@@ -8,14 +8,14 @@
8
8
  # Note: if using the appscript gem, rubygems must be required first:
9
9
  begin; require 'rubygems'; rescue LoadError; end
10
10
 
11
- require 'appscript'
12
- include Appscript
13
- require 'osax'
14
- require "amrita/template"
15
- include Amrita
11
+ require 'appscript'
12
+ include Appscript
13
+ require 'osax'
14
+ require "amrita/template"
15
+ include Amrita
16
16
 
17
- # Amrita HTML template
18
- tmpl = TemplateText.new <<END
17
+ # Amrita HTML template
18
+ tmpl = TemplateText.new <<END
19
19
  <html>
20
20
  <head>
21
21
  <title> iTunes Top 40 Tracks</title>
@@ -41,31 +41,29 @@ tmpl = TemplateText.new <<END
41
41
  </html>
42
42
  END
43
43
 
44
- # Choose the file to write
45
- sa = OSAX.osax('StandardAdditions')
46
- out_file = sa.choose_file_name(:default_name=>'My-iTunes-Top-40.html')
44
+ # Choose the file to write
45
+ sa = OSAX.osax('StandardAdditions')
46
+ out_file = sa.choose_file_name(:default_name=>'My-iTunes-Top-40.html')
47
47
 
48
- # Get the played count, name and album for every track in iTunes
49
- tracks = app('iTunes').library_playlists[1].tracks
50
- info = tracks.played_count.get.zip(tracks.name.get, tracks.album.get)
51
- # Extract the top 40 most played entries
52
- top40 = info.sort.reverse[0, 40]
48
+ # Get the played count, name and album for every track in iTunes
49
+ tracks = app('iTunes').library_playlists[1].tracks
50
+ info = tracks.played_count.get.zip(tracks.name.get, tracks.album.get)
51
+ # Extract the top 40 most played entries
52
+ top40 = info.sort.reverse[0, 40]
53
53
 
54
- # Assemble input data for Amrita
55
- data = {
56
- :table_row=>top40.collect { |row_data| {:table_column=>row_data} }
57
- }
54
+ # Assemble input data for Amrita
55
+ data = {
56
+ :table_row=>top40.collect { |row_data| {:table_column=>row_data} }
57
+ }
58
58
 
59
- # Render HTML file
60
- tmpl.prettyprint = true
61
- File.open(out_file.to_s, 'w') { |f| tmpl.expand(f, data) }
62
-
63
- # Open file in Safari for viewing
64
- # safari = app('Safari')
65
- # safari.activate
66
- # safari.open(out_file)
67
-
68
- # Open file in default web browser for viewing
69
- sa.open_location(out_file.url)
59
+ # Render HTML file
60
+ tmpl.prettyprint = true
61
+ File.open(out_file.to_s, 'w') { |f| tmpl.expand(f, data) }
70
62
 
63
+ # Open file in Safari for viewing
64
+ # safari = app('Safari')
65
+ # safari.activate
66
+ # safari.open(out_file)
71
67
 
68
+ # Open file in default web browser for viewing
69
+ sa.open_location(out_file.url)