yaks-html 0.10.0 → 0.11.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 00098aaad249008d6a0748ed5d94483be2eb6694
4
- data.tar.gz: e870922d4a96e4bd90ca12c31c4b5be8e71e0428
3
+ metadata.gz: af536b85c5b8ec153e5c803ddb0051a84bb0b284
4
+ data.tar.gz: e9de84047d31aecab97ed462262e972d10da57b3
5
5
  SHA512:
6
- metadata.gz: 73a42d1ca3639992a8ac660d15e5359d8e9647e67e0a5cc75aaa78eedad9cac63b01b0cf611bfc8e0fc9deb1a02d9636c6611e8bfb5ac787740580fb8e129766
7
- data.tar.gz: 625d9f5d71a110d4c07383e6cca9a69fb27a89dbe1595591931c305e76804f5e1aad00134da11ad4bc720e1ae24b99646aade45aec92485268bee34ea623a550
6
+ metadata.gz: 610b56a2df54cf21201f8c6627a05a9ccecd9439515512f85146753267ddf2003d91712f304b3c080bcdcfea80abe4e51058a9c8aaec1ae535983bcc02547cb3
7
+ data.tar.gz: fdad369fdf7116bf6da5551643c7d97f1fb08e1f42b0bb181d716021c23ad76311a4c71f8939cd72546d6ceb23000d6aa7e6f2fc27be947c63b390a215062d65
data/README.md CHANGED
@@ -1,3 +1,44 @@
1
1
  A HTML output format for Yaks.
2
2
 
3
3
  Browse your hypermedia API like a good old fashioned web site.
4
+
5
+ You can see an example output at
6
+ [https://myticketsireland.ticketsolve.com/api/](https://myticketsireland.ticketsolve.com/api/)
7
+ (visit the [front page](https://myticketsireland.ticketsolve.com/)
8
+ first to make sure you have some necessary cookies).
9
+
10
+ For APIs that make good use of links and forms this provides a great
11
+ help during development. It also makes it possible to write
12
+ integration tests against the HTML output using Capybara.
13
+
14
+ We currently provide a small DSL and RSpec integration to make this easy. For example:
15
+
16
+ ```
17
+ require 'yaks-html/rspec'
18
+
19
+ RSpec.describe Yaks::Format::HTML, type: :yaks_integration do
20
+ before do
21
+ Capybara.app = YourRackApp
22
+ end
23
+
24
+ let(:rel_prefix) { 'http://myapi.example.com/rel/' }
25
+
26
+ it 'should allow browsing the api' do
27
+ visit '/'
28
+
29
+ click_rel('friends') # => clicks http://myapi.example.com/rel/friends
30
+
31
+ expect(current_path).to eql '/friends'
32
+
33
+ expect(page).to have_content 'Matt'
34
+
35
+ submit_form(:poke) do
36
+ fill_in :message, with: 'Would you fancy some tea?'
37
+ end
38
+
39
+ expect(current_path).to eql '/poke/Matt'
40
+
41
+ expect(page).to have_content 'You poked Matt: Would you fancy some tea?'
42
+ end
43
+ end
44
+ ```
data/Rakefile CHANGED
@@ -1,3 +1,3 @@
1
- load '../rakelib/shared.rake'
1
+ load '../shared/rake_tasks.rb'
2
2
 
3
3
  gem_tasks(:"yaks-html")
@@ -0,0 +1,73 @@
1
+ require 'yaks-html'
2
+ require 'capybara/rspec'
3
+
4
+ module YaksHTML
5
+ # This is a bit of a hack. The only way to add custom rack env
6
+ # entries to Capybara/Rack::Test is through the driver options (see
7
+ # Capybara.register_driver below). However this is only executed
8
+ # once, so throughout the whole test suite the same instance of the
9
+ # hash we pass will be used. To make it a bit easier to set/reset
10
+ # this we add this layer of indirection. Now what we pass the driver
11
+ # looks like a hash, but we can point it to a new hash with
12
+ # RACK_ENV.__setobj__({})
13
+
14
+ RACK_ENV = SimpleDelegator.new({})
15
+
16
+ module CapybaraDSL
17
+ def self.included(base)
18
+ base.class_eval do
19
+ let(:rel_prefix) { '' }
20
+ end
21
+ end
22
+
23
+ def click_rel(rel)
24
+ rel = [rel_prefix, rel].join unless rel.is_a? Symbol
25
+ find("a[rel=\"#{rel}\"]").click
26
+ end
27
+
28
+ def click_first_rel(rel)
29
+ rel = [rel_prefix, rel].join unless rel.is_a? Symbol
30
+ all("a[rel=\"#{rel}\"]").first.click
31
+ end
32
+
33
+ def submit!
34
+ find('input[type="submit"]').click
35
+ end
36
+
37
+ def within_form(name, &block)
38
+ within(all("form[@name=\"#{name}\"]").first, &block)
39
+ end
40
+
41
+ def submit_form(name, &block)
42
+ within(all("form[@name=\"#{name}\"]").first) do
43
+ yield block
44
+ submit!
45
+ end
46
+ end
47
+
48
+ def refresh
49
+ visit current_path
50
+ end
51
+
52
+ def env
53
+ YaksHTML::RACK_ENV
54
+ end
55
+ end
56
+ end
57
+
58
+ RSpec.configure do |config|
59
+ select = {type: :yaks_integration}
60
+
61
+ config.include Capybara::DSL, select
62
+ config.include Capybara::RSpecMatchers, select
63
+
64
+ config.include YaksHTML::CapybaraDSL, select
65
+
66
+ config.before(select) do
67
+ YaksHTML::RACK_ENV.__setobj__('HTTP_ACCEPT' => 'text/html')
68
+ end
69
+ end
70
+
71
+ Capybara.register_driver :rack_test do |app|
72
+ Capybara::RackTest::Driver.new(app, headers: YaksHTML::RACK_ENV)
73
+ end
@@ -12,7 +12,7 @@ module Yaks
12
12
  end
13
13
 
14
14
  def section(name)
15
- template.select(".#{name}").first # rubocop:disable Performance/Detect
15
+ template.select(".#{name}").first
16
16
  end
17
17
 
18
18
  def serialize_resource(resource)
@@ -120,22 +120,32 @@ module Yaks
120
120
  end
121
121
 
122
122
  def render_field(field)
123
- extra_info = reject_keys(field.to_h_compact, :type, :name, :value, :label, :options)
123
+ attrs = field.to_h_compact
124
+
125
+ if attrs.key? :checked
126
+ if attrs[:checked]
127
+ attrs[:checked] = 'checked'
128
+ else
129
+ attrs.delete(:checked)
130
+ end
131
+ end
132
+
133
+ extra_info = reject_keys(attrs, :type, :name, :value, :label, :options)
124
134
  H[:tr,
125
135
  H[:td,
126
136
  H[:label, {for: field.name}, [field.label || field.name.to_s, field.required ? '*' : ''].join]],
127
137
  H[:td,
128
138
  case field.type
129
139
  when /select/
130
- H[:select, reject_keys(field.to_h_compact, :options), render_select_options(field.options)]
140
+ H[:select, reject_keys(attrs, :options), render_select_options(field.options)]
131
141
  when /textarea/
132
- H[:textarea, reject_keys(field.to_h_compact, :value), field.value || '']
142
+ H[:textarea, reject_keys(attrs, :value), field.value || '']
133
143
  when /hidden/
134
144
  [ field.value.inspect,
135
- H[:input, field.to_h_compact]
145
+ H[:input, attrs]
136
146
  ]
137
147
  else
138
- H[:input, field.to_h_compact]
148
+ H[:input, attrs]
139
149
  end],
140
150
  H[:td, extra_info.empty? ? '' : extra_info.inspect]
141
151
  ]
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+ require_relative 'support/test_app'
3
+
4
+ RSpec.describe Yaks::Format::HTML, type: :yaks_integration do
5
+ before do
6
+ Capybara.app = TestApp
7
+ end
8
+
9
+ let(:rel_prefix) { 'http://myapi.example.com/rel/' }
10
+
11
+ it 'should allow browsing the api' do
12
+ visit '/'
13
+
14
+ expect(page).to have_content 'GET /'
15
+ expect(page).to have_content 'generated with Yaks'
16
+
17
+ click_rel('friends')
18
+
19
+ expect(current_path).to eql '/friends'
20
+
21
+ expect(page).to have_content 'GET /friends'
22
+ expect(page).to have_content 'Matt'
23
+
24
+ submit_form(:poke) do
25
+ fill_in :message, with: 'Free the means of production'
26
+ end
27
+
28
+ expect(current_path).to eql '/poke/Matt'
29
+
30
+ expect(page).to have_content 'You poked Matt: Free the means of production'
31
+ end
32
+ end
@@ -1,6 +1,5 @@
1
- RSpec.configure do |rspec|
2
- rspec.include FixtureHelpers
3
- rspec.backtrace_exclusion_patterns = [] if ENV['FULLSTACK']
4
- rspec.disable_monkey_patching!
5
- rspec.raise_errors_for_deprecations!
6
- end
1
+ require 'yaks'
2
+ require 'yaks-html/rspec'
3
+ require 'yaks-sinatra'
4
+
5
+ require_relative '../../shared/rspec_config'
@@ -0,0 +1,44 @@
1
+ class TestApp < Sinatra::Base
2
+ register Yaks::Sinatra
3
+
4
+ class HomeMapper < Yaks::Mapper
5
+ link 'http://myapi.example.com/rel/friends', '/friends'
6
+ end
7
+
8
+ class FriendMapper < Yaks::Mapper
9
+ attribute :name
10
+
11
+ def name
12
+ object[:name]
13
+ end
14
+
15
+ form :poke do
16
+ action '/poke/{name}'
17
+ method 'POST'
18
+ text :message
19
+ end
20
+ end
21
+
22
+ class MessageMapper < Yaks::Mapper
23
+ attribute :message do
24
+ object[:message]
25
+ end
26
+ end
27
+
28
+ configure_yaks do
29
+ mapper_for :home, HomeMapper
30
+ rel_template 'http://myapi.example.com/rel/{rel}'
31
+ end
32
+
33
+ get '/' do
34
+ yaks :home
35
+ end
36
+
37
+ get '/friends' do
38
+ yaks [{name: 'Matt'}, {name: 'Yohan'}, {name: 'Janko'}], item_mapper: FriendMapper
39
+ end
40
+
41
+ post '/poke/:name' do
42
+ yaks({message: "You poked #{params[:name]}: #{params[:message]}"}, mapper: MessageMapper)
43
+ end
44
+ end
@@ -22,4 +22,9 @@ Gem::Specification.new do |gem|
22
22
 
23
23
  gem.add_runtime_dependency 'yaks', Yaks::VERSION
24
24
  gem.add_runtime_dependency 'hexp', '>= 0.4'
25
+
26
+ gem.add_development_dependency 'yaks-sinatra'
27
+ gem.add_development_dependency 'rspec', '~> 3.0'
28
+ gem.add_development_dependency 'rack-test'
29
+ gem.add_development_dependency 'capybara'
25
30
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yaks-html
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arne Brasseur
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-19 00:00:00.000000000 Z
11
+ date: 2015-07-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: yaks
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 0.10.0
19
+ version: 0.11.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 0.10.0
26
+ version: 0.11.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: hexp
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +38,62 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0.4'
41
+ - !ruby/object:Gem::Dependency
42
+ name: yaks-sinatra
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rack-test
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: capybara
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
41
97
  description: HTML output format for Yaks
42
98
  email:
43
99
  - arne@arnebrasseur.net
@@ -49,9 +105,12 @@ files:
49
105
  - README.md
50
106
  - Rakefile
51
107
  - lib/yaks-html.rb
108
+ - lib/yaks-html/rspec.rb
52
109
  - lib/yaks/format/html.rb
53
110
  - lib/yaks/format/template.html
111
+ - spec/smoke_test_spec.rb
54
112
  - spec/spec_helper.rb
113
+ - spec/support/test_app.rb
55
114
  - yaks-html.gemspec
56
115
  homepage: https://github.com/plexus/yaks
57
116
  licenses:
@@ -73,9 +132,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
73
132
  version: '0'
74
133
  requirements: []
75
134
  rubyforge_project:
76
- rubygems_version: 2.4.5
135
+ rubygems_version: 2.2.3
77
136
  signing_key:
78
137
  specification_version: 4
79
138
  summary: HTML output format for Yaks
80
139
  test_files:
140
+ - spec/smoke_test_spec.rb
81
141
  - spec/spec_helper.rb
142
+ - spec/support/test_app.rb