Class: RunLoop::App

Inherits:
Object
  • Object
show all
Defined in:
lib/run_loop/app.rb

Overview

A class for interacting with .app bundles.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app_bundle_path) ⇒ RunLoop::App

Note:

The `app_bundle_path` is expanded during initialization.

Creates a new App instance.

Parameters:

  • app_bundle_path (String)

    A path to a .app



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/run_loop/app.rb', line 15

def initialize(app_bundle_path)
  @path = File.expand_path(app_bundle_path)

  if !App.valid?(app_bundle_path)
    raise ArgumentError,
%Q{App does not exist at path or is not an app bundle.

#{app_bundle_path}

Bundle must:

1. be a directory that exists,
2. have a .app extension,
3. contain an Info.plist,
4. and the app binary (CFBundleExecutable) must exist
}
  end
end

Instance Attribute Details

#pathString (readonly)

Returns The path to the app bundle .app

Returns:

  • (String)

    The path to the app bundle .app



7
8
9
# File 'lib/run_loop/app.rb', line 7

def path
  @path
end

Instance Method Details

#archesObject

Returns the arches for the binary.



105
106
107
# File 'lib/run_loop/app.rb', line 105

def arches
  @arches ||= lipo.info
end

#build_versionRunLoop::Version? Also known as: bundle_version

Returns the CFBundleVersion of the app as Version instance.

Apple docs:

CFBundleVersion specifies the build version number of the bundle, which identifies an iteration (released or unreleased) of the bundle. The build version number should be a string comprised of three non-negative, period-separated integers with the first integer being greater than zero. The string should only contain numeric (0-9) and period (.) characters. Leading zeros are truncated from each integer and will be ignored (that is, 1.02.3 is equivalent to 1.2.3).

Returns:

  • (RunLoop::Version, nil)

    Returns a Version instance if the CFBundleVersion string is well formed and nil if not.



197
198
199
200
201
202
203
204
205
206
207
208
209
210
# File 'lib/run_loop/app.rb', line 197

def build_version
  string = plist_buddy.plist_read("CFBundleVersion", info_plist_path)
  begin
    version = RunLoop::Version.new(string)
  rescue
    if string && string != ""
      RunLoop.log_debug("CFBundleVersion: '#{string}' is not a well formed version string")
    else
      RunLoop.log_debug("CFBundleVersion is not defined in Info.plist")
    end
    version = nil
  end
  version
end

#bundle_identifierString

Inspects the app's Info.plist for the bundle identifier.

Returns:

  • (String)

    The value of CFBundleIdentifier.

Raises:

  • (RuntimeError)

    If the plist cannot be read or the CFBundleIdentifier is empty or does not exist.



84
85
86
87
88
89
90
# File 'lib/run_loop/app.rb', line 84

def bundle_identifier
  identifier = plist_buddy.plist_read("CFBundleIdentifier", info_plist_path)
  unless identifier
    raise "Expected key 'CFBundleIdentifier' in '#{info_plist_path}'"
  end
  identifier
end

#calabash_server_versionObject

Inspects the app's file for the server version



122
123
124
125
126
127
128
129
# File 'lib/run_loop/app.rb', line 122

def calabash_server_version
  version = nil
  executables.each do |executable|
    version = strings(executable).server_version
    break if version
  end
  version
end

#executable_nameString

Inspects the app's Info.plist for the executable name.

Returns:

  • (String)

    The value of CFBundleExecutable.

Raises:

  • (RuntimeError)

    If the plist cannot be read or the CFBundleExecutable is empty or does not exist.



96
97
98
99
100
101
102
# File 'lib/run_loop/app.rb', line 96

def executable_name
  name = plist_buddy.plist_read("CFBundleExecutable", info_plist_path)
  unless name
    raise "Expected key 'CFBundleExecutable' in '#{info_plist_path}'"
  end
  name
end

#info_plist_pathObject

Returns the Info.plist path.

Raises:

  • (RuntimeError)

    If there is no Info.plist.



76
77
78
# File 'lib/run_loop/app.rb', line 76

def info_plist_path
  @info_plist_path ||= File.join(path, 'Info.plist')
end

#marketing_versionRunLoop::Version? Also known as: short_bundle_version

Returns the CFBundleShortVersionString of the app as Version instance.

Apple docs:

CFBundleShortVersionString specifies the release version number of the bundle, which identifies a released iteration of the app. The release version number is a string comprised of three period-separated integers.

The first integer represents major revisions to the app, such as revisions that implement new features or major changes. The second integer denotes revisions that implement less prominent features. The third integer represents maintenance releases.

The value for this key differs from the value for CFBundleVersion, which identifies an iteration (released or unreleased) of the app. This key can be localized by including it in your InfoPlist.strings files.

Returns:

  • (RunLoop::Version, nil)

    Returns a Version instance if the CFBundleShortVersion string is well formed and nil if not.



165
166
167
168
169
170
171
172
173
174
175
176
177
178
# File 'lib/run_loop/app.rb', line 165

def marketing_version
  string = plist_buddy.plist_read("CFBundleShortVersionString", info_plist_path)
  begin
    version = RunLoop::Version.new(string)
  rescue
    if string && string != ""
      RunLoop.log_debug("CFBundleShortVersionString: '#{string}' is not a well formed version string")
    else
      RunLoop.log_debug("CFBundleShortVersionString is not defined in Info.plist")
    end
    version = nil
  end
  version
end

#physical_device?Boolean

True if the app has been built for physical devices

Returns:

  • (Boolean)


115
116
117
118
119
# File 'lib/run_loop/app.rb', line 115

def physical_device?
  arches.any? do |arch|
    arch[/arm/, 0]
  end
end

#sha1Object

Returns the sha1 of the application.



229
230
231
# File 'lib/run_loop/app.rb', line 229

def sha1
  RunLoop::Directory.directory_digest(path)
end

#simulator?Boolean

True if the app has been built for the simulator

Returns:

  • (Boolean)


110
111
112
# File 'lib/run_loop/app.rb', line 110

def simulator?
  arches.include?("i386") || arches.include?("x86_64")
end

#valid?Boolean

Is this a valid app?

Returns:

  • (Boolean)


58
59
60
# File 'lib/run_loop/app.rb', line 58

def valid?
  App.valid?(path)
end