motion-screenshots 0.0.1
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.
- checksums.yaml +7 -0
- data/README.md +95 -0
- data/lib/motion/motion-screenshots.rb +108 -0
- data/lib/motion-screenshots.rb +64 -0
- metadata +75 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1e45e4d791f33c71d3d293f9378b29f3507bb16a
|
4
|
+
data.tar.gz: ac7d5bbf01f869d5c460c523bb2d0cbddd5b8b83
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 14ed0214424a55bd7cc9b3a5dce879a00052ff650d878cef4fa704380d4d0adc3380c6104ed2be1eab236cb60d05954eeae9ee0475751e55caca9d2dab9ae1d3
|
7
|
+
data.tar.gz: 9bdde2151c34ee0b6a9b6944479d5e37020ffd271c4c227deb32f443fb8b94e18f006af64d9c2edaeb2b1ee91329c3019c238f498517937a1feba2c1da067287
|
data/README.md
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
# motion-screenshots
|
2
|
+
|
3
|
+
Automate your App Store screenshots with `rake screenshots`. Powered by [KSScreenshotManager](https://github.com/ksuther/KSScreenshotManager).
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'motion-screenshots'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install motion-screenshots
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
### Configuration
|
22
|
+
|
23
|
+
By default, screenshots will be placed in a `./screenshots/#{timestamp}` directory in your project. You can configure this a few different ways:
|
24
|
+
|
25
|
+
- `ENV['SCREENSHOTS_DIR']` - use this environment variable
|
26
|
+
- `app.screenshots_output_path=` - set this value in your Rakefile
|
27
|
+
- `app.manage_screenshots do |output_path|` - add this block in your Rakefile
|
28
|
+
|
29
|
+
### Code
|
30
|
+
|
31
|
+
Create one or more subclasses of `Motion::Screenshots::Base` and add them to `./app/screenshots`. This class uses a DSL you can use to setup what happens before and after various screenshots are taken.
|
32
|
+
|
33
|
+
```ruby
|
34
|
+
class AppScreenshots < Motion::Screenshots::Base
|
35
|
+
|
36
|
+
# Use `.screenshot` to take a synchronous shot
|
37
|
+
screenshot "menu" do
|
38
|
+
before do
|
39
|
+
# scroll down for a nice action shot
|
40
|
+
App.delegate.table_view_controller.scrollToRowAtIndexPath(
|
41
|
+
NSIndexPath.indexPathForRow(2, inSection: 1),
|
42
|
+
animated: false,
|
43
|
+
scrollPosition: UITableViewScrollPositionMiddle
|
44
|
+
)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Use `.async_screenshot` to take a screenshot
|
49
|
+
# at some point in the future (i.e. a timer, network calls, etc)
|
50
|
+
# Invoke `#ready!` to take the shot
|
51
|
+
async_screenshot "profile" do
|
52
|
+
before do
|
53
|
+
App.delegate.table_view_controller.selectRowAtIndexPath(
|
54
|
+
NSIndexPath.indexPathForRow(0, inSection: 1),
|
55
|
+
animated: false,
|
56
|
+
scrollPosition: UITableViewScrollPositionNone
|
57
|
+
)
|
58
|
+
|
59
|
+
# give the network some time...
|
60
|
+
Dispatch::Queue.main.after(3) {
|
61
|
+
ready!
|
62
|
+
}
|
63
|
+
end
|
64
|
+
|
65
|
+
# clean-up
|
66
|
+
after do
|
67
|
+
App.window.rootViewController.popViewControllerAnimated(false)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
```
|
72
|
+
|
73
|
+
Then, elsewhere in your code, simply let motion-screenshots know when to start the process:
|
74
|
+
|
75
|
+
```ruby
|
76
|
+
class AppDelegate
|
77
|
+
|
78
|
+
def application(application, didFinishLaunchingWithOptions:launchOptions)
|
79
|
+
# do other stuff...
|
80
|
+
|
81
|
+
AppScreenshots.start!
|
82
|
+
end
|
83
|
+
end
|
84
|
+
```
|
85
|
+
|
86
|
+
Screenshots are executed in the order listed in your class - doing any cleanup or pre-screenshot preparation is left to you.
|
87
|
+
|
88
|
+
### Running
|
89
|
+
|
90
|
+
Simple run `rake screenshots` and you're off! The task will uninstall and reinstall your CocoaPods, as to not include any of the private APIs bundled with `KSScreenshotManager`.
|
91
|
+
|
92
|
+
## Contact
|
93
|
+
|
94
|
+
[Clay Allsopp](http://clayallsopp.com/)
|
95
|
+
[@clayallsopp](https://twitter.com/clayallsopp)
|
@@ -0,0 +1,108 @@
|
|
1
|
+
if !Kernel.const_defined?(:KSScreenshotManager)
|
2
|
+
class KSScreenshotManager
|
3
|
+
def init
|
4
|
+
@started = true
|
5
|
+
end
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
module Motion
|
10
|
+
module Screenshots
|
11
|
+
class Base < KSScreenshotManager
|
12
|
+
SCREENSHOTS_BASE_FOLDER = "motion_screenshots"
|
13
|
+
class << self
|
14
|
+
# Adds a namespace folder for this screenshot class
|
15
|
+
def group_by(&block)
|
16
|
+
shared.group_by_block = block
|
17
|
+
end
|
18
|
+
|
19
|
+
def async_screenshot(title, &block)
|
20
|
+
shared.async_screenshot(title, &block)
|
21
|
+
end
|
22
|
+
|
23
|
+
def screenshot(title, &block)
|
24
|
+
shared.screenshot(title, &block)
|
25
|
+
end
|
26
|
+
|
27
|
+
def start!
|
28
|
+
shared.start!
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
def shared
|
33
|
+
@shared ||= alloc.init
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
attr_accessor :group_by_block, :screenshot_groups
|
38
|
+
|
39
|
+
def init
|
40
|
+
super
|
41
|
+
@group_by_block = nil
|
42
|
+
@screenshot_groups = []
|
43
|
+
self
|
44
|
+
end
|
45
|
+
|
46
|
+
def group_by(&block)
|
47
|
+
@group_by_block = block
|
48
|
+
end
|
49
|
+
|
50
|
+
def async_screenshot(title, &block)
|
51
|
+
@screenshot_groups << ScreenshotGroup.new(title, true, self, &block)
|
52
|
+
end
|
53
|
+
|
54
|
+
def screenshot(title, &block)
|
55
|
+
@screenshot_groups << ScreenshotGroup.new(title, false, self, &block)
|
56
|
+
end
|
57
|
+
|
58
|
+
def setupScreenshotActions
|
59
|
+
@screenshot_groups.each do |sg|
|
60
|
+
addScreenshotAction sg.to_KSScreenshotAction
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def start!
|
65
|
+
return if @started
|
66
|
+
|
67
|
+
@started = true
|
68
|
+
|
69
|
+
documents_path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true)[0].retain
|
70
|
+
screenshot_path = File.join(documents_path, SCREENSHOTS_BASE_FOLDER)
|
71
|
+
screenshot_path = File.join(screenshot_path, group_by_block.call) if @group_by_block
|
72
|
+
self.screenshotsURL = NSURL.fileURLWithPath(screenshot_path)
|
73
|
+
|
74
|
+
takeScreenshots
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
class ScreenshotGroup
|
79
|
+
def initialize(title, is_async, manager, &eval_block)
|
80
|
+
@title = title
|
81
|
+
@is_async = is_async
|
82
|
+
@manager = manager
|
83
|
+
@before_actions = nil
|
84
|
+
@after_actions = nil
|
85
|
+
instance_eval(&eval_block) if eval_block
|
86
|
+
end
|
87
|
+
|
88
|
+
def before(&actions)
|
89
|
+
@before_actions = actions
|
90
|
+
end
|
91
|
+
|
92
|
+
def after(&actions)
|
93
|
+
@after_actions = actions
|
94
|
+
end
|
95
|
+
|
96
|
+
def ready!
|
97
|
+
@manager.actionIsReady
|
98
|
+
end
|
99
|
+
|
100
|
+
def to_KSScreenshotAction
|
101
|
+
KSScreenshotAction.actionWithName(@title, asynchronous: @is_async,
|
102
|
+
actionBlock:-> { @before_actions.call if @before_actions },
|
103
|
+
cleanupBlock: -> { @after_actions.call if @after_actions }
|
104
|
+
)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
unless defined?(Motion::Project::Config)
|
2
|
+
raise "This file must be required within a RubyMotion project Rakefile."
|
3
|
+
end
|
4
|
+
|
5
|
+
require 'motion-cocoapods'
|
6
|
+
require 'fileutils'
|
7
|
+
require 'shellwords'
|
8
|
+
|
9
|
+
lib_dir_path = File.dirname(File.expand_path(__FILE__))
|
10
|
+
Motion::Project::App.setup do |app|
|
11
|
+
gem_files = Dir.glob(File.join(lib_dir_path, "motion/**/*.rb"))
|
12
|
+
app.files.unshift(gem_files).flatten!
|
13
|
+
end
|
14
|
+
|
15
|
+
module Motion; module Project; class Config
|
16
|
+
attr_accessor :screenshot_callback
|
17
|
+
|
18
|
+
variable :screenshots_output_path
|
19
|
+
|
20
|
+
def manage_screenshots(&block)
|
21
|
+
@screenshot_callback = block
|
22
|
+
end
|
23
|
+
end; end; end
|
24
|
+
|
25
|
+
namespace 'screenshots' do
|
26
|
+
task :start do
|
27
|
+
screenshots_output_path = ENV['SCREENSHOTS_DIR']
|
28
|
+
screenshots_output_path ||= App.config.screenshots_output_path
|
29
|
+
screenshots_output_path ||= File.join(`pwd`.strip, "screenshots", Time.now.to_i.to_s)
|
30
|
+
FileUtils.mkdir_p screenshots_output_path
|
31
|
+
|
32
|
+
app_config = Motion::Project::App.config_without_setup
|
33
|
+
app_config.pods do
|
34
|
+
pod 'KSScreenshotManager'
|
35
|
+
end
|
36
|
+
|
37
|
+
at_exit {
|
38
|
+
# Copy files
|
39
|
+
target = ENV['target'] || app_config.sdk_version
|
40
|
+
sim_apps = File.expand_path("~/Library/Application Support/iPhone Simulator/*/Applications")
|
41
|
+
app_dir = nil
|
42
|
+
app = app_config.app_bundle('iPhoneSimulator')
|
43
|
+
app_dir = File.dirname(Dir.glob("#{sim_apps}/**/#{File.basename(app)}").sort_by { |f|
|
44
|
+
File.mtime(f)
|
45
|
+
}.reverse.first)
|
46
|
+
motion_screenshots = File.join(app_dir, "Documents", "motion_screenshots")
|
47
|
+
screenshot_files = Dir[File.join(motion_screenshots, "**", "*")]
|
48
|
+
FileUtils.cp_r(screenshot_files, screenshots_output_path)
|
49
|
+
if app_config.screenshot_callback
|
50
|
+
app_config.screenshot_callback.call(screenshots_output_path)
|
51
|
+
else
|
52
|
+
`open #{screenshots_output_path.shellescape}`
|
53
|
+
end
|
54
|
+
puts "Re-installing pods..."
|
55
|
+
`bundle exec rake pod:install`
|
56
|
+
}
|
57
|
+
|
58
|
+
Rake::Task["pod:install"].invoke
|
59
|
+
Rake::Task["default"].invoke
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
desc "Take screenshots in your app"
|
64
|
+
task :screenshots => "screenshots:start"
|
metadata
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: motion-screenshots
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Clay Allsopp
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-01-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: motion-cocoapods
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.4.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.4.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: Take screenshots with RubyMotion
|
42
|
+
email:
|
43
|
+
- clay@usepropeller.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- README.md
|
49
|
+
- lib/motion/motion-screenshots.rb
|
50
|
+
- lib/motion-screenshots.rb
|
51
|
+
homepage: https://github.com/usepropeller/motion-screenshots
|
52
|
+
licenses:
|
53
|
+
- MIT
|
54
|
+
metadata: {}
|
55
|
+
post_install_message:
|
56
|
+
rdoc_options: []
|
57
|
+
require_paths:
|
58
|
+
- lib
|
59
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - '>='
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
requirements: []
|
70
|
+
rubyforge_project:
|
71
|
+
rubygems_version: 2.0.3
|
72
|
+
signing_key:
|
73
|
+
specification_version: 4
|
74
|
+
summary: Take screenshots with RubyMotion
|
75
|
+
test_files: []
|