rb-scpt 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 62ab093753a991b344ae89d818446ab21170df21
4
- data.tar.gz: c2b6e9acc2160c301d35bbf710f6eb7bd31344f8
3
+ metadata.gz: 470ba8dfaf4bbe261d30036cd5fa9bd5788f2a9d
4
+ data.tar.gz: 30eb7123f32488069a4436957bac32d3526d4578
5
5
  SHA512:
6
- metadata.gz: 28ac38e199531ed758f49e05f34d44856b2009f5d26171f662eaf30e23835cc87136fe01213550aa847b3f7cd5ca56fe95abbbc4cb2530b4f222d081916a8559
7
- data.tar.gz: c3e29ce06829420801a49025993d13a487028c3aaa8da7ba8f2c3c3c86fb93c8a8ec8e492cc967c3cfff2b0013ec57f676c298d21483321ad1a27381a1d9e6b0
6
+ metadata.gz: c6e8dbdea21e3f3cf21574a413a6ca66f2a8190ccf6887044ad58790ce60e6a82b3e2ef0b94ea453cbd97cea516ab52fbe7067346853782ef1073ba724c6e6f6
7
+ data.tar.gz: 721f9a75a460b0601e1faf0bfe0b1b76e742615f1f3ffaf4346c6e0bef36953f6fd5fcf67e9b4b4e355aa55261206b781f7362618dc8999720d3457330bc241f
Binary file
data/extconf.rb CHANGED
@@ -40,26 +40,26 @@ $LDFLAGS << ' -framework Carbon -framework ApplicationServices'
40
40
  maj, min = RUBY_VERSION.split('.')
41
41
  is_ruby_18 = (maj <= '1' and min.to_i < 9)
42
42
  if is_ruby_18
43
- header_path = RbConfig::CONFIG['archdir']
43
+ header_path = RbConfig::CONFIG['archdir']
44
44
  else
45
- header_path = File.join(RbConfig::CONFIG['rubyhdrdir'], 'ruby')
45
+ header_path = File.join(RbConfig::CONFIG['rubyhdrdir'], 'ruby')
46
46
  end
47
47
  ruby_h = File.join(header_path, 'ruby.h')
48
48
  intern_h = File.join(header_path, 'intern.h')
49
49
  new_filename_prefix = 'osx_'
50
50
 
51
51
  [ ruby_h, intern_h ].each do |src_path|
52
- dst_fname = File.join('./src', new_filename_prefix + File.basename(src_path))
53
- $stderr.puts "create #{File.expand_path(dst_fname)} ..."
54
- File.open(dst_fname, 'w') do |dstfile|
55
- IO.foreach(src_path) do |line|
56
- line = line.gsub(/\bID\b/, 'RB_ID')
57
- line = line.gsub(/\bT_DATA\b/, 'RB_T_DATA')
58
- line = line.gsub(/\b(?:ruby\/)?intern.h\b/, "#{new_filename_prefix}intern.h")
59
- line = line.gsub('#include "defines.h"', '#include "ruby/defines.h"') if not is_ruby_18
60
- dstfile.puts line
61
- end
52
+ dst_fname = File.join('./src', new_filename_prefix + File.basename(src_path))
53
+ $stderr.puts "create #{File.expand_path(dst_fname)} ..."
54
+ File.open(dst_fname, 'w') do |dstfile|
55
+ IO.foreach(src_path) do |line|
56
+ line = line.gsub(/\bID\b/, 'RB_ID')
57
+ line = line.gsub(/\bT_DATA\b/, 'RB_T_DATA')
58
+ line = line.gsub(/\b(?:ruby\/)?intern.h\b/, "#{new_filename_prefix}intern.h")
59
+ line = line.gsub('#include "defines.h"', '#include "ruby/defines.h"') if not is_ruby_18
60
+ dstfile.puts line
62
61
  end
62
+ end
63
63
  end
64
64
 
65
65
  create_makefile('ae', 'src')
@@ -1,14 +1,14 @@
1
1
  require "rubygems"
2
2
 
3
3
  Gem::Specification.new do |s|
4
- s.name = "rb-scpt"
5
- s.version = "1.0.1"
6
- s.homepage = "https://github.com/BrendanThompson/rb-scpt"
7
- s.summary="This is a fork of the original rb-appscript. Ruby AppleScript (rb-scpt) is a high-level, user-friendly Apple event bridge that allows you to control scriptable Mac OS X applications using ordinary Ruby scripts."
8
- s.files = Dir["**/*"].delete_if { |name| ["MakeFile", "ae.bundle", "mkmf.log", "rbae.o", "SendThreadSafe.o", "src/osx_ruby.h", "src/osx_intern.h"].include?(name) }
9
- s.extensions = "extconf.rb"
10
- s.test_files = Dir["test/test_*.rb"]
11
- s.authors = ["hhas","Brendan Thompson"]
12
- s.email = 'brendan@btsystems.com.au'
13
- s.required_ruby_version = ">= 1.8"
4
+ s.name = "rb-scpt"
5
+ s.version = "1.0.2"
6
+ s.homepage = "https://github.com/BrendanThompson/rb-scpt"
7
+ s.summary="This is a fork of the original rb-appscript. Ruby AppleScript (rb-scpt) is a high-level, user-friendly Apple event bridge that allows you to control scriptable Mac OS X applications using ordinary Ruby scripts."
8
+ s.files = Dir["**/*"].delete_if { |name| ["MakeFile", "ae.bundle", "mkmf.log", "rbae.o", "SendThreadSafe.o", "src/osx_ruby.h", "src/osx_intern.h"].include?(name) }
9
+ s.extensions = "extconf.rb"
10
+ s.test_files = Dir["test/test_*.rb"]
11
+ s.authors = ["hhas","Brendan Thompson"]
12
+ s.email = 'brendan@btsystems.com.au'
13
+ s.required_ruby_version = ">= 1.8"
14
14
  end
@@ -11,21 +11,21 @@
11
11
  # Note: if using the appscript gem, rubygems must be required first:
12
12
  begin; require 'rubygems'; rescue LoadError; end
13
13
 
14
- require 'appscript'
15
- include Appscript
14
+ require 'appscript'
15
+ include Appscript
16
16
 
17
- people = app('Address Book').people
17
+ people = app('Address Book').people
18
18
 
19
- found_names = []
20
- people.name.get.zip(people.vcard.get).each do |name, vcard|
21
- name = 'unknown' if name == ''
22
- name = name.gsub('/', ':')
23
- filename = "#{name}.vcard"
24
- i = 1
25
- while found_names.include?(filename.downcase)
26
- filename = "#{name} #{i}.vcard"
27
- i += 1
28
- end
29
- found_names.push(filename.downcase)
30
- File.open(filename, 'w') { |f| f.puts vcard }
31
- end
19
+ found_names = []
20
+ people.name.get.zip(people.vcard.get).each do |name, vcard|
21
+ name = 'unknown' if name == ''
22
+ name = name.gsub('/', ':')
23
+ filename = "#{name}.vcard"
24
+ i = 1
25
+ while found_names.include?(filename.downcase)
26
+ filename = "#{name} #{i}.vcard"
27
+ i += 1
28
+ end
29
+ found_names.push(filename.downcase)
30
+ File.open(filename, 'w') { |f| f.puts vcard }
31
+ end
@@ -6,8 +6,8 @@
6
6
  # Note: if using the appscript gem, rubygems must be required first:
7
7
  begin; require 'rubygems'; rescue LoadError; end
8
8
 
9
- require "appscript"
10
- include Appscript
9
+ require "appscript"
10
+ include Appscript
11
11
 
12
- people_ref = app('Address Book').people[its.emails.ne([])]
13
- p people_ref.name.get.zip(people_ref.emails.value.get)
12
+ people_ref = app('Address Book').people[its.emails.ne([])]
13
+ p people_ref.name.get.zip(people_ref.emails.value.get)
@@ -5,17 +5,17 @@
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
- calendar_name = 'Home'
12
- t = Time.now + 60 * 60 * 24
13
- start = Time.local(t.year, t.month, t.day, 7)
14
- end_ = start + 60 * 60 * 2
15
- summary = 'First pants, then shoes.'
11
+ calendar_name = 'Home'
12
+ t = Time.now + 60 * 60 * 24
13
+ start = Time.local(t.year, t.month, t.day, 7)
14
+ end_ = start + 60 * 60 * 2
15
+ summary = 'First pants, then shoes.'
16
16
 
17
- app('iCal').calendars[calendar_name].events.end.make(
18
- :new => :event, :with_properties => {
19
- :start_date => start,
20
- :end_date => end_,
21
- :summary => summary})
17
+ app('iCal').calendars[calendar_name].events.end.make(
18
+ :new => :event, :with_properties => {
19
+ :start_date => start,
20
+ :end_date => end_,
21
+ :summary => summary})
@@ -2,7 +2,7 @@
2
2
 
3
3
  # Creates daily recurring todo items in iCal.
4
4
  #
5
- # Ported from 'Create daily todos.scpt' by Alexander Kellett
5
+ # Ported from 'Create daily todos.scpt' by Alexander Kellett
6
6
  # <http://web.mac.com/lypanov>
7
7
  #
8
8
  # While iCal makes it easy to create recurring events, it lacks a similar
@@ -10,7 +10,7 @@
10
10
  # of things to do.
11
11
  #
12
12
  # To begin, create a new calendar with the name "Shadow". Then, add a number
13
- # of recurring events to this calendar. All Daily To Dos events must be
13
+ # of recurring events to this calendar. All Daily To Dos events must be
14
14
  # recurring events as only recurring events are converted to To Dos. Start and
15
15
  # end dates are ignored.
16
16
  #
@@ -27,49 +27,49 @@
27
27
  # Note: if using the appscript gem, rubygems must be required first:
28
28
  begin; require 'rubygems'; rescue LoadError; end
29
29
 
30
- require "appscript"
31
- include Appscript
30
+ require "appscript"
31
+ include Appscript
32
32
 
33
- ICal = app("iCal")
33
+ ICal = app("iCal")
34
34
 
35
- # The calendar in which recurring todo items should appear:
36
- ToDoCalendarName = "Personal"
37
-
38
- def create_to_do(summary_text)
35
+ # The calendar in which recurring todo items should appear:
36
+ ToDoCalendarName = "Personal"
37
+
38
+ def create_to_do(summary_text)
39
39
  # Adds To Dos to calendar "Personal"
40
40
  now = Time.new
41
41
  midnight = Time.local(now.year(), now.month(), now.day())
42
42
  to_dos = ICal.calendars[ToDoCalendarName].todos
43
43
  # don't create an item if it already exists for today!
44
44
  if to_dos[its.due_date.ge(midnight).and(
45
- its.summary.eq(summary_text))].count < 1
46
- to_dos.end.make(:new=>:todo, :with_properties=>{
47
- :due_date=>midnight, :summary=>summary_text})
45
+ its.summary.eq(summary_text))].count < 1
46
+ to_dos.end.make(:new=>:todo, :with_properties=>{
47
+ :due_date=>midnight, :summary=>summary_text})
48
48
  end
49
- end
49
+ end
50
50
 
51
- def get_label(recurrence, label)
51
+ def get_label(recurrence, label)
52
52
  match = Regexp.new("(?:^|;)#{label}=(.*?)(?:$|;)").match(recurrence)
53
53
  return match ? match[1] : nil
54
- end
54
+ end
55
55
 
56
- weekday_code = ["SU", "MO", "TU", "WE", "TH", "FR", "SA"][Time.new.wday]
57
- events = ICal.calendars["Shadow"].events
56
+ weekday_code = ["SU", "MO", "TU", "WE", "TH", "FR", "SA"][Time.new.wday]
57
+ events = ICal.calendars["Shadow"].events
58
58
 
59
- events.recurrence.get.zip(events.summary.get).each do |recurrence, summary|
59
+ events.recurrence.get.zip(events.summary.get).each do |recurrence, summary|
60
60
  recurs_on_this_weekday = false
61
61
  frequency = get_label(recurrence, "FREQ")
62
62
  case frequency
63
- when "WEEKLY"
64
- days = get_label(recurrence, "BYDAY")
65
- if days and days.split(",").include?(weekday_code)
66
- recurs_on_this_weekday = true
67
- end
68
- when "DAILY"
69
- recurs_on_this_weekday = true
63
+ when "WEEKLY"
64
+ days = get_label(recurrence, "BYDAY")
65
+ if days and days.split(",").include?(weekday_code)
66
+ recurs_on_this_weekday = true
67
+ end
68
+ when "DAILY"
69
+ recurs_on_this_weekday = true
70
70
  end
71
71
  if recurs_on_this_weekday
72
- puts summary
73
- create_to_do(summary)
72
+ puts summary
73
+ create_to_do(summary)
74
74
  end
75
- end
75
+ end
@@ -5,55 +5,55 @@
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 "osax"
9
- include Appscript, OSAX
10
-
11
- # create Application object for Address Book
12
- AB = app("Address Book")
13
-
14
- # prompt user for name of Address Book group to export from
15
- DefaultChoice = ["<All>"]
16
-
17
- groups = DefaultChoice + AB.groups.name.get
18
- choice = osax.choose_from_list(groups, :default_items => DefaultChoice)
19
- if choice == false # user cancelled
20
- exit
21
- elsif choice == DefaultChoice
22
- ref = AB
23
- else
24
- ref = AB.groups[choice[0]]
25
- end
26
-
27
- # build a reference identifying those people with one or more phone numbers
28
- p = ref.people[its.phones.ne([])]
29
-
30
- # get first and last names for those people, replacing any :missing_value
31
- # entries with empty strings
32
- last_names = p.last_name.get.collect { |val| val.is_a?(String) ? val : "" }
33
- first_names = p.first_name.get.collect { |val| val.is_a?(String) ? val : "" }
34
-
35
- # get lists of phone numbers and locations for those people
36
- locations = p.phones.label.get
37
- numbers = p.phones.value.get
38
-
39
- # build an array containing each person's details:
40
- # [[last name, first name, locations, numbers], ...]
41
- people = last_names.zip(first_names, locations, numbers)
42
-
43
- # sort array by last and first name
44
- people.sort! do |a, b|
45
- a[0,2].collect { |s| s.downcase } <=> b[0,2].collect { |s| s.downcase }
46
- end
47
-
48
- # print table
49
- puts " #{'_' * 70} "
50
- people.each do |last_name, first_name, locations, numbers|
51
- name = [last_name, first_name].delete_if { |s| s == "" }.join(', ')
52
- puts "|#{' ' * 70}|"
53
- # print each phone number in turn
54
- numbers.zip(locations).each do |number, location|
55
- puts "| #{name.ljust(32)} #{number.ljust(20)} (#{(location + ')').ljust(13)} |"
56
- name = ""
57
- end
58
- puts "|#{'_' * 70}|"
59
- end
8
+ require "osax"
9
+ include Appscript, OSAX
10
+
11
+ # create Application object for Address Book
12
+ AB = app("Address Book")
13
+
14
+ # prompt user for name of Address Book group to export from
15
+ DefaultChoice = ["<All>"]
16
+
17
+ groups = DefaultChoice + AB.groups.name.get
18
+ choice = osax.choose_from_list(groups, :default_items => DefaultChoice)
19
+ if choice == false # user cancelled
20
+ exit
21
+ elsif choice == DefaultChoice
22
+ ref = AB
23
+ else
24
+ ref = AB.groups[choice[0]]
25
+ end
26
+
27
+ # build a reference identifying those people with one or more phone numbers
28
+ p = ref.people[its.phones.ne([])]
29
+
30
+ # get first and last names for those people, replacing any :missing_value
31
+ # entries with empty strings
32
+ last_names = p.last_name.get.collect { |val| val.is_a?(String) ? val : "" }
33
+ first_names = p.first_name.get.collect { |val| val.is_a?(String) ? val : "" }
34
+
35
+ # get lists of phone numbers and locations for those people
36
+ locations = p.phones.label.get
37
+ numbers = p.phones.value.get
38
+
39
+ # build an array containing each person's details:
40
+ # [[last name, first name, locations, numbers], ...]
41
+ people = last_names.zip(first_names, locations, numbers)
42
+
43
+ # sort array by last and first name
44
+ people.sort! do |a, b|
45
+ a[0,2].collect { |s| s.downcase } <=> b[0,2].collect { |s| s.downcase }
46
+ end
47
+
48
+ # print table
49
+ puts " #{'_' * 70} "
50
+ people.each do |last_name, first_name, locations, numbers|
51
+ name = [last_name, first_name].delete_if { |s| s == "" }.join(', ')
52
+ puts "|#{' ' * 70}|"
53
+ # print each phone number in turn
54
+ numbers.zip(locations).each do |number, location|
55
+ puts "| #{name.ljust(32)} #{number.ljust(20)} (#{(location + ')').ljust(13)} |"
56
+ name = ""
57
+ end
58
+ puts "|#{'_' * 70}|"
59
+ end
@@ -3,19 +3,19 @@
3
3
  # Note: if using the appscript gem, rubygems must be required first:
4
4
  begin; require 'rubygems'; rescue LoadError; end
5
5
 
6
- # 1. "Hello world" in TextEdit:
6
+ # 1. "Hello world" in TextEdit:
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.documents.end.make(:new => :document, :with_properties => {:text => "Hello World!\n"})
11
+ te = app('TextEdit')
12
+ te.activate
13
+ te.documents.end.make(:new => :document, :with_properties => {:text => "Hello World!\n"})
14
14
 
15
15
 
16
- # 2. "Hello world" using StandardAdditions:
16
+ # 2. "Hello world" using StandardAdditions:
17
17
 
18
- require "osax"
19
- include OSAX
18
+ require "osax"
19
+ include OSAX
20
20
 
21
- osax.display_dialog("Hello World")
21
+ osax.display_dialog("Hello World")
@@ -5,7 +5,7 @@
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
- p app('iTunes').sources[1].user_playlists.name.get
11
+ p app('iTunes').sources[1].user_playlists.name.get
@@ -5,29 +5,29 @@
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 make_message(addresses, subject, content, show_window=false)
12
- # Make an outgoing message in Mail.
13
- # addresses : list of unicode -- a list of email addresses
14
- # subject : unicode -- the message subject
15
- # content : unicode -- the message content
16
- # show_window : Boolean -- show message window in Mail
17
- # Result : reference -- reference to the new outgoing message
18
- mail = app('Mail')
19
- msg = mail.make(
20
- :new => :outgoing_message,
21
- :with_properties => {:visible => show_window})
22
- addresses.each do |an_address|
23
- msg.to_recipients.end.make(
24
- :new => :recipient,
25
- :with_properties => {:address => an_address})
26
- end
27
- msg.subject.set(subject)
28
- msg.content.set(content)
29
- return msg
30
- end
11
+ def make_message(addresses, subject, content, show_window=false)
12
+ # Make an outgoing message in Mail.
13
+ # addresses : list of unicode -- a list of email addresses
14
+ # subject : unicode -- the message subject
15
+ # content : unicode -- the message content
16
+ # show_window : Boolean -- show message window in Mail
17
+ # Result : reference -- reference to the new outgoing message
18
+ mail = app('Mail')
19
+ msg = mail.make(
20
+ :new => :outgoing_message,
21
+ :with_properties => {:visible => show_window})
22
+ addresses.each do |an_address|
23
+ msg.to_recipients.end.make(
24
+ :new => :recipient,
25
+ :with_properties => {:address => an_address})
26
+ end
27
+ msg.subject.set(subject)
28
+ msg.content.set(content)
29
+ return msg
30
+ end
31
31
 
32
- # test
33
- p make_message(['joe@foo.com', 'jane@bar.net'], 'Hello World', 'Some body text.', true)
32
+ # test
33
+ p make_message(['joe@foo.com', 'jane@bar.net'], 'Hello World', 'Some body text.', true)