crabfarm 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 561ccdb4b56beae4a09b06ef5d9c492b8e888af3
4
- data.tar.gz: d82a80deee23886c46cc0a32e548b0fe6adafd84
3
+ metadata.gz: 52ca9c7f98addbe26b5ff98ae502c9f0526d78dd
4
+ data.tar.gz: 8460bde2927f16b4bfb0231724b09d17da0b24dc
5
5
  SHA512:
6
- metadata.gz: 4dc9440b50e5b98c8ab7aebb0f66312bb50e6cae1a5664a195c1c3c3a2bb7d96d441874650dae2b3aa42bf0860fcdc520ed41f74b4461cbce9a5b1989447b227
7
- data.tar.gz: d44adc9a73de3f67088746b4ad9686245f7d0726ffe1ca67ee2f526f5f6ff7b1b9caad22c84ffc59510892fe5f4e7a087314af281f677569e277c50493ca54d7
6
+ metadata.gz: 566ec3a924a621d53bb91b59628bf269de1794455800d7eabf9632076c970d44bd56c60a09fb0518e6aed8f7cf5a94eb4dd7cffc284da0fa4956808b8129fdcd
7
+ data.tar.gz: a52684de47189cb632e3a35cab4fd76980bc1e2021428c12344241fd266eef7984de92bcb6a1069f1422e66c6580f2cb5cd8a992ef9ae61aec600fb783687529
@@ -23,6 +23,7 @@ require "crabfarm/base_parser"
23
23
  require "crabfarm/strategies"
24
24
 
25
25
  require "crabfarm/utils/port_discovery"
26
+ require "crabfarm/utils/naming"
26
27
 
27
28
  module Crabfarm
28
29
 
@@ -29,6 +29,7 @@ module Crabfarm
29
29
 
30
30
  @dsl = Strategies.load(:browser_dsl, class_browser_dsl || Crabfarm.config.browser_dsl)
31
31
  @builder = Strategies.load(:output_builder, class_output_builder || Crabfarm.config.output_builder)
32
+ @output = @builder.prepare
32
33
  end
33
34
 
34
35
  def browser(_name=nil)
@@ -40,7 +41,7 @@ module Crabfarm
40
41
  end
41
42
 
42
43
  def output
43
- @output ||= @builder.prepare
44
+ @output
44
45
  end
45
46
 
46
47
  def output_as_json
@@ -16,7 +16,7 @@ module Crabfarm
16
16
  Support::GLI.generate_options c
17
17
 
18
18
  c.action do |global_options,options,args|
19
- next puts "This command can only be run inside a crabfarm application" unless GlobalState.inside_crawler_app?
19
+ next puts "This command can only be ran inside a crabfarm application" unless GlobalState.inside_crawler_app?
20
20
 
21
21
  Crabfarm.config.set Support::GLI.parse_options options
22
22
 
@@ -50,7 +50,7 @@ module Crabfarm
50
50
  Support::GLI.generate_options c
51
51
 
52
52
  c.action do |global_options,options,args|
53
- next puts "This command can only be run inside a crabfarm application" unless GlobalState.inside_crawler_app?
53
+ next puts "This command can only be ran inside a crabfarm application" unless GlobalState.inside_crawler_app?
54
54
 
55
55
  Crabfarm.config.set Support::GLI.parse_options options
56
56
 
@@ -78,7 +78,7 @@ module Crabfarm
78
78
  app.flag [:r, :remote]
79
79
 
80
80
  app.action do |global_options,options,args|
81
- next puts "This command cannot be run inside a crabfarm application" if GlobalState.inside_crawler_app?
81
+ next puts "This command cannot be ran inside a crabfarm application" if GlobalState.inside_crawler_app?
82
82
 
83
83
  require "crabfarm/modes/generator"
84
84
  Crabfarm::Modes::Generator.generate_app(Dir.pwd, args[0], options[:remote])
@@ -88,7 +88,7 @@ module Crabfarm
88
88
  c.desc "Generates a new crabfarm parser and parser spec"
89
89
  c.command :parser do |parser|
90
90
  parser.action do |global_options,options,args|
91
- next puts "This command can only be run inside a crabfarm application" unless GlobalState.inside_crawler_app?
91
+ next puts "This command can only be ran inside a crabfarm application" unless GlobalState.inside_crawler_app?
92
92
 
93
93
  require "crabfarm/modes/generator"
94
94
  Crabfarm::Modes::Generator.generate_parser(GlobalState.app_path, args[0])
@@ -98,7 +98,7 @@ module Crabfarm
98
98
  c.desc "Generates a new crabfarm state and parser spec"
99
99
  c.command :state do |parser|
100
100
  parser.action do |global_options,options,args|
101
- next puts "This command can only be run inside a crabfarm application" unless GlobalState.inside_crawler_app?
101
+ next puts "This command can only be ran inside a crabfarm application" unless GlobalState.inside_crawler_app?
102
102
 
103
103
  require "crabfarm/modes/generator"
104
104
  Crabfarm::Modes::Generator.generate_state(GlobalState.app_path, args[0])
@@ -106,13 +106,13 @@ module Crabfarm
106
106
  end
107
107
  end
108
108
 
109
- desc "Perform an HTTP recording for use in tests"
109
+ desc "Perform a memento recording for use in tests"
110
110
  command [:record, :r] do |c|
111
111
  c.desc "Run recorder in playback mode"
112
112
  c.switch [:p, :playback], :default_value => false
113
113
 
114
114
  c.action do |global_options, options, args|
115
- next puts "This command can only be run inside a crabfarm application" unless GlobalState.inside_crawler_app?
115
+ next puts "This command can only be ran inside a crabfarm application" unless GlobalState.inside_crawler_app?
116
116
 
117
117
  require "crabfarm/modes/recorder"
118
118
  Crabfarm::Modes::Recorder.start GlobalState.memento_path(args[0]), options[:playback]
@@ -128,7 +128,7 @@ module Crabfarm
128
128
  c.switch :unsafe, :default_value => false
129
129
 
130
130
  c.action do |global_options,options,args|
131
- next puts "This command can only be run inside a crabfarm application" unless GlobalState.inside_crawler_app?
131
+ next puts "This command can only be ran inside a crabfarm application" unless GlobalState.inside_crawler_app?
132
132
 
133
133
  options[:remote] = args[0]
134
134
 
@@ -10,11 +10,13 @@ module Crabfarm
10
10
  end
11
11
 
12
12
  def memento_path(_name)
13
+ return nil if _name.nil?
13
14
  File.join(app_path, 'spec/mementos', _name + '.json.gz')
14
15
  end
15
16
 
16
- def snapshot_path(_file)
17
- File.join(app_path, 'spec/snapshots', _file)
17
+ def snapshot_path(_file_name)
18
+ return nil if _file_name.nil?
19
+ File.join(app_path, 'spec/snapshots', _file_name)
18
20
  end
19
21
 
20
22
  extend self
@@ -59,7 +59,8 @@ module Crabfarm
59
59
  rescue SystemExit, Interrupt
60
60
  break
61
61
  rescue => e
62
- puts "Unknown command".color(:red)
62
+ puts "#{e.to_s}".color(:red)
63
+ puts e.backtrace
63
64
  end
64
65
  end
65
66
 
@@ -35,21 +35,26 @@ module Crabfarm
35
35
  end
36
36
  end
37
37
 
38
- def generate_state(_target, _name)
39
- class_name = _name.camelize
38
+ def generate_state(_target, _class_name)
39
+ validate_class_name _class_name
40
+
41
+ route = Utils::Naming.route_from_constant _class_name
40
42
  with_base_path _target do
41
- binding = { state_class: class_name.camelize }
42
- path('app', 'states', class_name.underscore + '.rb').render('state.rb', binding)
43
- path('spec', 'states', class_name.underscore + '_spec.rb').render('state_spec.rb', binding)
43
+ binding = { state_class: _class_name }
44
+ path(*(['app', 'states'] + route[0...-1] + [route.last + '.rb'])).render('state.rb', binding)
45
+ path(*(['spec', 'states'] + route[0...-1] + [route.last + '_spec.rb'])).render('state_spec.rb', binding)
44
46
  end
45
47
  end
46
48
 
47
- def generate_parser(_target, _name)
48
- class_name = _name.camelize + 'Parser'
49
+ def generate_parser(_target, _class_name)
50
+ validate_class_name _class_name
51
+
52
+ _class_name = _class_name + 'Parser'
53
+ route = Utils::Naming.route_from_constant _class_name
49
54
  with_base_path _target do
50
- binding = { parser_class: class_name }
51
- path('app', 'parsers', class_name.underscore + '.rb').render('parser.rb', binding)
52
- path('spec', 'parsers', class_name.underscore + '_spec.rb').render('parser_spec.rb', binding)
55
+ binding = { parser_class: _class_name }
56
+ path(*(['app', 'parsers'] + route[0...-1] + [route.last + '.rb'])).render('parser.rb', binding)
57
+ path(*(['spec', 'parsers'] + route[0...-1] + [route.last + '_spec.rb'])).render('parser_spec.rb', binding)
53
58
  end
54
59
  end
55
60
 
@@ -116,6 +121,10 @@ module Crabfarm
116
121
  puts _op.rjust(10).color(_color) + ' ' + _message
117
122
  end
118
123
 
124
+ def validate_class_name(_name)
125
+ raise Crabfarm::ArgumentError.new "Invalid class name '#{_name}'" unless Utils::Naming.is_constant_name? _name
126
+ end
127
+
119
128
  extend self
120
129
  end
121
130
  end
@@ -26,7 +26,7 @@ module Crabfarm
26
26
  driver = DefaultDriverFactory.new(driver_config).build_driver nil
27
27
 
28
28
  begin
29
- puts "Press Ctrl-C to stop capturing."
29
+ puts "Press Ctrl-C or close browser to stop #{_replay ? 'playback' : 'capturing'}."
30
30
  loop do
31
31
  driver.current_url
32
32
  sleep 1.0
@@ -3,7 +3,7 @@ module Crabfarm
3
3
 
4
4
  def self.apply_state(_context, _name, _params={})
5
5
  state_class = if _name.is_a? String or _name.is_a? Symbol
6
- load_by_name _name
6
+ load_class_from_uri _name
7
7
  else _name end
8
8
 
9
9
  _context.prepare
@@ -14,9 +14,9 @@ module Crabfarm
14
14
 
15
15
  private
16
16
 
17
- def self.load_by_name(_name)
18
- name = _name.to_s.gsub(/[^A-Z0-9:]+/i, '_').camelize
19
- name.constantize
17
+ def self.load_class_from_uri(_uri)
18
+ class_name = Utils::Naming.decode_crabfarm_uri _uri
19
+ class_name.constantize
20
20
  end
21
21
 
22
22
  end
@@ -0,0 +1,19 @@
1
+ module Crabfarm
2
+ module Utils
3
+ module Naming
4
+
5
+ def self.is_constant_name?(_name)
6
+ /^([A-Z][A-Za-z0-9]*)(\:\:[A-Z][A-Za-z0-9]*)*$/ === _name
7
+ end
8
+
9
+ def self.route_from_constant(_class_name)
10
+ _class_name.split('::').map(&:underscore)
11
+ end
12
+
13
+ def self.decode_crabfarm_uri(_uri)
14
+ _uri.to_s.split('/').map { |p| p.gsub(/[^A-Z0-9:]+/i, '_').camelize }.join('::')
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -1,3 +1,3 @@
1
1
  module Crabfarm
2
- VERSION = "0.2.1"
2
+ VERSION = "0.2.2"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: crabfarm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ignacio Baixas
@@ -433,6 +433,7 @@ files:
433
433
  - lib/crabfarm/templates/state.rb.erb
434
434
  - lib/crabfarm/templates/state_spec.rb.erb
435
435
  - lib/crabfarm/transition_service.rb
436
+ - lib/crabfarm/utils/naming.rb
436
437
  - lib/crabfarm/utils/port_discovery.rb
437
438
  - lib/crabfarm/utils/processes.rb
438
439
  - lib/crabfarm/version.rb