liedetector 0.2.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d61795781cd370a2ac0d5aec455ce7ec975809bf
4
+ data.tar.gz: c2a9cfdc741c5f04a7976c144507d2a18a17aa14
5
+ SHA512:
6
+ metadata.gz: dbb02fb245886090664c4b78ac42e8f0c73e59d2e750930189608517d3aff88f58aa78d5f636c658af654e949ecfce12ca39f9c56d2c5ad6c0848b56ce9b909e
7
+ data.tar.gz: d60f6ada6be527870ae719e953683e89bee2845316a3ce7a1e99497a7f30cd5bb4dbb4843b1ce31095fa7d9a489175f30754949aeffeeb5d7b0f0ccc789cdc81
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'trafaret'
4
+ gem 'httpclient'
5
+ gem 'oj'
6
+ gem 'redcarpet'
7
+
8
+ gem 'rspec'
data/Gemfile.lock ADDED
@@ -0,0 +1,43 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ activesupport (4.1.4)
5
+ i18n (~> 0.6, >= 0.6.9)
6
+ json (~> 1.7, >= 1.7.7)
7
+ minitest (~> 5.1)
8
+ thread_safe (~> 0.1)
9
+ tzinfo (~> 1.1)
10
+ diff-lcs (1.2.5)
11
+ httpclient (2.4.0)
12
+ i18n (0.6.11)
13
+ json (1.8.1)
14
+ minitest (5.4.0)
15
+ oj (2.9.4)
16
+ redcarpet (3.1.2)
17
+ rspec (3.0.0)
18
+ rspec-core (~> 3.0.0)
19
+ rspec-expectations (~> 3.0.0)
20
+ rspec-mocks (~> 3.0.0)
21
+ rspec-core (3.0.3)
22
+ rspec-support (~> 3.0.0)
23
+ rspec-expectations (3.0.3)
24
+ diff-lcs (>= 1.2.0, < 2.0)
25
+ rspec-support (~> 3.0.0)
26
+ rspec-mocks (3.0.3)
27
+ rspec-support (~> 3.0.0)
28
+ rspec-support (3.0.3)
29
+ thread_safe (0.3.4)
30
+ trafaret (1.5.7)
31
+ activesupport
32
+ tzinfo (1.2.1)
33
+ thread_safe (~> 0.1)
34
+
35
+ PLATFORMS
36
+ ruby
37
+
38
+ DEPENDENCIES
39
+ httpclient
40
+ oj
41
+ redcarpet
42
+ rspec
43
+ trafaret
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/liedetector ADDED
@@ -0,0 +1,7 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ require 'liedetector'
4
+
5
+
6
+ suite = LieDetector::Suite.new(ARGV[0])
7
+ suite.run
@@ -0,0 +1,63 @@
1
+ module LieDetector
2
+ class MarkdownRunner < Redcarpet::Render::Base
3
+ def initialize(suite)
4
+ @suite = suite
5
+ super()
6
+ end
7
+
8
+ def block_code(code, language)
9
+ @suite.code_block(code)
10
+ nil
11
+ end
12
+
13
+ [# block-level calls
14
+ :block_quote,
15
+ :block_html, :list, :list_item,
16
+
17
+ # span-level calls
18
+ :autolink, :codespan, :double_emphasis,
19
+ :emphasis, :underline, :raw_html,
20
+ :triple_emphasis, :strikethrough,
21
+ :superscript,
22
+
23
+ # footnotes
24
+ :footnotes, :footnote_def, :footnote_ref,
25
+
26
+ # low level rendering
27
+ # :entity, :normal_text
28
+ ].each do |method|
29
+ define_method method do |*args|
30
+ @suite.push_descriptions args.first
31
+ nil
32
+ end
33
+ end
34
+
35
+ def normal_text(text)
36
+ text
37
+ end
38
+
39
+
40
+ # Other methods where we don't return only a specific argument
41
+ def link(link, title, content)
42
+ @suite.push_descriptions "#{content} (#{link})"
43
+ nil
44
+ end
45
+
46
+ def image(link, title, content)
47
+ content &&= content + " "
48
+ @suite.push_descriptions "#{content}#{link}"
49
+ nil
50
+ end
51
+
52
+ def paragraph(text)
53
+ @suite.push_descriptions("\n#{text}\n")
54
+ nil
55
+ end
56
+
57
+ LEVEL_DOTS = {1 => '=', 2 => '-', 3 => '.'}
58
+ def header(text, header_level)
59
+ @suite.push_descriptions("\n#{text}\n#{LEVEL_DOTS[header_level] * text.size}\n")
60
+ nil
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,66 @@
1
+ module LieDetector
2
+ class Request
3
+ def initialize(suite)
4
+ @suite = suite
5
+ end
6
+
7
+ def method(method)
8
+ @method = method
9
+ end
10
+
11
+ def path(path)
12
+ @path = path
13
+ end
14
+
15
+ def data(data)
16
+ @data = data
17
+ end
18
+
19
+ def query(query)
20
+ @query = query
21
+ end
22
+
23
+ def headers(headers)
24
+ @headers = headers
25
+ end
26
+
27
+ def await(trafaret)
28
+ @trafaret = T.construct(trafaret)
29
+ end
30
+
31
+ def description(description)
32
+ @description = description
33
+ end
34
+
35
+ def describe
36
+ "#{@description}\nExecute #{@method.to_s.upcase} #{@path}\n"
37
+ end
38
+
39
+ def status(status)
40
+ @status = status
41
+ end
42
+
43
+ def store(name)
44
+ @store_key = name
45
+ end
46
+
47
+ def call
48
+ res = @suite.session.send(
49
+ @method,
50
+ @suite.build_uri(@path, query: @query),
51
+ {
52
+ data: @data,
53
+ header: @suite.headers_defaults.merge(@headers || {})
54
+ }
55
+ )
56
+ unless res.status == @status
57
+ raise "Bad status(#{@status} != #{res.status}): #{res.inspect}"
58
+ end
59
+ res = @trafaret.call(Oj.load(res.content))
60
+ if res.is_a? Trafaret::Error
61
+ raise "Unmatched data #{res.dump}"
62
+ end
63
+ @suite.store_key(@store_key, res) if @store_key
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,78 @@
1
+ module LieDetector
2
+ class Suite
3
+ HEADERS_DEFAULTS = {'Accept' => 'application/json'}
4
+ HTTP_DEFAULTS = {host: '127.0.0.1', port: 3000}
5
+
6
+ def headers_defaults
7
+ HEADERS_DEFAULTS
8
+ end
9
+
10
+ def initialize(filepath)
11
+ @filepath = filepath
12
+ end
13
+
14
+ def build_uri(path, query: nil, fragment: nil)
15
+ query = URI.encode_www_form(query) if query.is_a? Hash
16
+ URI::HTTP.build(HTTP_DEFAULTS.merge(path: path, query: query, fragment: fragment)).to_s
17
+ end
18
+
19
+ def session
20
+ @session ||= begin
21
+ session = HTTPClient.new
22
+ session.set_cookie_store("cookie.dat")
23
+ # session.debug_dev = STDOUT
24
+ session
25
+ end
26
+ end
27
+
28
+ def push_descriptions(text)
29
+ @text ||= ''
30
+ @text += text
31
+ end
32
+
33
+ def register(cls, name)
34
+ @ordered ||= []
35
+ @registry ||= {}
36
+ @ordered << cls
37
+ @registry[name] = cls if name
38
+ cls.description(@text || '')
39
+ @text = ''
40
+ end
41
+
42
+ def store_key(key, data)
43
+ @store ||= {}
44
+ @store[key] = data
45
+ end
46
+
47
+ def store_data
48
+ @store
49
+ end
50
+
51
+ attr_reader :store
52
+
53
+ def run
54
+ markdown = Redcarpet::Markdown.new(LieDetector::MarkdownRunner.new(self), fenced_code_blocks: true)
55
+ markdown.render(File.new(@filepath).read)
56
+
57
+ @ordered.each do |test|
58
+ puts test.describe
59
+ test.call
60
+ puts 'passed'
61
+ puts
62
+ end
63
+ end
64
+
65
+ def code_block(code)
66
+ self.instance_eval(code, @filepath)
67
+ end
68
+
69
+ # Sugar to not define classes in the doc
70
+ def request(name, method, path, &blk)
71
+ req = LieDetector::Request.new self
72
+ req.method method
73
+ req.path path
74
+ req.instance_exec &blk
75
+ register(req, name)
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,3 @@
1
+ module LieDetector
2
+ VERSION = "0.2.1"
3
+ end
@@ -0,0 +1,9 @@
1
+ require 'redcarpet'
2
+ require 'trafaret'
3
+ require 'httpclient'
4
+ require 'oj'
5
+ T = Trafaret
6
+
7
+ require 'liedetector/markdown_runner'
8
+ require 'liedetector/suite'
9
+ require 'liedetector/request'
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'liedetector/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "liedetector"
8
+ spec.version = LieDetector::VERSION
9
+ spec.authors = ["Mikhail Krivushin"]
10
+ spec.email = ["krivushinme@gmail.com"]
11
+ spec.summary = %q{Markdown API description checker}
12
+ spec.description = %q{Small lib and script to check API description
13
+ in special format against test server}
14
+ spec.homepage = "https://github.com/Deepwalker/liedetector.rb"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0")
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_dependency "activesupport"
23
+ spec.add_dependency "trafaret"
24
+ spec.add_dependency "httpclient"
25
+ spec.add_dependency "oj"
26
+ spec.add_dependency "redcarpet"
27
+ spec.add_development_dependency "bundler", "~> 1.5"
28
+ spec.add_development_dependency "rake"
29
+ spec.add_development_dependency "rspec"
30
+ end
@@ -0,0 +1,9 @@
1
+ require 'liedetector'
2
+
3
+
4
+ describe LieDetector::Suite do
5
+ it 'should do the task' do
6
+ suite = LieDetector::Suite.new('sample.md')
7
+ suite.run
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,171 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: liedetector
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
5
+ platform: ruby
6
+ authors:
7
+ - Mikhail Krivushin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: trafaret
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: httpclient
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
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: oj
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: redcarpet
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
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: bundler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.5'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.5'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description: |-
126
+ Small lib and script to check API description
127
+ in special format against test server
128
+ email:
129
+ - krivushinme@gmail.com
130
+ executables:
131
+ - liedetector
132
+ extensions: []
133
+ extra_rdoc_files: []
134
+ files:
135
+ - Gemfile
136
+ - Gemfile.lock
137
+ - Rakefile
138
+ - bin/liedetector
139
+ - lib/liedetector.rb
140
+ - lib/liedetector/markdown_runner.rb
141
+ - lib/liedetector/request.rb
142
+ - lib/liedetector/suite.rb
143
+ - lib/liedetector/version.rb
144
+ - liedetector.gemspec
145
+ - spec/liedetector_spec.rb
146
+ homepage: https://github.com/Deepwalker/liedetector.rb
147
+ licenses:
148
+ - MIT
149
+ metadata: {}
150
+ post_install_message:
151
+ rdoc_options: []
152
+ require_paths:
153
+ - lib
154
+ required_ruby_version: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ required_rubygems_version: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ version: '0'
164
+ requirements: []
165
+ rubyforge_project:
166
+ rubygems_version: 2.2.2
167
+ signing_key:
168
+ specification_version: 4
169
+ summary: Markdown API description checker
170
+ test_files:
171
+ - spec/liedetector_spec.rb