yopta_switcher 0.1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 34208e2962a5669de56be377d0dd47275afa4a1b
4
+ data.tar.gz: 9e493593141fad7e6f6546a2c346e4be3b67f466
5
+ SHA512:
6
+ metadata.gz: 91cbba17cdc2c6d15a308ed494ed6387a25249dab38735edbcc4a912c22f9172f94454e8ac0a2f30f6baf2b877462a49cf2cccb32a018de9e736ef1066ea58be
7
+ data.tar.gz: 744182168fe98890835e46a31e41a3ae21d6c29ad9e63cb426098a7901c5ce78022bdbb7f653ecd13efec40baf57046bb59e7f6e0fae7c583b22bbd32ac8b644
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'yopta_switcher/cli'
4
+
5
+ YoptaSwitcher::CLI.run(ARGV)
@@ -0,0 +1,5 @@
1
+ require 'yopta_switcher/version'
2
+ require 'yopta_switcher/selenium_driver_adapter'
3
+ require 'yopta_switcher/client'
4
+ require 'yopta_switcher/operations/turn_on'
5
+ require 'yopta_switcher/operations/turn_off'
@@ -0,0 +1,20 @@
1
+ require 'yopta_switcher'
2
+ require 'yopta_switcher/cli/options'
3
+ require 'yopta_switcher/cli/options_parser'
4
+ require 'yopta_switcher/cli/operation_builder'
5
+
6
+ module YoptaSwitcher
7
+ module CLI
8
+ def self.run(argv = [])
9
+ options_parser = OptionsParser.new(argv: argv, options: Options.new)
10
+ options_parser.parse!
11
+ options = options_parser.options
12
+
13
+ operation_builder = OperationBuilder.new(options)
14
+ operation_builder.build
15
+ operation = operation_builder.operation
16
+
17
+ operation.call
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,58 @@
1
+ require 'selenium-webdriver'
2
+ require 'yopta_switcher'
3
+
4
+ module YoptaSwitcher
5
+ module CLI
6
+ class OperationBuilder
7
+ attr_reader :client, :driver, :options, :operation
8
+
9
+ def initialize(options)
10
+ @options = options
11
+ @driver = build_driver(options)
12
+ @client = build_client(@driver, options)
13
+ end
14
+
15
+ def build
16
+ @operation ||=
17
+ options.
18
+ operation_class.
19
+ new(
20
+ client: client,
21
+ login: options.login,
22
+ password: options.password
23
+ )
24
+ end
25
+
26
+ private
27
+
28
+ def build_driver(options)
29
+ wait = wait_class.new(timeout: options.wait_timeout)
30
+ driver = webdriver_class.for(options.browser)
31
+ driver_adapter_class.new(driver: driver, wait_instance: wait)
32
+ end
33
+
34
+ def build_client(driver, options)
35
+ client_class.new(
36
+ driver: driver,
37
+ login_url: options.login_url
38
+ )
39
+ end
40
+
41
+ def client_class
42
+ YoptaSwitcher::Client
43
+ end
44
+
45
+ def wait_class
46
+ Selenium::WebDriver::Wait
47
+ end
48
+
49
+ def webdriver_class
50
+ Selenium::WebDriver
51
+ end
52
+
53
+ def driver_adapter_class
54
+ YoptaSwitcher::SeleniumDriverAdapter
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,13 @@
1
+ module YoptaSwitcher
2
+ module CLI
3
+ Options =
4
+ Struct.new(
5
+ :login_url,
6
+ :login,
7
+ :password,
8
+ :wait_timeout,
9
+ :browser,
10
+ :operation_class
11
+ )
12
+ end
13
+ end
@@ -0,0 +1,98 @@
1
+ require 'optparse'
2
+ require 'optparse/uri'
3
+
4
+ module YoptaSwitcher
5
+ module CLI
6
+ class OptionsParser
7
+ OPERATION_NAME_TO_CLASS_MAPPING = {
8
+ 'turn_on' => YoptaSwitcher::Operations::TurnOn,
9
+ 'turn_off' => YoptaSwitcher::Operations::TurnOff
10
+ }.freeze
11
+
12
+ BROWSER_MAPPING = {
13
+ 'phantomjs' => :phantomjs,
14
+ 'firefox' => :firefox
15
+ }.freeze
16
+
17
+ attr_reader :options, :argv, :parser
18
+
19
+ def initialize(argv:, options:)
20
+ @options = options
21
+ @argv = argv
22
+ @parser = OptionParser.new
23
+ define_options
24
+ end
25
+
26
+ def define_options
27
+ define_login_url_option
28
+ define_login_option
29
+ define_password_option
30
+ define_wait_option
31
+ define_operation_option
32
+ define_browser_option
33
+ end
34
+
35
+ def parse!
36
+ set_default_options
37
+ parser.parse!(argv)
38
+ options
39
+ end
40
+
41
+ private
42
+
43
+ def set_default_options
44
+ options.wait_timeout = 10
45
+ options.browser = :phantomjs
46
+ options.operation_class = YoptaSwitcher::Operations::TurnOn
47
+ end
48
+
49
+ def define_login_url_option
50
+ parser.on('-u Login URL', URI) do |url|
51
+ options.login_url = url.to_s
52
+ end
53
+ end
54
+
55
+ def define_login_option
56
+ parser.on('-l Login') do |login|
57
+ options.login = login
58
+ end
59
+ end
60
+
61
+ def define_password_option
62
+ parser.on('-p Password') do |password|
63
+ options.password = password
64
+ end
65
+ end
66
+
67
+ def define_wait_option
68
+ parser.on(
69
+ '-w Wait timeout in seconds',
70
+ OptionParser::DecimalInteger,
71
+ '10'
72
+ ) do |wait|
73
+ options.wait_timeout = wait
74
+ end
75
+ end
76
+
77
+ def define_operation_option
78
+ parser.on(
79
+ '-o Operation',
80
+ OPERATION_NAME_TO_CLASS_MAPPING.keys,
81
+ OPERATION_NAME_TO_CLASS_MAPPING.keys.join(', ')
82
+ ) do |operation|
83
+ options.operation_class = OPERATION_NAME_TO_CLASS_MAPPING[operation]
84
+ end
85
+ end
86
+
87
+ def define_browser_option
88
+ parser.on(
89
+ '-b Browser',
90
+ BROWSER_MAPPING.keys,
91
+ BROWSER_MAPPING.values.join(', ')
92
+ ) do |browser|
93
+ options.browser = BROWSER_MAPPING[browser]
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,68 @@
1
+ module YoptaSwitcher
2
+ class Client
3
+ DEFAULT_CLICKS_NUMBER = 15
4
+
5
+ attr_reader :driver, :login_url
6
+
7
+ def initialize(driver:, login_url:)
8
+ @driver = driver
9
+ @login_url = login_url
10
+ end
11
+
12
+ def login(login:, password:)
13
+ driver.visit(login_url)
14
+
15
+ username_element = driver.find_element(name: 'login')
16
+ driver.clear(username_element)
17
+ driver.fill_in(username_element, login)
18
+
19
+ password_element = driver.find_element(name: 'password')
20
+ driver.clear(password_element)
21
+ driver.fill_in(password_element, password)
22
+
23
+ driver.submit(password_element)
24
+ end
25
+
26
+ def set_lowest_subscription_level(clicks_number = DEFAULT_CLICKS_NUMBER)
27
+ decrease_button =
28
+ driver.wait { driver.find_element(css: 'div.decrease a') }
29
+ increase_button = driver.find_element(css: 'div.increase a')
30
+ clicks_number.times do
31
+ driver.click(decrease_button)
32
+ end
33
+ driver.click(increase_button)
34
+ end
35
+
36
+ def set_highest_subscription_level(clicks_number = DEFAULT_CLICKS_NUMBER)
37
+ increase_button =
38
+ driver.wait { driver.find_element(css: 'div.increase a') }
39
+ decrease_button = driver.find_element(css: 'div.decrease a')
40
+ clicks_number.times do
41
+ driver.click(increase_button)
42
+ end
43
+ end
44
+
45
+ def apply_selected_subscription_level
46
+ apply_button =
47
+ driver.wait { driver.find_element(css: '.main-offer .tariff a.btn') }
48
+
49
+ driver.click(apply_button)
50
+ driver.wait do
51
+ driver.
52
+ find_element(
53
+ css: '.main-offer .tariff .tarriff-info .message-wrapper'
54
+ )
55
+ end
56
+ end
57
+
58
+ def logout
59
+ logout_button_text = 'Выход'
60
+ logout_button = driver.find_element(link_text: logout_button_text)
61
+ driver.click(logout_button)
62
+ end
63
+
64
+ def quit
65
+ driver.quit
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,21 @@
1
+ module YoptaSwitcher
2
+ module Operations
3
+ class TurnOff
4
+ attr_reader :client, :login, :password
5
+
6
+ def initialize(client:, login:, password:)
7
+ @client = client
8
+ @login = login
9
+ @password = password
10
+ end
11
+
12
+ def call
13
+ client.login(login: login, password: password)
14
+ client.set_lowest_subscription_level
15
+ client.apply_selected_subscription_level
16
+ client.logout
17
+ client.quit
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ module YoptaSwitcher
2
+ module Operations
3
+ class TurnOn
4
+ attr_reader :client, :login, :password
5
+
6
+ def initialize(client:, login:, password:)
7
+ @client = client
8
+ @login = login
9
+ @password = password
10
+ end
11
+
12
+ def call
13
+ client.login(login: login, password: password)
14
+ client.set_highest_subscription_level
15
+ client.apply_selected_subscription_level
16
+ client.logout
17
+ client.quit
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,42 @@
1
+ module YoptaSwitcher
2
+ class SeleniumDriverAdapter
3
+ attr_reader :driver, :wait_instance
4
+
5
+ def initialize(driver:, wait_instance:)
6
+ @driver = driver
7
+ @wait_instance = wait_instance
8
+ end
9
+
10
+ def visit(url)
11
+ driver.navigate.to(url)
12
+ end
13
+
14
+ def wait(&block)
15
+ wait_instance.until(&block)
16
+ end
17
+
18
+ def fill_in(element, input_string)
19
+ element.send_keys(input_string)
20
+ end
21
+
22
+ def find_element(finder_args)
23
+ driver.find_element(finder_args)
24
+ end
25
+
26
+ def click(element)
27
+ element.click
28
+ end
29
+
30
+ def submit(element)
31
+ element.submit
32
+ end
33
+
34
+ def clear(element)
35
+ element.clear
36
+ end
37
+
38
+ def quit
39
+ driver.quit
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,3 @@
1
+ module YoptaSwitcher
2
+ VERSION = '0.1.1'
3
+ end
metadata ADDED
@@ -0,0 +1,169 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: yopta_switcher
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Alexander Panasyuk
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-06-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: selenium-webdriver
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.4'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.4'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.15'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.15'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '5.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '5.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry-byebug
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.4'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.4'
83
+ - !ruby/object:Gem::Dependency
84
+ name: guard
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.14'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.14'
97
+ - !ruby/object:Gem::Dependency
98
+ name: guard-minitest
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.4'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '2.4'
111
+ - !ruby/object:Gem::Dependency
112
+ name: minitest-stub_any_instance
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '='
116
+ - !ruby/object:Gem::Version
117
+ version: 1.0.1
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '='
123
+ - !ruby/object:Gem::Version
124
+ version: 1.0.1
125
+ description: Switches Internet access subscription terms. Works for one anonymous
126
+ ISP.
127
+ email:
128
+ - panasmeister@gmail.com
129
+ executables:
130
+ - yopta_switcher
131
+ extensions: []
132
+ extra_rdoc_files: []
133
+ files:
134
+ - "./lib/yopta_switcher.rb"
135
+ - "./lib/yopta_switcher/cli.rb"
136
+ - "./lib/yopta_switcher/cli/operation_builder.rb"
137
+ - "./lib/yopta_switcher/cli/options.rb"
138
+ - "./lib/yopta_switcher/cli/options_parser.rb"
139
+ - "./lib/yopta_switcher/client.rb"
140
+ - "./lib/yopta_switcher/operations/turn_off.rb"
141
+ - "./lib/yopta_switcher/operations/turn_on.rb"
142
+ - "./lib/yopta_switcher/selenium_driver_adapter.rb"
143
+ - "./lib/yopta_switcher/version.rb"
144
+ - exe/yopta_switcher
145
+ homepage: https://github.com/panasyuk/yopta_switcher
146
+ licenses:
147
+ - MIT
148
+ metadata: {}
149
+ post_install_message:
150
+ rdoc_options: []
151
+ require_paths:
152
+ - lib
153
+ required_ruby_version: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ required_rubygems_version: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ version: '0'
163
+ requirements: []
164
+ rubyforge_project:
165
+ rubygems_version: 2.6.11
166
+ signing_key:
167
+ specification_version: 4
168
+ summary: Enables automation of switching subscription terms
169
+ test_files: []