raml-ruby-client-generator 0.0.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: ff71be56ff57da051540f86ea0bc1eb8d689f23e
4
+ data.tar.gz: 2c904cbbd51335f5d184471bdff9438433582c32
5
+ SHA512:
6
+ metadata.gz: 86a686783c2bfaebb7480922da507a50ea00dd5e271e9b93d9029339973e65f408703e18658a2affbe37e992a290f4604fae399138dcabe4ca31bf72c4d1dd3f
7
+ data.tar.gz: bc09ae4b06913923d353994d93b17f6d8ffe098b5586d53dabe690d76369a93420bdc685b50efd7b3437a6bc209a113f42ce168dd49250934d07c9b6c2be9a1f
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ .ruby-version
11
+ samples
12
+ example
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.0
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in raml-ruby-client-generator.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,38 @@
1
+ # Raml Ruby Client Generator
2
+
3
+ Auto Generate Ruby Client from Raml.
4
+
5
+ Features:
6
+
7
+ + support raml 0.8
8
+ + generate out-of-box Ruby Client
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ ```ruby
15
+ gem 'raml-ruby-client-generator'
16
+ ```
17
+
18
+ And then execute:
19
+
20
+ $ bundle
21
+
22
+ Or install it yourself as:
23
+
24
+ $ gem install raml-ruby-client-generator
25
+
26
+ ## Usage
27
+
28
+ ```ruby
29
+ gen-raml-ruby gen path/to/raml/file.raml --output example
30
+ ```
31
+
32
+ ## Contributing
33
+
34
+ 1. Fork it ( https://github.com/[my-github-username]/raml-ruby-client-generator/fork )
35
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
36
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
37
+ 4. Push to the branch (`git push origin my-new-feature`)
38
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << 'test'
6
+ t.libs << 'lib'
7
+ t.test_files = FileList['test/**/*_test.rb']
8
+ end
9
+
10
+ task default: :test
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "raml_ruby_client/generator"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/gen-raml-ruby ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'thor'
4
+ require "bundler/setup"
5
+ require 'raml_ruby_client/generator'
6
+
7
+ require 'pry'
8
+
9
+ class RamlRubyGenerator < Thor
10
+
11
+ desc "gen [Raml File]", "generate Ruby Client from Raml File"
12
+ option :output, :type => :string
13
+ def gen(raml_file)
14
+ output = options[:output] || '.'
15
+ RamlRubyClient::Generator.new.generate(raml_file, output)
16
+ end
17
+ end
18
+
19
+ RamlRubyGenerator.start(ARGV)
20
+
21
+
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,32 @@
1
+ require "raml_ruby_client/generator/version"
2
+ require "raml_ruby_client/generator/template"
3
+ require "raml_ruby_client/generator/parser"
4
+ require "raml_ruby_client/generator/writer"
5
+ require 'raml'
6
+ require 'fileutils'
7
+
8
+ require 'pry'
9
+
10
+ module RamlRubyClient
11
+ class Generator
12
+ TEMP_DIR = File.expand_path("../../../samples", __FILE__)
13
+ LIBRARY_FILES = %w{http.rb client.rb configuration.rb}
14
+
15
+ def generate(raml_file, output)
16
+ parser = Parser.new(raml_file)
17
+ writer = Writer.new(output)
18
+
19
+ writer.write_root_file('Gemfile', Template.load('Gemfile').render({}))
20
+ writer.write_lib_file("#{parser.library_path}.rb", Template.load('class.rb').render(parser: parser))
21
+ LIBRARY_FILES.each do |template_name|
22
+ writer.write_lib_file(
23
+ File.join(parser.library_path, template_name),
24
+ Template.load(template_name).render(parser: parser)
25
+ )
26
+ end
27
+
28
+ writer.flush
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,43 @@
1
+ module RamlRubyClient
2
+ class Parser
3
+ attr_reader :raml_object
4
+
5
+ def initialize(raml_file)
6
+ @raml_object = Raml.parse_file(raml_file)
7
+ end
8
+
9
+ def base_uri
10
+ raml_object.base_uri
11
+ end
12
+
13
+ def config_keys
14
+ ['endpoint']
15
+ end
16
+
17
+ def apis
18
+ @apis ||= raml_object.resources.map {|key, resource| parse_apis(key, resource) }.flatten
19
+ end
20
+
21
+ def namespace
22
+ @namespace ||= raml_object.title.gsub(" ", "/")
23
+ end
24
+
25
+ def module_name
26
+ namespace.camelize.gsub('::', '')
27
+ end
28
+
29
+ def library_path
30
+ namespace.gsub("/", "_").downcase
31
+ end
32
+
33
+ private
34
+
35
+ def parse_apis(key, resource)
36
+ resource.children.map {|method| build_api(method, key) }
37
+ end
38
+
39
+ def build_api(method, key)
40
+ OpenStruct.new({ method_name: "#{method.name}#{key.gsub('/', '_')}", verb: method.name, path: key })
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,47 @@
1
+ require 'erb'
2
+ require 'ostruct'
3
+ require 'active_support/inflector'
4
+
5
+ module RamlRubyClient
6
+ class Generator
7
+ TEMPLATE_DIR = File.expand_path("../templates", __FILE__)
8
+
9
+ module TemplateHelper
10
+ def include(partial, context)
11
+ template = Template.new(sprintf("_%s.tmpl", partial))
12
+ template.render(context)
13
+ end
14
+
15
+ def indent(str, spaces)
16
+ pre = ' ' * spaces
17
+ str = pre + str.split(/\n/).join("\n" + pre) + "\n"
18
+ return str unless str.strip.empty?
19
+ nil
20
+ end
21
+ end
22
+
23
+ class Context < OpenStruct
24
+ include TemplateHelper
25
+
26
+ def to_binding
27
+ binding
28
+ end
29
+ end
30
+
31
+ class Template
32
+ def self.load(template_name)
33
+ Template.new(sprintf('%s.tmpl', template_name))
34
+ end
35
+
36
+ def initialize(template_name)
37
+ file = File.join(TEMPLATE_DIR, template_name)
38
+ @erb = ERB.new(File.read(file), nil, '-')
39
+ end
40
+
41
+ def render(context)
42
+ ctx = Context.new(context)
43
+ @erb.result(ctx.to_binding)
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'httparty'
4
+ gem 'addressable'
@@ -0,0 +1,3 @@
1
+ def <%= api.method_name %>(query = {}, body = {}, headers = {})
2
+ http.<%= api.verb.downcase %>("<%= api.path %>", query: query, body: body, headers: headers)
3
+ end
@@ -0,0 +1,15 @@
1
+ require '<%= parser.library_path %>/client'
2
+ require '<%= parser.library_path %>/configuration'
3
+
4
+ module <%= parser.module_name %>
5
+ class << self
6
+ def configure(&block)
7
+ @configuration = Configuration.new
8
+ yield @configuration
9
+ end
10
+
11
+ def config
12
+ @configuration
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,26 @@
1
+ require '<%= parser.library_path %>/http'
2
+
3
+ module <%= parser.module_name %>
4
+ class Client
5
+ attr_reader :config
6
+
7
+ # Initialize a client
8
+ #
9
+ # @example
10
+ # <%= parser.module_name %>::Client.new
11
+ #
12
+ def initialize(config = <%= parser.module_name %>.config)
13
+ @config = config
14
+ end
15
+
16
+ <% parser.apis.each do |api| -%>
17
+ <%= indent(include('method', api: api), 4) %>
18
+ <% end -%>
19
+
20
+ private
21
+
22
+ def http
23
+ @http ||= Http.new(config)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,7 @@
1
+ module <%= parser.module_name %>
2
+ class Configuration
3
+ <% parser.config_keys.each do |key| -%>
4
+ attr_accessor :<%= key %>
5
+ <% end -%>
6
+ end
7
+ end
@@ -0,0 +1,49 @@
1
+ require 'httparty'
2
+ require 'addressable/uri'
3
+
4
+ module <%= parser.module_name %>
5
+ class Http # nodoc
6
+ attr_reader :config
7
+
8
+ BASE_URL = "<%= parser.base_uri %>".freeze
9
+
10
+ def initialize(config)
11
+ @config = config
12
+ @endpoint = config.endpoint || BASE_URL
13
+ end
14
+
15
+ def get(path, options = {})
16
+ request('GET', path, options)
17
+ end
18
+
19
+ def put(path, options = {})
20
+ request('PUT', path, options)
21
+ end
22
+
23
+ def post(path, options = {})
24
+ request('POST', path, options)
25
+ end
26
+
27
+ def delete(path, options = {})
28
+ request('DELETE', path, options)
29
+ end
30
+
31
+ def options(path, options = {})
32
+ request('OPTIONS', path, options)
33
+ end
34
+
35
+ def head(path, options = {})
36
+ request('HEAD', path, options)
37
+ end
38
+
39
+ private
40
+
41
+ def request(verb, path, options = {})
42
+ path = @endpoint + path
43
+ options.merge!(uri_adapter: Addressable::URI)
44
+
45
+ HTTParty.__send__(verb.downcase, path, options)
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,5 @@
1
+ module RamlRubyClient
2
+ class Generator
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,40 @@
1
+ module RamlRubyClient
2
+ class Writer
3
+ attr_reader :target_dir
4
+
5
+ TEMP_DIR = File.expand_path("../../../../samples", __FILE__)
6
+
7
+ def initialize(target_dir)
8
+ @target_dir = target_dir
9
+ @temp = File.join(TEMP_DIR, Time.now.to_i.to_s)
10
+ end
11
+
12
+ def write_root_file(name, content)
13
+ write_file(File.join(@temp, name), content)
14
+ end
15
+
16
+ def write_test_file(path, content)
17
+ write_file(File.join(@temp, 'test', path), content)
18
+ end
19
+
20
+ def write_lib_file(path, content)
21
+ write_file(File.join(@temp, 'lib', path), content)
22
+ end
23
+
24
+ def flush
25
+ FileUtils.mkdir_p(@target_dir)
26
+ FileUtils.mv Dir.glob(File.join(@temp, '*')), @target_dir
27
+
28
+ FileUtils.rm_rf(@temp)
29
+ end
30
+
31
+ private
32
+
33
+ def write_file(path, content)
34
+ FileUtils.mkdir_p File.dirname(path)
35
+
36
+ File.open(path, 'wb') {|file| file.write content }
37
+ end
38
+
39
+ end
40
+ end
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'raml_ruby_client/generator/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "raml-ruby-client-generator"
8
+ spec.version = RamlRubyClient::Generator::VERSION
9
+ spec.authors = ["Newell Zhu"]
10
+ spec.email = ["zlx.star@gmail.com"]
11
+
12
+ spec.summary = %q{Auto generate Ruby Client from Raml.}
13
+ spec.description = %q{Auto generate Ruby Client from Raml.}
14
+ spec.homepage = "https://github.com/zlx/raml-ruby-client-generator"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.bindir = "bin"
18
+ spec.executables += ['gen-raml-ruby']
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "raml_ruby"
22
+ spec.add_dependency "activesupport"
23
+ spec.add_dependency "thor"
24
+
25
+ spec.add_development_dependency "bundler", "~> 1.9"
26
+ spec.add_development_dependency "rake", "~> 10.0"
27
+ spec.add_development_dependency "pry-byebug"
28
+ end
metadata ADDED
@@ -0,0 +1,148 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: raml-ruby-client-generator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Newell Zhu
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-02-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: raml_ruby
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: activesupport
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: thor
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: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.9'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.9'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry-byebug
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'
97
+ description: Auto generate Ruby Client from Raml.
98
+ email:
99
+ - zlx.star@gmail.com
100
+ executables:
101
+ - gen-raml-ruby
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - ".gitignore"
106
+ - ".travis.yml"
107
+ - Gemfile
108
+ - README.md
109
+ - Rakefile
110
+ - bin/console
111
+ - bin/gen-raml-ruby
112
+ - bin/setup
113
+ - lib/raml_ruby_client/generator.rb
114
+ - lib/raml_ruby_client/generator/parser.rb
115
+ - lib/raml_ruby_client/generator/template.rb
116
+ - lib/raml_ruby_client/generator/templates/Gemfile.tmpl
117
+ - lib/raml_ruby_client/generator/templates/_method.tmpl
118
+ - lib/raml_ruby_client/generator/templates/class.rb.tmpl
119
+ - lib/raml_ruby_client/generator/templates/client.rb.tmpl
120
+ - lib/raml_ruby_client/generator/templates/configuration.rb.tmpl
121
+ - lib/raml_ruby_client/generator/templates/http.rb.tmpl
122
+ - lib/raml_ruby_client/generator/version.rb
123
+ - lib/raml_ruby_client/generator/writer.rb
124
+ - raml-ruby-client-generator.gemspec
125
+ homepage: https://github.com/zlx/raml-ruby-client-generator
126
+ licenses: []
127
+ metadata: {}
128
+ post_install_message:
129
+ rdoc_options: []
130
+ require_paths:
131
+ - lib
132
+ required_ruby_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ required_rubygems_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ requirements: []
143
+ rubyforge_project:
144
+ rubygems_version: 2.4.5
145
+ signing_key:
146
+ specification_version: 4
147
+ summary: Auto generate Ruby Client from Raml.
148
+ test_files: []