plist4r 0.2.2 → 1.0.0

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 (88) hide show
  1. data/.gitignore +4 -0
  2. data/.yardopts +11 -0
  3. data/LICENSE +3 -1
  4. data/README.rdoc +25 -122
  5. data/Rakefile +14 -0
  6. data/VERSION +1 -1
  7. data/bin/plist4r +2 -0
  8. data/ext/osx_plist/Makefile +157 -0
  9. data/ext/osx_plist/extconf.rb +9 -0
  10. data/ext/osx_plist/plist.c +606 -0
  11. data/ext/osx_plist/plist.o +0 -0
  12. data/lib/plist4r.rb +6 -3
  13. data/lib/plist4r/application.rb +1 -2
  14. data/lib/plist4r/backend.rb +102 -34
  15. data/lib/plist4r/backend/c_f_property_list.rb +65 -0
  16. data/lib/plist4r/backend/c_f_property_list/LICENSE +19 -0
  17. data/lib/plist4r/backend/c_f_property_list/README +34 -0
  18. data/lib/plist4r/backend/c_f_property_list/cfpropertylist.rb +6 -0
  19. data/lib/plist4r/backend/c_f_property_list/rbBinaryCFPropertyList.rb +663 -0
  20. data/lib/plist4r/backend/c_f_property_list/rbCFPlistError.rb +26 -0
  21. data/lib/plist4r/backend/c_f_property_list/rbCFPropertyList.rb +348 -0
  22. data/lib/plist4r/backend/c_f_property_list/rbCFTypes.rb +241 -0
  23. data/lib/plist4r/backend/c_f_property_list/rbXMLCFPropertyList.rb +116 -0
  24. data/lib/plist4r/backend/example.rb +37 -52
  25. data/lib/plist4r/backend/haml.rb +47 -36
  26. data/lib/plist4r/backend/libxml4r.rb +24 -20
  27. data/lib/plist4r/backend/osx_plist.rb +82 -0
  28. data/lib/plist4r/backend/ruby_cocoa.rb +172 -54
  29. data/lib/plist4r/backend/test/data_types.rb +163 -0
  30. data/lib/plist4r/backend/test/harness.rb +255 -0
  31. data/lib/plist4r/backend/test/output.rb +47 -0
  32. data/lib/plist4r/backend_base.rb +4 -2
  33. data/lib/plist4r/{options.rb → cli.rb} +2 -1
  34. data/lib/plist4r/commands.rb +13 -8
  35. data/lib/plist4r/config.rb +36 -9
  36. data/lib/plist4r/docs/Backends.html +59 -0
  37. data/lib/plist4r/docs/DeveloperGuide.rdoc +53 -0
  38. data/lib/plist4r/docs/EditingPlistFiles.rdoc +88 -0
  39. data/lib/plist4r/docs/InfoPlistExample.rdoc +33 -0
  40. data/lib/plist4r/docs/LaunchdPlistExample.rdoc +33 -0
  41. data/lib/plist4r/docs/PlistKeyNames.rdoc +47 -0
  42. data/lib/plist4r/mixin/array_dict.rb +61 -0
  43. data/lib/plist4r/mixin/data_methods.rb +178 -54
  44. data/lib/plist4r/mixin/haml4r.rb +4 -0
  45. data/lib/plist4r/mixin/haml4r/css_attributes.rb +19 -0
  46. data/lib/plist4r/mixin/haml4r/examples.rb +261 -0
  47. data/lib/plist4r/mixin/haml4r/haml_table_example.rb +79 -0
  48. data/lib/plist4r/mixin/haml4r/table.rb +157 -0
  49. data/lib/plist4r/mixin/haml4r/table_cell.rb +160 -0
  50. data/lib/plist4r/mixin/haml4r/table_cells.rb +485 -0
  51. data/lib/plist4r/mixin/haml4r/table_section.rb +101 -0
  52. data/lib/plist4r/mixin/ordered_hash.rb +9 -1
  53. data/lib/plist4r/mixin/popen4.rb +1 -1
  54. data/lib/plist4r/mixin/ruby_stdlib.rb +154 -1
  55. data/lib/plist4r/mixin/script.rb +133 -0
  56. data/lib/plist4r/mixin/table.rb +435 -0
  57. data/lib/plist4r/plist.rb +272 -94
  58. data/lib/plist4r/plist_cache.rb +42 -43
  59. data/lib/plist4r/plist_type.rb +31 -74
  60. data/lib/plist4r/plist_type/info.rb +157 -3
  61. data/lib/plist4r/plist_type/launchd.rb +54 -48
  62. data/lib/plist4r/plist_type/plist.rb +1 -3
  63. data/plist4r.gemspec +74 -14
  64. data/spec/{examples.rb → launchd_examples.rb} +131 -139
  65. data/spec/plist4r/application_spec.rb +37 -0
  66. data/spec/plist4r/backend_spec.rb +256 -0
  67. data/spec/plist4r/cli_spec.rb +25 -0
  68. data/spec/plist4r/commands_spec.rb +20 -0
  69. data/spec/plist4r/config_spec.rb +38 -0
  70. data/spec/plist4r/mixin/array_dict_spec.rb +120 -0
  71. data/spec/plist4r/mixin/data_methods_spec.rb +96 -0
  72. data/spec/plist4r/mixin/haml4r/examples.rb +261 -0
  73. data/spec/plist4r/mixin/ruby_stdlib_spec.rb +228 -0
  74. data/spec/plist4r/plist_cache_spec.rb +261 -0
  75. data/spec/plist4r/plist_spec.rb +841 -23
  76. data/spec/plist4r/plist_type_spec.rb +126 -0
  77. data/spec/plist4r_spec.rb +53 -27
  78. data/spec/scratchpad.rb +226 -0
  79. data/spec/spec_helper.rb +5 -1
  80. metadata +109 -23
  81. data/lib/plist4r/backend/plutil.rb +0 -25
  82. data/lib/plist4r/mixin.rb +0 -7
  83. data/plists/array_mini.xml +0 -14
  84. data/plists/example_big_binary.plist +0 -0
  85. data/plists/example_medium_binary_launchd.plist +0 -0
  86. data/plists/example_medium_launchd.xml +0 -53
  87. data/plists/mini.xml +0 -12
  88. data/test.rb +0 -40
@@ -1,77 +1,76 @@
1
1
 
2
2
  require 'plist4r/backend'
3
+ require 'plist4r/mixin/ruby_stdlib'
4
+
3
5
  module Plist4r
4
6
  class PlistCache
5
7
  def initialize plist, *args, &blk
8
+ @checksum = {}
6
9
  @plist = plist
7
10
  @backend = Backend.new plist, *args, &blk
8
11
  end
9
12
 
10
- def checksum
11
- @plist.to_hash.hash
12
- end
13
-
14
- def last_checksum
15
- @checksum
16
- end
13
+ def from_string
14
+ if @from_string == @plist.from_string
15
+ unless @from_string_plist_type == @plist.plist_type
16
+ @from_string_plist_type = @plist.detect_plist_type
17
+ end
18
+ unless @from_string_file_format == @plist.file_format
19
+ @plist.file_format @from_string_file_format
20
+ end
21
+ else
22
+ @backend.call :from_string
23
+ @from_string = @plist.from_string
24
+ @from_string_file_format = @plist.file_format
17
25
 
18
- def update_checksum
19
- @checksum = @plist.to_hash.hash
26
+ @plist.detect_plist_type
27
+ unless @from_string_plist_type == @plist.plist_type
28
+ @from_string_plist_type = @plist.plist_type
29
+ end
30
+ end
31
+ @plist
20
32
  end
21
33
 
22
- def needs_update
23
- checksum != last_checksum
34
+ def update_checksum_for fmt
35
+ @checksum[fmt] = @plist.to_hash.hash
24
36
  end
25
37
 
26
- def from_string
27
- @backend.call :from_string
28
- update_checksum
29
- @plist.detect_plist_type
30
- @plist
38
+ def needs_update_for fmt
39
+ @checksum[fmt] != @plist.to_hash.hash
31
40
  end
32
41
 
33
42
  def to_xml
34
- if needs_update || @xml.nil?
35
- puts "needs update"
36
- update_checksum
43
+ if needs_update_for(:xml) || @xml.nil?
37
44
  @xml = @backend.call :to_xml
38
- else
39
- @xml
45
+ update_checksum_for(:xml)
40
46
  end
47
+ @xml
41
48
  end
42
-
49
+
43
50
  def to_binary
44
- if needs_update || @binary.nil?
45
- update_checksum
51
+ if needs_update_for(:binary) || @binary.nil?
46
52
  @binary = @backend.call :to_binary
47
- else
48
- @binary
53
+ update_checksum_for(:binary)
49
54
  end
55
+ @binary
50
56
  end
51
57
 
52
- def to_next_step
53
- if needs_update || @next_step.nil?
54
- update_checksum
55
- @next_step = @backend.call :to_next_step
56
- else
57
- @next_step
58
+ def to_gnustep
59
+ if needs_update_for(:gnustep) || @gnustep.nil?
60
+ @gnustep = @backend.call :to_gnustep
61
+ update_checksum_for(:gnustep)
58
62
  end
63
+ @gnustep
59
64
  end
60
-
65
+
61
66
  def open
62
67
  @backend.call :open
63
- update_checksum
64
- @plist.detect_plist_type
65
68
  @plist
66
69
  end
67
-
70
+
68
71
  def save
69
- if needs_update
70
- update_checksum
71
- @backend.call :save
72
- else
73
- true
74
- end
72
+ @backend.call :save
73
+ @plist.filename_path
75
74
  end
76
75
  end
77
- end
76
+ end
@@ -1,15 +1,22 @@
1
1
 
2
2
  require 'plist4r/mixin/data_methods'
3
+ require 'plist4r/mixin/array_dict'
3
4
 
4
5
  module Plist4r
5
6
  class PlistType
6
7
  include ::Plist4r::DataMethods
7
8
 
9
+ ValidKeys = {}
10
+
11
+ # @param [Plist4r::Plist] plist A pointer referencing back to the plist object
8
12
  def initialize plist, *args, &blk
9
13
  @plist = plist
10
14
  @hash = @orig = plist.to_hash
11
15
  end
12
16
 
17
+ # Set or return the plist's raw data object
18
+ # @param [Plist4r::OrderedHash] hash Set the hash if not nil
19
+ # @return [Plist4r::OrderedHash] @hash
13
20
  def hash hash=nil
14
21
  case hash
15
22
  when ::Plist4r::OrderedHash
@@ -21,95 +28,45 @@ module Plist4r
21
28
  end
22
29
  end
23
30
 
24
- def self.valid_keys
25
- raise "Method not implemented #{method_name.to_sym.inspect}, for class #{self.inspect}"
26
- end
27
-
28
- # A Hash Array of the supported plist keys for this type. These are only those plist keys
29
- # recognized as belonging to a specific plist datatype. Used in validation, part of DataMethods.
30
- # We usually overload this method in subclasses of {Plist4r::PlistType}.
31
+ # Compare a list of foreign keys to the valid keys for this known PlistType.
32
+ # Generate statistics about how many keys (what proportion) match the the key names
33
+ # match this particular PlistType.
34
+ # @param [Array] plist_keys The list of keys to compare to this PlistType
35
+ # @return [Hash] A hash of the match statistics
36
+ # @see Plist4r::Plist#detect_plist_type
31
37
  # @example
32
- # class Plist4r::PlistType::MyPlistType < PlistType
33
- # def self.valid_keys
34
- # {
35
- # :string => %w[PlistKeyS1 PlistKeyS2 ...],
36
- # :bool => %w[PlistKeyB1 PlistKeyB2 ...],
37
- # :integer => %w[PlistKeyI1 PlistKeyI2 ...],
38
- # :method_defined => %w[CustomPlistKey1 CustomPlistKey2 ...]
39
- # }
40
- # end
41
- # end
42
- #
43
- # plist.plist_type :my_plist_type
44
- # plist.plist_key_s1 "some string"
45
- # plist.plist_key_b1 true
46
- # plist.plist_key_i1 08
47
- # plist.custom_plist_key1 MyClass.new(opts)
48
- #
49
- def valid_keys
50
- self.class.valid_keys
51
- end
52
-
38
+ # Plist4r::PlistType::Launchd.match_stat ["ProgramArguments","Sockets","SomeArbitraryKeyName"]
39
+ # # => { :matches => 2, :ratio => 0.0465116279069767 }
53
40
  def self.match_stat plist_keys
54
- type_keys = valid_keys.values.flatten
41
+ type_keys = self::ValidKeys.values.flatten
55
42
  matches = plist_keys & type_keys
56
43
  include_ratio = matches.size.to_f / type_keys.size
57
44
  return :matches => matches.size, :ratio => include_ratio
58
45
  end
59
46
 
47
+ # @return The shortform string, in snake case, a unique name
48
+ # @example
49
+ # pt = Plist4r::PlistType::Launchd.new
50
+ # pt.to_s
51
+ # # => "launchd"
60
52
  def to_s
61
53
  return @string ||= self.class.to_s.gsub(/.*:/,"").snake_case
62
54
  end
63
55
 
56
+ # @return A symbol representation the shortform string, in snake case, a unique name
57
+ # @example
58
+ # pt = Plist4r::PlistType::Launchd.new
59
+ # pt.to_sym
60
+ # # => :launchd
64
61
  def to_sym
65
62
  return @sym ||= to_s.to_sym
66
63
  end
67
- end
68
-
69
- class ArrayDict
70
- include ::Plist4r::DataMethods
71
-
72
- def initialize orig, index=nil, &blk
73
- @orig = orig
74
- if index
75
- @enclosing_block = self.class.to_s.snake_case + "[#{index}]"
76
- @orig = @orig[index]
77
- else
78
- @enclosing_block = self.class.to_s.snake_case
79
- end
80
- # puts "@orig = #{@orig.inspect}"
81
- # puts "@enclosing_block = #{@enclosing_block}"
82
-
83
- @block = blk
84
- @hash = ::Plist4r::OrderedHash.new
85
- # puts "@hash = #{@hash}"
86
-
87
- instance_eval(&@block) if @block
88
- # puts "@hash = #{@hash}"
89
- end
90
-
91
- def hash
92
- @hash
93
- end
94
-
95
- def select *keys
96
- keys.each do |k|
97
- @hash[k] = @orig[k]
98
- end
99
- end
100
-
101
- def unselect *keys
102
- keys.each do |k|
103
- @hash.delete k
104
- end
105
- end
106
-
107
- def unselect_all
108
- @hash = ::Plist4r::OrderedHash.new
109
- end
110
64
 
111
- def select_all
112
- @hash = @orig
65
+ def array_dict method_sym, *args
66
+ a = ArrayDict.new @hash
67
+ result = eval "a.#{method_sym} *args"
68
+ @hash = @orig = a.hash
69
+ @plist.import_hash a.hash
113
70
  end
114
71
  end
115
72
  end
@@ -2,12 +2,166 @@
2
2
  require 'plist4r/plist_type'
3
3
 
4
4
  module Plist4r
5
+ # For documentation on the Info.plist keys, and their values, see:
6
+ # http://developer.apple.com/mac/library/documentation/General/Reference/InfoPlistKeyReference
5
7
  class PlistType::Info < PlistType
6
- def self.valid_keys
7
- {}
8
- end
8
+
9
+ ValidKeysCoreFoundation =
10
+ {
11
+ :string => %w[
12
+ CFAppleHelpAnchor
13
+ CFBundleDevelopmentRegion
14
+ CFBundleDisplayName
15
+ CFBundleExecutable
16
+ CFBundleGetInfoString
17
+ CFBundleHelpBookFolder
18
+ CFBundleHelpBookName
19
+ CFBundleIconFile
20
+ CFBundleIdentifier
21
+ CFBundleInfoDictionaryVersion
22
+ CFBundleName
23
+ CFBundlePackageType
24
+ CFBundleShortVersionString
25
+ CFBundleSignature
26
+ CFBundleVersion
27
+ CFPlugInDynamicRegistration
28
+ CFPlugInDynamicRegisterFunction
29
+ CFPlugInUnloadFunction
30
+ ],
31
+ :bool => %w[
32
+ CFBundleAllowMixedLocalizations
33
+ ],
34
+ :array_of_strings => %w[
35
+ CFBundleIconFiles
36
+ CFBundleLocalizations
37
+ ],
38
+ :array_of_hashes => %w[
39
+ CFBundleDocumentTypes
40
+ ],
41
+ :array => %w[
42
+ CFBundleDocumentTypes
43
+ CFBundleURLTypes
44
+ ],
45
+ :hash_of_strings => %w[
46
+ CFPlugInFactories
47
+ ],
48
+ :hash_of_arrays_of_strings => %w[
49
+ CFPlugInTypes
50
+ ],
51
+ }
52
+
53
+ ValidKeysLaunchServices =
54
+ {
55
+ :string => %w[
56
+ LSMinimumSystemVersion
57
+ LSUIElement
58
+ LSVisibleInClassic
59
+ MinimumOSVersion
60
+ ],
61
+ :bool => %w[
62
+ LSBackgroundOnly
63
+ LSFileQuarantineEnabled
64
+ LSGetAppDiedEvents
65
+ LSMultipleInstancesProhibited
66
+ LSRequiresIPhoneOS
67
+ LSRequiresNativeExecution
68
+ ],
69
+ :integer => %w[
70
+ LSUIPresentationMode
71
+ ],
72
+ :array_of_strings => %w[
73
+ LSArchitecturePriority
74
+ LSFileQuarantineExcludedPathPatterns
75
+ ],
76
+ :hash_of_strings => %w[
77
+ LSEnvironment
78
+ LSMinimumSystemVersionByArchitecture
79
+ ],
80
+ }
81
+
82
+ ValidKeysCocoa =
83
+ {
84
+ :string => %w[
85
+ NSDockTilePlugIn
86
+ NSHumanReadableCopyright
87
+ NSJavaRoot
88
+ NSMainNibFile
89
+ NSPersistentStoreTypeKey
90
+ NSPrefPaneIconFile
91
+ NSPrefPaneIconLabel
92
+ NSPrincipalClass
93
+ ],
94
+ :bool => %w[
95
+ NSSupportsSuddenTermination
96
+ ],
97
+ :bool_or_string => %w[
98
+ NSAppleScriptEnabled
99
+ NSJavaNeeded
100
+ ],
101
+ :array_of_strings => %w[
102
+ NSJavaPath
103
+ ],
104
+ :array_of_hashes => %w[
105
+ NSServices
106
+ UTExportedTypeDeclarations
107
+ UTImportedTypeDeclarations
108
+ ],
109
+ }
110
+
111
+ ValidKeysMacOsx =
112
+ {
113
+ :string => %w[ APInstallerURL ATSApplicationFontsPath ],
114
+ :bool => %w[ CSResourcesFileMapped QuartzGLEnable ],
115
+ :array_of_strings => %w[ APFiles ]
116
+ }
117
+
118
+ ValidKeysUiKit =
119
+ {
120
+ :string => %w[
121
+ UIInterfaceOrientation
122
+ UILaunchImageFile
123
+ UIStatusBarStyle
124
+ ],
125
+ :bool => %w[
126
+ UIApplicationExitsOnSuspend
127
+ UIFileSharingEnabled
128
+ UIPrerenderedIcon
129
+ UIRequiresPersistentWiFi
130
+ UIStatusBarHidden
131
+ UIViewEdgeAntialiasing
132
+ UIViewGroupOpacity
133
+ ],
134
+ :array_of_strings => %w[
135
+ UIAppFonts
136
+ UIBackgroundModes
137
+ UISupportedExternalAccessoryProtocols
138
+ UISupportedInterfaceOrientations
139
+ ],
140
+ :array_or_integer => %w[
141
+ UIDeviceFamily
142
+ ],
143
+ :array_or_hash => %w[
144
+ UIRequiredDeviceCapabilities
145
+ ],
146
+ }
147
+
148
+
149
+ # A Hash Array of the supported plist keys for this type. These are plist keys which belong to the
150
+ # PlistType for Info plists. Each CamelCased key name has a corresponding set_or_return method call.
151
+ # For example "CFBundleIdentifier" => c_f_bundle_identifier(value). For more information please see {file:PlistKeyNames}
152
+ # @see Plist4r::DataMethods
153
+ ValidKeys = {}.merge_array_of_hashes_of_arrays [
154
+ ValidKeysCoreFoundation,
155
+ ValidKeysLaunchServices,
156
+ ValidKeysCocoa,
157
+ ValidKeysMacOsx,
158
+ ValidKeysUiKit
159
+ ]
160
+
9
161
  end
10
162
  end
11
163
 
12
164
 
13
165
 
166
+
167
+
@@ -2,22 +2,31 @@
2
2
  require 'plist4r/plist_type'
3
3
 
4
4
  module Plist4r
5
+ # @author Dreamcat4 (dreamcat4@gmail.com)
5
6
  class PlistType::Launchd < PlistType
6
7
 
7
- # A Hash Array of the supported plist keys for this type. These are the plist keys are recognized to belong to a Launchd plist.
8
- # Used in validation, categorized by the value's DataType.
8
+ # A Hash Array of the supported plist keys for this type. These are plist keys which belong to the
9
+ # PlistType for Launchd plists. Each CamelCased key name has a corresponding set_or_return method call.
10
+ # For example "UserName" => user_name(value). For more information please see {file:PlistKeyNames}
9
11
  # @see Plist4r::DataMethods
10
- def self.valid_keys
11
- {
12
- :string => %w[Label UserName GroupName LimitLoadToSessionType Program RootDirectory WorkingDirectory StandardInPath StandardOutPath StandardErrorPath],
13
- :bool => %w[Disabled EnableGlobbing EnableTransactions OnDemand RunAtLoad InitGroups StartOnMount Debug WaitForDebugger AbandonProcessGroup HopefullyExitsFirst HopefullyExitsLast LowPriorityIO LaunchOnlyOnce],
14
- :integer => %w[Umask TimeOut ExitTimeOut ThrottleInterval StartInterval Nice],
15
- :array_of_strings => %w[LimitLoadToHosts LimitLoadFromHosts ProgramArguments WatchPaths QueueDirectories],
16
- :method_defined => %w[inetdCompatibility KeepAlive EnvironmentVariables StartCalendarInterval SoftResourceLimits, HardResourceLimits MachServices Sockets]
17
- }
18
- end
12
+ ValidKeys =
13
+ {
14
+ :string => %w[ Label UserName GroupName LimitLoadToSessionType Program RootDirectory \
15
+ WorkingDirectory StandardInPath StandardOutPath StandardErrorPath ],
16
+
17
+ :bool => %w[ Disabled EnableGlobbing EnableTransactions OnDemand RunAtLoad InitGroups \
18
+ StartOnMount Debug WaitForDebugger AbandonProcessGroup HopefullyExitsFirst \
19
+ HopefullyExitsLast LowPriorityIO LaunchOnlyOnce ],
20
+
21
+ :integer => %w[ Umask TimeOut ExitTimeOut ThrottleInterval StartInterval Nice ],
22
+
23
+ :array_of_strings => %w[ LimitLoadToHosts LimitLoadFromHosts ProgramArguments WatchPaths QueueDirectories ],
19
24
 
20
- # Set or return the plist key "inetdCompatibility"
25
+ :method_defined => %w[ inetdCompatibility KeepAlive EnvironmentVariables StartCalendarInterval
26
+ SoftResourceLimits, HardResourceLimits MachServices Sockets ]
27
+ }
28
+
29
+ # Set or return the plist key +inetdCompatibility+
21
30
  # @param [Hash <true,false>] value the
22
31
  # The presence of this key specifies that the daemon expects to be run as if it were launched from inetd.
23
32
  #
@@ -27,10 +36,10 @@ module Plist4r
27
36
  #
28
37
  # @example
29
38
  # # set inetdCompatibility
30
- # launchd_plist.inetdCompatibility({:wait => true})
39
+ # launchd_plist.inetd_compatibility({:wait => true})
31
40
  #
32
41
  # # return inetdCompatibility
33
- # launchd_plist.inetdCompatibility => hash or nil
42
+ # launchd_plist.inetd_compatibility => hash or nil
34
43
  #
35
44
  def inetd_compatibility value=nil
36
45
  key = "inetdCompatibility"
@@ -49,15 +58,14 @@ module Plist4r
49
58
  end
50
59
 
51
60
  class KeepAlive < ArrayDict
52
- def valid_keys
53
- {
54
- :bool => %w[SuccessfulExit NetworkState],
55
- :hash_of_bools => %w[PathState OtherJobEnabled]
56
- }
57
- end
61
+ ValidKeys =
62
+ {
63
+ :bool => %w[SuccessfulExit NetworkState],
64
+ :hash_of_bools => %w[PathState OtherJobEnabled]
65
+ }
58
66
  end
59
67
 
60
- # Set or return the plist key "KeepAlive"
68
+ # Set or return the plist key +KeepAlive+
61
69
  #
62
70
  # @param [true, false, Hash] value
63
71
  # This optional key is used to control whether your job is to be kept continuously running or to let demand and conditions control the invocation. The default is
@@ -121,7 +129,7 @@ module Plist4r
121
129
  end
122
130
  end
123
131
 
124
- # Set or return the plist key "EnvironmentVariables"
132
+ # Set or return the plist key +EnvironmentVariables+
125
133
  #
126
134
  # @example
127
135
  # # Set environment variables
@@ -153,12 +161,10 @@ module Plist4r
153
161
  end
154
162
 
155
163
  class StartCalendarInterval < ArrayDict
156
- def valid_keys
157
- { :integer => %w[Minute Hour Day Weekday Month] }
158
- end
164
+ ValidKeys = { :integer => %w[ Minute Hour Day Weekday Month ] }
159
165
  end
160
166
 
161
- # Set or return the plist key "StartCalendarInterval"
167
+ # Set or return the plist key +StartCalendarInterval+
162
168
  #
163
169
  # This optional key causes the job to be started every calendar interval as specified. Missing arguments are considered to be wildcard. The semantics are much like
164
170
  # crontab(5). Unlike cron which skips job invocations when the computer is asleep, launchd will start the job the next time the computer wakes up. If multiple
@@ -227,12 +233,11 @@ module Plist4r
227
233
  end
228
234
 
229
235
  class ResourceLimits < ArrayDict
230
- def valid_keys
231
- { :integer => %w[Core CPU Data FileSize MemoryLock NumberOfFiles NumberOfProcesses ResidentSetSize Stack] }
232
- end
236
+ ValidKeys = { :integer => %w[ Core CPU Data FileSize MemoryLock NumberOfFiles \
237
+ NumberOfProcesses ResidentSetSize Stack ] }
233
238
  end
234
239
 
235
- # Set or return the plist key "SoftResourceLimits"
240
+ # Set or return the plist key +SoftResourceLimits+
236
241
  #
237
242
  # Resource limits to be imposed on the job. These adjust variables set with setrlimit(2). The following keys apply:
238
243
  #
@@ -297,7 +302,7 @@ module Plist4r
297
302
  end
298
303
  end
299
304
 
300
- # Set or return the plist key "HardResourceLimits"
305
+ # Set or return the plist key +HardResourceLimits+
301
306
  #
302
307
  # Resource limits to be imposed on the job. These adjust variables set with setrlimit(2). The following keys apply:
303
308
  #
@@ -364,15 +369,13 @@ module Plist4r
364
369
 
365
370
  class MachServices < ArrayDict
366
371
  class MachService < ArrayDict
367
- def valid_keys
368
- { :bool => %w[ResetAtClose HideUntilCheckIn] }
369
- end
372
+ ValidKeys = { :bool => %w[ ResetAtClose HideUntilCheckIn ] }
370
373
  end
371
374
 
372
375
  def add service, value=nil, &blk
373
376
  if value
374
377
  @hash[service] = value
375
- set_or_return :bool, service, value
378
+ set_or_return_of_type :bool, service, value
376
379
  elsif blk
377
380
  @hash[service] = ::Plist4r::OrderedHash.new
378
381
  @hash[service] = ::LaunchdPlistStructs::MachServices::MachService.new(@hash[service],&blk).hash
@@ -382,9 +385,9 @@ module Plist4r
382
385
  end
383
386
  end
384
387
 
385
- # Set or return the plist key "MachServices"
388
+ # Set or return the plist key +MachServices+
386
389
  #
387
- # Structure: "A dictionary of booleans" or a "dictionary of dictionaries"
390
+ # Structure: +dictionary of booleans+ or +dictionary of dictionaries+
388
391
  #
389
392
  # This optional key is used to specify Mach services to be registered with the Mach bootstrap sub-system. Each key in this dictionary should be the name of service
390
393
  # to be advertised. The value of the key must be a boolean and set to true. Alternatively, a dictionary can be used instead of a simple true value.
@@ -433,14 +436,17 @@ module Plist4r
433
436
 
434
437
  class Sockets < ArrayDict
435
438
  class Socket < ArrayDict
436
- def valid_keys
437
- {
438
- :string => %w[SockType SockNodeName SockServiceName SockFamily SockProtocol SockPathName SecureSocketWithKey MulticastGroup],
439
- :bool => %w[SockPassive],
440
- :integer => %w[SockPathMode],
441
- :bool_or_string_or_array_of_strings => %w[Bonjour]
442
- }
443
- end
439
+ ValidKeys =
440
+ {
441
+ :string => %w[ SockType SockNodeName SockServiceName SockFamily SockProtocol \
442
+ SockPathName SecureSocketWithKey MulticastGroup ],
443
+
444
+ :bool => %w[ SockPassive ],
445
+
446
+ :integer => %w[ SockPathMode ],
447
+
448
+ :bool_or_string_or_array_of_strings => %w[ Bonjour ]
449
+ }
444
450
  end
445
451
 
446
452
  def add_socket_to_dictionary key, &blk
@@ -470,9 +476,9 @@ module Plist4r
470
476
  end
471
477
  end
472
478
 
473
- # Set or return the plist key "Sockets"
479
+ # Set or return the plist key +Sockets+
474
480
  #
475
- # Structure: "dictionary of dictionaries... OR dictionary of array of dictionaries..."
481
+ # Structure: +dictionary of dictionaries+ or +dictionary of array+ +of+ +dictionaries+
476
482
  #
477
483
  # Please see http://developer.apple.com/mac/library/documentation/MacOSX/Conceptual/BPSystemStartup/Articles/LaunchOnDemandDaemons.html
478
484
  # for more information about how to properly use the Sockets feature.
@@ -591,7 +597,7 @@ module Plist4r
591
597
  # bonjour ['smb']
592
598
  # end
593
599
  # # => Result: Exception error is raise the second time because the "Listeners" key already
594
- # # exists. We can forcefully overwrite this existing sockets key with `socket "Listeners" do`.
600
+ # # exists. We can forcefully overwrite this existing sockets key with +socket "Listeners" do+.
595
601
  #
596
602
  # # scenario 3:
597
603
  # socket "netbios-ssn" do