際際滷

際際滷Share a Scribd company logo
于仂仄舒亳亰舒亳 于
舒亰舒弍仂从亠
Deus Ex
仂亞亟舒?
仂亞亟舒?
 仂于仂ム亳亠 亰舒亟舒亳
仂亠仄?
仂亠仄?
 亠仄
 亠
丼仂?
丼仂?
 弌弍仂从舒
弌弍仂从舒
+ 舒舒亳于舒亠 于亠
xcodebuild
xcodebuild 
-scheme MyiOSApp 
SYMROOT=束/Users/username/DebugLocation"
弌弍仂从舒
+ 舒舒亳于舒亠 于亠
xcodebuild
- 舒舒亳于舒亠 于亠
xcodebuild 
-workspace ./SomeProject.xcworkspace 
-scheme SomeProject-iOS 
-sdk iphonesimulator 
-destination 'platform=iOS Simulator,id=6F7F1DB6-EC1C-472A-80D3-28FA72C9F70A' 
CODE_SIGN_IDENTITY="${IDENTITY}" 
OTHER_CODE_SIGN_FLAGS="--keychain ${KEYCHAIN}" 
....
test
弌弍仂从舒
+ 舒舒亳于舒亠 于亠
xcodebuild
- 舒舒亳于舒亠 于亠
- 亠亳舒亠仄舒 于亟舒舒
CompileC /Users/skyer/Library/Developer/Xcode/DerivedData/ReactiveCocoa-dncnleuvdlfncahcublwmkwlvdpq/Build/Intermediates/CodeCoverage/ReactiveCocoa-iOS/Intermediates/ReactiveCocoa.build/Debug-
iphonesimulator/ReactiveCocoa-iOSTests.build/Objects-normal/x86_64/RACDelegateProxySpec.o ReactiveCocoaTests/Objective-C/RACDelegateProxySpec.m normal x86_64 objective-c
com.apple.compilers.llvm.clang.1_0.compiler
cd /Users/skyer/Desktop/work/ReactiveCocoa
export LANG=en_US.US-ASCII
export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch x86_64 -fmessage-length=0 -fdiagnostics-show-note-include-stack -fmacro-backtrace-limit=0 -std=gnu99 -fobjc-
arc -fmodules -gmodules -fmodules-cache-path=/Users/skyer/Library/Developer/Xcode/DerivedData/ModuleCache -fmodules-prune-interval=86400 -fmodules-prune-after=345600 -fbuild-session-
file=/Users/skyer/Library/Developer/Xcode/DerivedData/ModuleCache/Session.modulevalidation -fmodules-validate-once-per-build-session -Wnon-modular-include-in-framework-module -Werror=non-modular-include-in-
framework-module -Wno-trigraphs -fpascal-strings -O0 -fno-common -Werror -Wmissing-field-initializers -Wno-missing-prototypes -Werror=return-type -Wunreachable-code -Wno-implicit-atomic-properties -Werror=deprecated-
objc-isa-usage -Werror=objc-root-class -Wno-arc-repeated-use-of-weak -Wduplicate-method-match -Wmissing-braces -Wparentheses -Wswitch -Wunused-function -Wunused-label -Wno-unused-parameter -Wunused-variable -
Wunused-value -Wempty-body -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wfour-char-constants -Wconversion -Wconstant-conversion -Wint-conversion -Wbool-conversion -Wenum-conversion -Wsign-compare -
Wshorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match
. . .
. . .
弌弍仂从舒
+ 舒舒亳于舒亠 于亠
xcodebuild + xcpretty
- 舒舒亳于舒亠 于亠
 Check Dependencies
 Processing Info.plist
 Compiling ResultType.swift
 Compiling Result.swift
 Compiling Result_vers.c
 Linking Result
 Copying Result.h
弌弍仂从舒
+ 仂仂
+ 舒舒仍仍亠仍仆仂亠 于仗仂仍仆亠仆亳亠 亠仂于
- 仆仂亞亟舒 仆亠 舒弍仂舒亠
xctool
弌弍仂从舒
+ 仂亠 仆亠从亟舒
+ 弍亠从舒 仆舒亟 xcodebuild
+ 丼舒 fastlane
- 仆仂亞亟舒 仆亠 舒弍仂舒亠
- 亞仂仄仆亶 亳 仆亠 仂亠仆 仗仂亰舒仆亶 仍亠
fastlane scan
丼仂?
 弌弍仂从舒
 丐亠亳仂于舒仆亳亠
亳亳亠 亠
舒于亠亟亳亠 亠弍亠 CI
丐亠亳仂于舒仆亳亠
 Build bot
CI + Tests
丐亠亳仂于舒仆亳亠
 Build bot
 Branch + cron
 Pull request
 丕于亠亟仂仄仍亠仆亳
CI + Tests
丐亠亳仂于舒仆亳亠
 丕于亠亟仂仄仍亠仆亳
CI + Tests
丐亠亳仂于舒仆亳亠
 丕于亠亟仂仄仍亠仆亳
CI + Tests
丐亠亳仂于舒仆亳亠
 丕于亠亟仂仄仍亠仆亳
CI + Tests
丼仂?
 弌弍仂从舒
 丐亠亳仂于舒仆亳亠
 仂亟亞仂仂于从舒 亠仂于
亠
 亰仂弍舒亢亠仆亳
 弌仂从亳
 UI
亰仂弍舒亢亠仆亳
 亰 弍仂仍亳 从舒亳仆仂从 仂弍舒 @1x, @2x, 
 仗亳仄亳亰舒亳 亠仂于
 舒仍亳亟舒亳 亠仂于
ImageMagick
亰仂弍舒亢亠仆亳
Zeplin
亰仂弍舒亢亠仆亳
SwiftGen
仂亟仂亞亠仆亠舒亳
仂亟仂亞亠仆亠舒亳
 亳仆仂仆仆亠 仗仂亠
 亠仗亠亟从舒亰亠仄仂亠 从舒亠于仂
 仄从仂 亰舒亟舒
仂亞亟舒?
仂亟仂亞亠仆亠舒亳
 弌舒亳亠从仂亠 仂仗亳舒仆亳亠
 Compile-time 于舒仍亳亟舒亳
 亠仍亠亞亳仂于舒仆亳亠
舒亠仄?
仂亟仂亞亠仆亠舒亳
 仂 于亠仄 弍仂从亳 仗仂亠从舒
仂亞亟舒?
亰仂弍舒亢亠仆亳
SwiftGen
let image1 = UIImage(asset: .Banana)
let image2 = UIImage.Asset.Apple.image
extension UIImage {
enum Asset : String {
case GreenApple = "Green-Apple"
case RedApple = "Red-Apple"
case Banana = "Banana"
case BigPear = "Big_Pear"
case StopButtonEnabled = "stop.button.enabled"
var image: UIImage {
return UIImage(named: self.rawValue)!
}
}
}
亠
 亰仂弍舒亢亠仆亳
 弌仂从亳
 UI
弌仂从亳
LAAS
 Single source of truth
  仆亠 仍ミ頴湖 亳 亠亟舒从亳仂于舒
弌仂从亳
SwiftGen
enum L10n {
case AlertTitle
case AlertMessage
case Greetings(String, Int)
case ApplesCount(Int)
case BananasOwner(Int, String)
}
extension L10n : CustomStringConvertible {
var description : String { return self.string }
var string : String {
/* Implementation Details */
}
}
func tr(key: L10n) -> String {
return key.string
}
弌仂从亳
Static strings
 弌舒亳亠从亳亠 仂从亳
 舒仍亳亟舒亳 仍仂从舒仍亳亰舒亳亳
 丐亠亳亠仄仂 弍亠亰 亠仍亠从亳亳
亠
 亰仂弍舒亢亠仆亳
 弌仂从亳
 UI
UI
SwiftGen
let validateVC = StoryboardScene.Wizard.ValidatePassword.viewController()
let createVC = StoryboardScene.Wizard.createAccountViewController()
override func prepareForSegue(_ segue: UIStoryboardSegue, sender sender: AnyObject?) {
switch StoryboardSegue.Message(rawValue: segue.identifier)! {
case .Back: // Prepare transition
case .Forward: // Prepare transition
}
}
initialVC.performSegue(StoryboardSegue.Message.Back)
丼仂?
 弌弍仂从舒
 丐亠亳仂于舒仆亳亠
 仂亟亞仂仂于从舒 亠仂于
 舒亰舒弍仂从舒 (亳仍亳 于亠 仂舒仍仆仂亠)
亠 仂舒仍仆仂亠?
 仂亟仂亞亠仆亠舒亳 亠仂于 舒亶仍仂于
 Mocked backend
 DSL
仂亟仂亞亠仆亠舒亳 2
丼仂?
. . .
extension SignUpEmailViewModel.Model {
static func mock(
result result: Action<SignUpStepResult<SignUp.Email>, SignUp.Email, NoError> = Action { _ in .empty },
stringsService: StringsService = Strings.mockedLocalized,
analytics: AnalyticsService = { _ in }
) -> SignUpEmailViewModel.Model {
return SignUpEmailViewModel.Model(
result: result,
stringsService: stringsService,
analytics: analytics
)
}
}
extension SignUpEmailViewModel {
final class TestView: TestViewType {
let navigationTitle = ValueTestView<String>()
let emailDescription = ValueTestView<String>()
let emailPlaceholder = ValueTestView<String>()
let emailClearButtonMode = ValueTestView<UITextFieldViewMode>()
let status = ValueTestView<String>()
let statusStyle = ValueTestView<StatusStyle>()
let stepsLabel = ValueTestView<String>()
let originalEmail = ValueTestView<String>()
let emailSink = ValueTestView<String -> ()>()
let nextActive = ValueTestView<Bool>()
let next = ValueTestView<Action<Void, Void, NoError>>()
let nextTitle = ValueTestView<String>()
let keyboardFocus = ValueTestView<FocusType>()
let keyboardType = ValueTestView<UIKeyboardType>()
let keyboardReturnKeyType = ValueTestView<UIReturnKeyType>()
let touchOutsideSink = ValueTestView<SimpleAction>()
let back = ValueTestView<Action<Void, Void, NoError>>()
let willDisappear = ValueTestView<AppearanceAction>()
let disposable: ScopedDisposable?
init(_ viewModel: SignUpEmailViewModel) { }
}
}
. . .
struct SignUpEmailViewModel: ViewModelType {
struct Model {
let result: Action<SignUpStepResult<SignUp.Email>, SignUp.Email, NoError>
let stringsService: StringsService
let analytics: AnalyticsService
}
struct Presenters {
let navigationTitle: Presenter<String>
let emailDescription: Presenter<String>
let emailPlaceholder: Presenter<String>
let emailClearButtonMode: Presenter<UITextFieldViewMode>
let status: SerialPresenter<String>
let statusStyle: SerialPresenter<StatusStyle>
let stepsLabel: Presenter<String>
let originalEmail: Presenter<String>
let emailSink: Presenter<String -> ()>
let nextActive: SerialPresenter<Bool>
let next: Presenter<Action<Void, Void, NoError>>
let nextTitle: Presenter<String>
let keyboardFocus: SerialPresenter<FocusType>
let keyboardType: Presenter<UIKeyboardType>
let keyboardReturnKeyType: Presenter<UIReturnKeyType>
let touchOutsideSink: Presenter<SimpleAction>
let back: Presenter<Action<Void, Void, NoError>>
let willDisappear: Presenter<AppearanceAction>
}
. . .
}
仂亟仂亞亠仆亠舒亳 2
SourceKitten
 亅仂 从舒从 SourceKit, 仂仍从仂 从仂亳从
 舒亳仆仂-亳舒亠仄仂亠 AST
仂亟仂亞亠仆亠舒亳 2
Swift?
 仗仂亠仄 弍 亳 仆亠?
仂亟仂亞亠仆亠舒亳 2
 pod CommandLine
./Scripts/vmGen 
-t ./Scripts/vmSpecGen/VMSpecTemplate.swift
-i ./App/Screens/SignUpStory/SignUpEmailViewModel.swift
仂亟仂亞亠仆亠舒亳 2
 pod Stencil/Mustache
extension {{ vm.name }}
static func mock(
)
{% for modelItem in vm.modelItems %}
{{ modelItem.title }}: {{ modelItem.type }},
{% endfor %}
. . .
亠 仂舒仍仆仂亠?
 仂亟仂亞亠仆亠舒亳 亠仂于 舒亶仍仂于
 Mocked backend
 DSL
仍舒亟从舒 HTTP
丼仂?
 仂仍仂亠 从仂仍亳亠于仂 network edge-cases
 仆舒从舒 舒于仂亠仂于?
 仂仍亳 于 仗亳仍仂亢亠仆亳亳
仍舒亟从舒 HTTP
丼亠仄?
 Charles Proxy
 Mitm proxy
 Backend
 弌于仂亠 亠亠仆亳亠
仍舒亟从舒 HTTP
NodeJS?
brew install node
npm install http-proxy
npm install JSONStream
npm install event-stream
仍舒亟从舒 HTTP
Swift? Caramel!
 package Caramel
 libuv
 亠亠亳仗仂仍亰仂于舒仆亳亠 从仂亟仂于仂亶 弍舒亰
丼仂 亟舒仍亠?
 Swift Equatable?
 JSON Schema?
 CI visualisation?
Post scriptum
 ミ頴狐亠 于仂亳 从仂仍仍亠亞
Post scriptum
 ミ頴狐亠 于仂亳 从仂仍仍亠亞
 仂 亟仍 仂亞仂 于舒仄 仗亳亟亠 仍ミ頴狐 bash
brew install sourcekitten
xcodebuild -configuration Release -project Parser.xcodeproj -scheme Parser
CONFIGURATION_BUILD_DIR='./build'
rm -rf ../vmGen
mv ./build/Parser ../vmGen
rm -rf ./build
bold=$(tput bold)
normal=$(tput sgr0)
echo "nnn${bold}created file vmGen at App/Scripts"
echo "it ignored by git, so don't be afraid to rebuild it${normal}"
echo "nnpattern of usage from App rootnn ./Scripts/vmGen -t
./Scripts/vmSpecGen/VMSpecTemplate.swift -i
./App/Screens/SignUpStory/SignUpEmailViewModel.swift"
仂仗仂?

More Related Content

Similar to automation is iOS development (20)

个仆亟舒仄亠仆舒仍仆亠 仂仆仂于 舒亰舒弍仂从亳 仗仂亟 iOS. 舒于亠仍 丐舒亶从舒仍仂
个仆亟舒仄亠仆舒仍仆亠 仂仆仂于 舒亰舒弍仂从亳 仗仂亟 iOS. 舒于亠仍 丐舒亶从舒仍仂个仆亟舒仄亠仆舒仍仆亠 仂仆仂于 舒亰舒弍仂从亳 仗仂亟 iOS. 舒于亠仍 丐舒亶从舒仍仂
个仆亟舒仄亠仆舒仍仆亠 仂仆仂于 舒亰舒弍仂从亳 仗仂亟 iOS. 舒于亠仍 丐舒亶从舒仍仂
Stanfy
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
UA Mobile
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
Andrii Dzynia
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application Development
Anton Kirillov
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
Dmitry Demeshchuk
Scala for android
Scala for androidScala for android
Scala for android
Alexander Rusin
舒亠仄 仆亢仆舒 Scala?
舒亠仄 仆亢仆舒 Scala?舒亠仄 仆亢仆舒 Scala?
舒亠仄 仆亢仆舒 Scala?
Vasil Remeniuk
于仂仄舒亳亰舒亳 UI 亠亳仂于舒仆亳 仗仂亟 Windows 亳 Windows Phone
于仂仄舒亳亰舒亳 UI 亠亳仂于舒仆亳 仗仂亟 Windows 亳 Windows Phone于仂仄舒亳亰舒亳 UI 亠亳仂于舒仆亳 仗仂亟 Windows 亳 Windows Phone
于仂仄舒亳亰舒亳 UI 亠亳仂于舒仆亳 仗仂亟 Windows 亳 Windows Phone
CodeFest
Behat 于 PHP 亳仗仂仍亰仂于舒仆亳亠仄 Behat 亳 Mink
Behat 于 PHP  亳仗仂仍亰仂于舒仆亳亠仄 Behat 亳 MinkBehat 于 PHP  亳仗仂仍亰仂于舒仆亳亠仄 Behat 亳 Mink
Behat 于 PHP 亳仗仂仍亰仂于舒仆亳亠仄 Behat 亳 Mink
tyomo4ka
仂亟仂弍仆舒 仗亠亰亠仆舒亳 JavaScript 6 于 1
仂亟仂弍仆舒 仗亠亰亠仆舒亳 JavaScript 6 于 1仂亟仂弍仆舒 仗亠亰亠仆舒亳 JavaScript 6 于 1
仂亟仂弍仆舒 仗亠亰亠仆舒亳 JavaScript 6 于 1
Vasya Petrov
仂亳亰于仂亟亳亠仍仆仂 于 Django
仂亳亰于仂亟亳亠仍仆仂 于 Django仂亳亰于仂亟亳亠仍仆仂 于 Django
仂亳亰于仂亟亳亠仍仆仂 于 Django
MoscowDjango
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_school
ITmozg
Selenide puzzlers @ devclub.eu
Selenide puzzlers @ devclub.euSelenide puzzlers @ devclub.eu
Selenide puzzlers @ devclub.eu
Andrei Solntsev
Scala, Play Framework 亳 SBT 亟仍 弍仂亞仂 仗仂仂亳仗亳仂于舒仆亳 亳 舒亰舒弍仂从亳 于亠弍-仗...
Scala, Play Framework 亳 SBT 亟仍 弍仂亞仂 仗仂仂亳仗亳仂于舒仆亳 亳 舒亰舒弍仂从亳 于亠弍-仗...Scala, Play Framework 亳 SBT 亟仍 弍仂亞仂 仗仂仂亳仗亳仂于舒仆亳 亳 舒亰舒弍仂从亳 于亠弍-仗...
Scala, Play Framework 亳 SBT 亟仍 弍仂亞仂 仗仂仂亳仗亳仂于舒仆亳 亳 舒亰舒弍仂从亳 于亠弍-仗...
Magneta AI
Web 仂亠仆 2012 仍亠从亳 4
Web 仂亠仆 2012 仍亠从亳 4Web 仂亠仆 2012 仍亠从亳 4
Web 仂亠仆 2012 仍亠从亳 4
Technopark
仂亟仍仆仂亠 亠亳仂于舒仆亳亠 iOS-仗亳仍仂亢亠仆亳亶.
仂亟仍仆仂亠 亠亳仂于舒仆亳亠 iOS-仗亳仍仂亢亠仆亳亶.仂亟仍仆仂亠 亠亳仂于舒仆亳亠 iOS-仗亳仍仂亢亠仆亳亶.
仂亟仍仆仂亠 亠亳仂于舒仆亳亠 iOS-仗亳仍仂亢亠仆亳亶.
MageCloud
丐亠亳亶 仂 / 亳从仂 舒从仂于亳 (GP Solutions)
丐亠亳亶 仂 / 亳从仂 舒从仂于亳 (GP Solutions)丐亠亳亶 仂 / 亳从仂 舒从仂于亳 (GP Solutions)
丐亠亳亶 仂 / 亳从仂 舒从仂于亳 (GP Solutions)
Ontico
弌舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒
弌舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒 弌舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒
弌舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒
Pavel Tsukanov
舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒
舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒
舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒
Andrey Karpov
亠于舒亠仄 从仂仂仆亠 仍亳仄亳 Angular 2
亠于舒亠仄 从仂仂仆亠 仍亳仄亳  Angular 2亠于舒亠仄 从仂仂仆亠 仍亳仄亳  Angular 2
亠于舒亠仄 从仂仂仆亠 仍亳仄亳 Angular 2
Oleksii Okhrymenko
个仆亟舒仄亠仆舒仍仆亠 仂仆仂于 舒亰舒弍仂从亳 仗仂亟 iOS. 舒于亠仍 丐舒亶从舒仍仂
个仆亟舒仄亠仆舒仍仆亠 仂仆仂于 舒亰舒弍仂从亳 仗仂亟 iOS. 舒于亠仍 丐舒亶从舒仍仂个仆亟舒仄亠仆舒仍仆亠 仂仆仂于 舒亰舒弍仂从亳 仗仂亟 iOS. 舒于亠仍 丐舒亶从舒仍仂
个仆亟舒仄亠仆舒仍仆亠 仂仆仂于 舒亰舒弍仂从亳 仗仂亟 iOS. 舒于亠仍 丐舒亶从舒仍仂
Stanfy
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
UA Mobile
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
Andrii Dzynia
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application Development
Anton Kirillov
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
Dmitry Demeshchuk
舒亠仄 仆亢仆舒 Scala?
舒亠仄 仆亢仆舒 Scala?舒亠仄 仆亢仆舒 Scala?
舒亠仄 仆亢仆舒 Scala?
Vasil Remeniuk
于仂仄舒亳亰舒亳 UI 亠亳仂于舒仆亳 仗仂亟 Windows 亳 Windows Phone
于仂仄舒亳亰舒亳 UI 亠亳仂于舒仆亳 仗仂亟 Windows 亳 Windows Phone于仂仄舒亳亰舒亳 UI 亠亳仂于舒仆亳 仗仂亟 Windows 亳 Windows Phone
于仂仄舒亳亰舒亳 UI 亠亳仂于舒仆亳 仗仂亟 Windows 亳 Windows Phone
CodeFest
Behat 于 PHP 亳仗仂仍亰仂于舒仆亳亠仄 Behat 亳 Mink
Behat 于 PHP  亳仗仂仍亰仂于舒仆亳亠仄 Behat 亳 MinkBehat 于 PHP  亳仗仂仍亰仂于舒仆亳亠仄 Behat 亳 Mink
Behat 于 PHP 亳仗仂仍亰仂于舒仆亳亠仄 Behat 亳 Mink
tyomo4ka
仂亟仂弍仆舒 仗亠亰亠仆舒亳 JavaScript 6 于 1
仂亟仂弍仆舒 仗亠亰亠仆舒亳 JavaScript 6 于 1仂亟仂弍仆舒 仗亠亰亠仆舒亳 JavaScript 6 于 1
仂亟仂弍仆舒 仗亠亰亠仆舒亳 JavaScript 6 于 1
Vasya Petrov
仂亳亰于仂亟亳亠仍仆仂 于 Django
仂亳亰于仂亟亳亠仍仆仂 于 Django仂亳亰于仂亟亳亠仍仆仂 于 Django
仂亳亰于仂亟亳亠仍仆仂 于 Django
MoscowDjango
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_school
ITmozg
Selenide puzzlers @ devclub.eu
Selenide puzzlers @ devclub.euSelenide puzzlers @ devclub.eu
Selenide puzzlers @ devclub.eu
Andrei Solntsev
Scala, Play Framework 亳 SBT 亟仍 弍仂亞仂 仗仂仂亳仗亳仂于舒仆亳 亳 舒亰舒弍仂从亳 于亠弍-仗...
Scala, Play Framework 亳 SBT 亟仍 弍仂亞仂 仗仂仂亳仗亳仂于舒仆亳 亳 舒亰舒弍仂从亳 于亠弍-仗...Scala, Play Framework 亳 SBT 亟仍 弍仂亞仂 仗仂仂亳仗亳仂于舒仆亳 亳 舒亰舒弍仂从亳 于亠弍-仗...
Scala, Play Framework 亳 SBT 亟仍 弍仂亞仂 仗仂仂亳仗亳仂于舒仆亳 亳 舒亰舒弍仂从亳 于亠弍-仗...
Magneta AI
Web 仂亠仆 2012 仍亠从亳 4
Web 仂亠仆 2012 仍亠从亳 4Web 仂亠仆 2012 仍亠从亳 4
Web 仂亠仆 2012 仍亠从亳 4
Technopark
仂亟仍仆仂亠 亠亳仂于舒仆亳亠 iOS-仗亳仍仂亢亠仆亳亶.
仂亟仍仆仂亠 亠亳仂于舒仆亳亠 iOS-仗亳仍仂亢亠仆亳亶.仂亟仍仆仂亠 亠亳仂于舒仆亳亠 iOS-仗亳仍仂亢亠仆亳亶.
仂亟仍仆仂亠 亠亳仂于舒仆亳亠 iOS-仗亳仍仂亢亠仆亳亶.
MageCloud
丐亠亳亶 仂 / 亳从仂 舒从仂于亳 (GP Solutions)
丐亠亳亶 仂 / 亳从仂 舒从仂于亳 (GP Solutions)丐亠亳亶 仂 / 亳从仂 舒从仂于亳 (GP Solutions)
丐亠亳亶 仂 / 亳从仂 舒从仂于亳 (GP Solutions)
Ontico
弌舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒
弌舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒 弌舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒
弌舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒
Pavel Tsukanov
舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒
舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒
舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒
Andrey Karpov
亠于舒亠仄 从仂仂仆亠 仍亳仄亳 Angular 2
亠于舒亠仄 从仂仂仆亠 仍亳仄亳  Angular 2亠于舒亠仄 从仂仂仆亠 仍亳仄亳  Angular 2
亠于舒亠仄 从仂仂仆亠 仍亳仄亳 Angular 2
Oleksii Okhrymenko

automation is iOS development

  • 8. 弌弍仂从舒 + 舒舒亳于舒亠 于亠 xcodebuild xcodebuild -scheme MyiOSApp SYMROOT=束/Users/username/DebugLocation"
  • 9. 弌弍仂从舒 + 舒舒亳于舒亠 于亠 xcodebuild - 舒舒亳于舒亠 于亠 xcodebuild -workspace ./SomeProject.xcworkspace -scheme SomeProject-iOS -sdk iphonesimulator -destination 'platform=iOS Simulator,id=6F7F1DB6-EC1C-472A-80D3-28FA72C9F70A' CODE_SIGN_IDENTITY="${IDENTITY}" OTHER_CODE_SIGN_FLAGS="--keychain ${KEYCHAIN}" .... test
  • 10. 弌弍仂从舒 + 舒舒亳于舒亠 于亠 xcodebuild - 舒舒亳于舒亠 于亠 - 亠亳舒亠仄舒 于亟舒舒 CompileC /Users/skyer/Library/Developer/Xcode/DerivedData/ReactiveCocoa-dncnleuvdlfncahcublwmkwlvdpq/Build/Intermediates/CodeCoverage/ReactiveCocoa-iOS/Intermediates/ReactiveCocoa.build/Debug- iphonesimulator/ReactiveCocoa-iOSTests.build/Objects-normal/x86_64/RACDelegateProxySpec.o ReactiveCocoaTests/Objective-C/RACDelegateProxySpec.m normal x86_64 objective-c com.apple.compilers.llvm.clang.1_0.compiler cd /Users/skyer/Desktop/work/ReactiveCocoa export LANG=en_US.US-ASCII export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch x86_64 -fmessage-length=0 -fdiagnostics-show-note-include-stack -fmacro-backtrace-limit=0 -std=gnu99 -fobjc- arc -fmodules -gmodules -fmodules-cache-path=/Users/skyer/Library/Developer/Xcode/DerivedData/ModuleCache -fmodules-prune-interval=86400 -fmodules-prune-after=345600 -fbuild-session- file=/Users/skyer/Library/Developer/Xcode/DerivedData/ModuleCache/Session.modulevalidation -fmodules-validate-once-per-build-session -Wnon-modular-include-in-framework-module -Werror=non-modular-include-in- framework-module -Wno-trigraphs -fpascal-strings -O0 -fno-common -Werror -Wmissing-field-initializers -Wno-missing-prototypes -Werror=return-type -Wunreachable-code -Wno-implicit-atomic-properties -Werror=deprecated- objc-isa-usage -Werror=objc-root-class -Wno-arc-repeated-use-of-weak -Wduplicate-method-match -Wmissing-braces -Wparentheses -Wswitch -Wunused-function -Wunused-label -Wno-unused-parameter -Wunused-variable - Wunused-value -Wempty-body -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wfour-char-constants -Wconversion -Wconstant-conversion -Wint-conversion -Wbool-conversion -Wenum-conversion -Wsign-compare - Wshorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match . . . . . .
  • 11. 弌弍仂从舒 + 舒舒亳于舒亠 于亠 xcodebuild + xcpretty - 舒舒亳于舒亠 于亠 Check Dependencies Processing Info.plist Compiling ResultType.swift Compiling Result.swift Compiling Result_vers.c Linking Result Copying Result.h
  • 12. 弌弍仂从舒 + 仂仂 + 舒舒仍仍亠仍仆仂亠 于仗仂仍仆亠仆亳亠 亠仂于 - 仆仂亞亟舒 仆亠 舒弍仂舒亠 xctool
  • 13. 弌弍仂从舒 + 仂亠 仆亠从亟舒 + 弍亠从舒 仆舒亟 xcodebuild + 丼舒 fastlane - 仆仂亞亟舒 仆亠 舒弍仂舒亠 - 亞仂仄仆亶 亳 仆亠 仂亠仆 仗仂亰舒仆亶 仍亠 fastlane scan
  • 18. 丐亠亳仂于舒仆亳亠 Build bot Branch + cron Pull request 丕于亠亟仂仄仍亠仆亳 CI + Tests
  • 22. 丼仂? 弌弍仂从舒 丐亠亳仂于舒仆亳亠 仂亟亞仂仂于从舒 亠仂于
  • 24. 亰仂弍舒亢亠仆亳 亰 弍仂仍亳 从舒亳仆仂从 仂弍舒 @1x, @2x, 仗亳仄亳亰舒亳 亠仂于 舒仍亳亟舒亳 亠仂于 ImageMagick
  • 28. 仂亟仂亞亠仆亠舒亳 亳仆仂仆仆亠 仗仂亠 亠仗亠亟从舒亰亠仄仂亠 从舒亠于仂 仄从仂 亰舒亟舒 仂亞亟舒?
  • 29. 仂亟仂亞亠仆亠舒亳 弌舒亳亠从仂亠 仂仗亳舒仆亳亠 Compile-time 于舒仍亳亟舒亳 亠仍亠亞亳仂于舒仆亳亠 舒亠仄?
  • 30. 仂亟仂亞亠仆亠舒亳 仂 于亠仄 弍仂从亳 仗仂亠从舒 仂亞亟舒?
  • 31. 亰仂弍舒亢亠仆亳 SwiftGen let image1 = UIImage(asset: .Banana) let image2 = UIImage.Asset.Apple.image extension UIImage { enum Asset : String { case GreenApple = "Green-Apple" case RedApple = "Red-Apple" case Banana = "Banana" case BigPear = "Big_Pear" case StopButtonEnabled = "stop.button.enabled" var image: UIImage { return UIImage(named: self.rawValue)! } } }
  • 33. 弌仂从亳 LAAS Single source of truth 仆亠 仍ミ頴湖 亳 亠亟舒从亳仂于舒
  • 34. 弌仂从亳 SwiftGen enum L10n { case AlertTitle case AlertMessage case Greetings(String, Int) case ApplesCount(Int) case BananasOwner(Int, String) } extension L10n : CustomStringConvertible { var description : String { return self.string } var string : String { /* Implementation Details */ } } func tr(key: L10n) -> String { return key.string }
  • 35. 弌仂从亳 Static strings 弌舒亳亠从亳亠 仂从亳 舒仍亳亟舒亳 仍仂从舒仍亳亰舒亳亳 丐亠亳亠仄仂 弍亠亰 亠仍亠从亳亳
  • 37. UI SwiftGen let validateVC = StoryboardScene.Wizard.ValidatePassword.viewController() let createVC = StoryboardScene.Wizard.createAccountViewController() override func prepareForSegue(_ segue: UIStoryboardSegue, sender sender: AnyObject?) { switch StoryboardSegue.Message(rawValue: segue.identifier)! { case .Back: // Prepare transition case .Forward: // Prepare transition } } initialVC.performSegue(StoryboardSegue.Message.Back)
  • 38. 丼仂? 弌弍仂从舒 丐亠亳仂于舒仆亳亠 仂亟亞仂仂于从舒 亠仂于 舒亰舒弍仂从舒 (亳仍亳 于亠 仂舒仍仆仂亠)
  • 39. 亠 仂舒仍仆仂亠? 仂亟仂亞亠仆亠舒亳 亠仂于 舒亶仍仂于 Mocked backend DSL
  • 40. 仂亟仂亞亠仆亠舒亳 2 丼仂? . . . extension SignUpEmailViewModel.Model { static func mock( result result: Action<SignUpStepResult<SignUp.Email>, SignUp.Email, NoError> = Action { _ in .empty }, stringsService: StringsService = Strings.mockedLocalized, analytics: AnalyticsService = { _ in } ) -> SignUpEmailViewModel.Model { return SignUpEmailViewModel.Model( result: result, stringsService: stringsService, analytics: analytics ) } } extension SignUpEmailViewModel { final class TestView: TestViewType { let navigationTitle = ValueTestView<String>() let emailDescription = ValueTestView<String>() let emailPlaceholder = ValueTestView<String>() let emailClearButtonMode = ValueTestView<UITextFieldViewMode>() let status = ValueTestView<String>() let statusStyle = ValueTestView<StatusStyle>() let stepsLabel = ValueTestView<String>() let originalEmail = ValueTestView<String>() let emailSink = ValueTestView<String -> ()>() let nextActive = ValueTestView<Bool>() let next = ValueTestView<Action<Void, Void, NoError>>() let nextTitle = ValueTestView<String>() let keyboardFocus = ValueTestView<FocusType>() let keyboardType = ValueTestView<UIKeyboardType>() let keyboardReturnKeyType = ValueTestView<UIReturnKeyType>() let touchOutsideSink = ValueTestView<SimpleAction>() let back = ValueTestView<Action<Void, Void, NoError>>() let willDisappear = ValueTestView<AppearanceAction>() let disposable: ScopedDisposable? init(_ viewModel: SignUpEmailViewModel) { } } } . . . struct SignUpEmailViewModel: ViewModelType { struct Model { let result: Action<SignUpStepResult<SignUp.Email>, SignUp.Email, NoError> let stringsService: StringsService let analytics: AnalyticsService } struct Presenters { let navigationTitle: Presenter<String> let emailDescription: Presenter<String> let emailPlaceholder: Presenter<String> let emailClearButtonMode: Presenter<UITextFieldViewMode> let status: SerialPresenter<String> let statusStyle: SerialPresenter<StatusStyle> let stepsLabel: Presenter<String> let originalEmail: Presenter<String> let emailSink: Presenter<String -> ()> let nextActive: SerialPresenter<Bool> let next: Presenter<Action<Void, Void, NoError>> let nextTitle: Presenter<String> let keyboardFocus: SerialPresenter<FocusType> let keyboardType: Presenter<UIKeyboardType> let keyboardReturnKeyType: Presenter<UIReturnKeyType> let touchOutsideSink: Presenter<SimpleAction> let back: Presenter<Action<Void, Void, NoError>> let willDisappear: Presenter<AppearanceAction> } . . . }
  • 41. 仂亟仂亞亠仆亠舒亳 2 SourceKitten 亅仂 从舒从 SourceKit, 仂仍从仂 从仂亳从 舒亳仆仂-亳舒亠仄仂亠 AST
  • 43. 仂亟仂亞亠仆亠舒亳 2 pod CommandLine ./Scripts/vmGen -t ./Scripts/vmSpecGen/VMSpecTemplate.swift -i ./App/Screens/SignUpStory/SignUpEmailViewModel.swift
  • 44. 仂亟仂亞亠仆亠舒亳 2 pod Stencil/Mustache extension {{ vm.name }} static func mock( ) {% for modelItem in vm.modelItems %} {{ modelItem.title }}: {{ modelItem.type }}, {% endfor %} . . .
  • 45. 亠 仂舒仍仆仂亠? 仂亟仂亞亠仆亠舒亳 亠仂于 舒亶仍仂于 Mocked backend DSL
  • 46. 仍舒亟从舒 HTTP 丼仂? 仂仍仂亠 从仂仍亳亠于仂 network edge-cases 仆舒从舒 舒于仂亠仂于? 仂仍亳 于 仗亳仍仂亢亠仆亳亳
  • 47. 仍舒亟从舒 HTTP 丼亠仄? Charles Proxy Mitm proxy Backend 弌于仂亠 亠亠仆亳亠
  • 48. 仍舒亟从舒 HTTP NodeJS? brew install node npm install http-proxy npm install JSONStream npm install event-stream
  • 49. 仍舒亟从舒 HTTP Swift? Caramel! package Caramel libuv 亠亠亳仗仂仍亰仂于舒仆亳亠 从仂亟仂于仂亶 弍舒亰
  • 50. 丼仂 亟舒仍亠? Swift Equatable? JSON Schema? CI visualisation?
  • 51. Post scriptum ミ頴狐亠 于仂亳 从仂仍仍亠亞
  • 52. Post scriptum ミ頴狐亠 于仂亳 从仂仍仍亠亞 仂 亟仍 仂亞仂 于舒仄 仗亳亟亠 仍ミ頴狐 bash brew install sourcekitten xcodebuild -configuration Release -project Parser.xcodeproj -scheme Parser CONFIGURATION_BUILD_DIR='./build' rm -rf ../vmGen mv ./build/Parser ../vmGen rm -rf ./build bold=$(tput bold) normal=$(tput sgr0) echo "nnn${bold}created file vmGen at App/Scripts" echo "it ignored by git, so don't be afraid to rebuild it${normal}" echo "nnpattern of usage from App rootnn ./Scripts/vmGen -t ./Scripts/vmSpecGen/VMSpecTemplate.swift -i ./App/Screens/SignUpStory/SignUpEmailViewModel.swift"