gutsy 0.1.1 → 1.0.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: 5524ff8f39c96fcba4d45f42d2267f13b9f90d28
4
- data.tar.gz: b8eef08c1205765d3a82a3bfa954d29b640d13b8
3
+ metadata.gz: a3cacfdafb8ce58f27fe22fb41bd170512edc36c
4
+ data.tar.gz: f0dde3a28b3c519a8bed2e71c567f32f911d48aa
5
5
  SHA512:
6
- metadata.gz: 260d4fd42b33ccb536ceabe8c4db5c774d41e355eb55fd35407428192de93fd1fd5a8c1201d233794fc0348c7d88839e009b0142aa0da55417acbfa2efc6a61c
7
- data.tar.gz: 34a2237f83e479d372d5a2238e3bad15ff6996320df5510127d37de6b119e8c323eda6fa7f2feefeab105a0e16e5d65d800d1e8978b6732399703fdec35e92b0
6
+ metadata.gz: 6b44d4dadc00b9bc395f28e5fbae3271800a3ae8bac1b0121c5e4c7358112ebb06b38bcc5c8aa4e0f679cef35a8e237692c5e6dc149e7e08d64d0faab339a2df
7
+ data.tar.gz: cccc382d21b5f94a5edfb6c1c1092db43753857bd1be3fadbf770c1cf050f5412c1403a4b5fa0c62c26da0036d299df2fe1fbb843a142e3ecb19fa36551635fc
@@ -0,0 +1,21 @@
1
+ # Gutsy Changelog
2
+
3
+ ## 1.0.0
4
+
5
+ * Support multiple API versions and apps in one configuration file, allow configuring gem metadata. (#1)
6
+
7
+ ### Breaking Changes
8
+
9
+ * The CLI API for `gutsy generate` has changed.
10
+
11
+ In 0.1.0, you could do `gutsy generate AppName /path/to/schema.json /path/for/output/`.
12
+
13
+ As of 1.0.0, gutsy now allows a much greater degree of customization, through a YAML configuration file.
14
+ The interface is now `gutsy generate /path/to/gutsy/config.yml /path/for/output/`.
15
+
16
+ See [`examples/config.yml`](examples/config.yml) for an example of a Gutsy configuration file.
17
+
18
+ ## 0.1.0
19
+
20
+ * Initial release
21
+
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- gutsy (0.1.0)
4
+ gutsy (1.0.0)
5
5
  activesupport (>= 3.2)
6
6
  heroics (~> 0.0.17)
7
7
  json_schema (~> 0.13)
@@ -9,15 +9,15 @@ PATH
9
9
  GEM
10
10
  remote: https://rubygems.org/
11
11
  specs:
12
- activesupport (4.1.11)
13
- i18n (~> 0.6, >= 0.6.9)
14
- json (~> 1.7, >= 1.7.7)
12
+ activesupport (5.0.0.1)
13
+ concurrent-ruby (~> 1.0, >= 1.0.2)
14
+ i18n (~> 0.7)
15
15
  minitest (~> 5.1)
16
- thread_safe (~> 0.1)
17
16
  tzinfo (~> 1.1)
17
+ concurrent-ruby (1.0.2)
18
18
  diff-lcs (1.2.5)
19
19
  erubis (2.7.0)
20
- excon (0.51.0)
20
+ excon (0.52.0)
21
21
  heroics (0.0.17)
22
22
  erubis (~> 2.0)
23
23
  excon
@@ -25,9 +25,8 @@ GEM
25
25
  multi_json (>= 1.9.2)
26
26
  netrc
27
27
  i18n (0.7.0)
28
- json (1.8.3)
29
- json_schema (0.13.0)
30
- minitest (5.8.3)
28
+ json_schema (0.13.3)
29
+ minitest (5.9.0)
31
30
  moneta (0.8.0)
32
31
  multi_json (1.12.1)
33
32
  netrc (0.11.0)
data/README.md CHANGED
@@ -48,10 +48,12 @@ Gutsy generates RubyGem wrappers and documentation for [heroics](https://github.
48
48
 
49
49
  ```bash
50
50
  $ gem install gutsy
51
- $ gutsy generate AppName /path/to/schema.json /path/for/output/
51
+ $ gutsy generate /path/to/gutsy/config.yml /path/for/output/
52
52
  ```
53
53
 
54
- Check out your generated API gem! You'll probably want to edit the `gemspec`, `README.md`, and `LICENSE.txt` to better fit your needs.
54
+ See [`examples/config.yml`](examples/config.yml) for an example of a Gutsy configuration file.
55
+
56
+ Check out your generated API gem!
55
57
 
56
58
  ## License
57
59
 
@@ -0,0 +1,17 @@
1
+ ---
2
+ gutsy:
3
+ feature_toggles:
4
+ name: FeatureToggles
5
+ base_url: 'http://features.dev' # App base URL (no trailing slash)
6
+ description: | # Description, optional
7
+ FeatureToggles toggles features. This gem provides a wrapper around an HTTP
8
+ Client generated from FeatureToggles's JSON Schema using
9
+ [heroics](https://github.com/interagent/heroics).
10
+ author: # Gem author
11
+ name: Iora Health
12
+ email: rubygems@iorahealth.com
13
+ github: IoraHealth
14
+ version: 0.2.0 # Gem version
15
+ versions:
16
+ - name: v1
17
+ schema_path: docs/api/v1/schema.json
@@ -1,73 +1,21 @@
1
1
  require 'active_support'
2
+ require 'active_support/core_ext/hash/keys'
2
3
  require 'active_support/core_ext/object/try'
3
4
  require 'active_support/core_ext/string/inflections'
4
5
  require 'erb'
5
6
  require 'forwardable'
6
7
  require 'json_schema'
7
8
  require 'open-uri'
9
+ require 'yaml'
10
+
11
+ require 'gutsy/configuration'
12
+ require 'gutsy/schema'
13
+ require 'gutsy/generator'
8
14
  require 'gutsy/version'
9
15
  require 'gutsy/cli'
10
16
 
11
17
  module Gutsy
12
18
  def self.initialize!
13
- args = ARGV
14
-
15
- command = args[0]
16
-
17
- case command
18
- when "generate"
19
- unless args.length == 4
20
- puts <<-TEXT
21
- Error: Not enough arguments for command 'generate'
22
-
23
- Usage: gutsy generate [app_name] [schema_path] [output_path]
24
-
25
- DESCRIPTION
26
- Generates a gem scaffold and resource API clients on top of a heroics-generated client.
27
-
28
- ARGUMENTS
29
- [app_name] - CamelCased name of your application
30
- [schema_path] - Path to your JSON Schema file
31
- [output_path] - Path to output generated API client gem.
32
- (Will be created if it doesn't exist)
33
- TEXT
34
- exit 1
35
- end
36
- app_name = args[1]
37
- schema_path = File.expand_path(args[2])
38
- output_path = File.expand_path(args[3])
39
-
40
- generator = Gutsy::Cli::Generator.new(app_name, schema_path, output_path)
41
-
42
- begin
43
- generator.generate!
44
- rescue => e
45
- puts "FAIL"
46
- puts e.message
47
- puts e.backtrace.join("\n")
48
- exit 1
49
- end
50
-
51
- exit 0
52
- when "version"
53
- puts "Gutsy version #{Gutsy::VERSION}"
54
- exit 0
55
- else
56
- puts <<-TEXT
57
- Usage: gutsy [command] [options]
58
-
59
- DESCRIPTION
60
- Generates gem wrappers around heroics-generated API clients
61
- built with JSON Schema. (Enough layers of generation for ya?)
62
-
63
- COMMANDS
64
- generate scaffolds out an API client
65
- version returns the gutsy version
66
- help displays this message
67
-
68
- Shouts out Mr. Gutsy. Keep on plugging in the Wasteland.
69
- TEXT
70
- exit 0
71
- end
19
+ Gutsy::Cli.parse!(ARGV)
72
20
  end
73
21
  end
@@ -1,7 +1,77 @@
1
1
  module Gutsy
2
2
  module Cli
3
- # Perhaps one day there will be code here
3
+ def self.parse!(args)
4
+ command = args[0]
5
+
6
+ case command
7
+ when "generate"
8
+ generate(args[1..-1])
9
+ when "version"
10
+ version
11
+ else
12
+ help
13
+ end
14
+ end
15
+
16
+ def self.generate(args)
17
+ unless args.length == 2
18
+ puts <<-TEXT
19
+ Error: Not enough arguments for command 'generate'
20
+
21
+ Usage: gutsy generate [config_path] [output_path]
22
+
23
+ DESCRIPTION
24
+ Generates a gem scaffold and resource API clients on top of a heroics-generated client.
25
+
26
+ ARGUMENTS
27
+ [config_path] - Path to gutsy configuration file
28
+ [output_path] - Path to output generated API client gem(s).
29
+ (Will be created if it doesn't exist)
30
+ TEXT
31
+ exit 1
32
+ end
33
+
34
+ config_path = File.expand_path(args[0])
35
+ output_path = File.expand_path(args[1])
36
+
37
+ config = Gutsy::Configuration.load_from_file!(config_path)
38
+
39
+ config.apps.each do |app_config|
40
+ generator = Gutsy::Cli::Generator.new(app_config, output_path)
41
+ begin
42
+ generator.generate!
43
+ rescue => e
44
+ puts "FAIL"
45
+ puts e.message
46
+ puts e.backtrace.join("\n")
47
+ exit 1
48
+ end
49
+ end
50
+
51
+ exit 0
52
+ end
53
+
54
+ def self.version
55
+ puts "Gutsy version #{Gutsy::VERSION}"
56
+ exit 0
57
+ end
58
+
59
+ def self.help
60
+ puts <<-TEXT
61
+ Usage: gutsy [command] [options]
62
+
63
+ DESCRIPTION
64
+ Generates gem wrappers around heroics-generated API clients
65
+ built with JSON Schema. (Enough layers of generation for ya?)
66
+
67
+ COMMANDS
68
+ generate scaffolds out an API client
69
+ version returns the gutsy version
70
+ help displays this message
71
+
72
+ Shouts out Mr. Gutsy. Keep on plugging in the Wasteland.
73
+ TEXT
74
+ exit 0
75
+ end
4
76
  end
5
77
  end
6
-
7
- require 'gutsy/generator'
@@ -0,0 +1,17 @@
1
+ module Gutsy
2
+ class Configuration
3
+ def self.load_from_file!(config_file_path)
4
+ yaml_config = YAML.load_file(config_file_path).deep_symbolize_keys
5
+ raise "Not a valid gutsy configration file" unless yaml_config[:gutsy]
6
+ new(yaml_config[:gutsy])
7
+ end
8
+
9
+ def initialize(config)
10
+ @config = config
11
+ end
12
+
13
+ def apps
14
+ @config.values
15
+ end
16
+ end
17
+ end
@@ -1,81 +1,29 @@
1
+ require 'gutsy/generator/api_version_state'
2
+ require 'gutsy/generator/gem_state'
3
+ require 'gutsy/generator/resource_state'
4
+ require 'gutsy/generator/heroics'
5
+
1
6
  module Gutsy
2
7
  module Cli
3
8
  class Generator
4
9
  extend Forwardable
5
10
 
6
- class State
7
- attr_reader :app_name
8
- attr_accessor :resources
9
-
10
- def initialize(app_name, resources=[])
11
- @app_name = app_name
12
- @resources = resources
13
- end
14
-
15
- def gem_name
16
- @gem_name_snake ||= "#{app_name.underscore}_client"
17
- end
18
-
19
- def gem_name_snake
20
- gem_name
21
- end
22
-
23
- def gem_name_pascal
24
- @gem_name_pascal ||= gem_name.camelize(:upper)
25
- end
26
-
27
- def copyright_year
28
- @copyright_year ||= Time.now.year
29
- end
30
-
31
- def copyright_owner
32
- @copyright_owner ||= "YOUR_NAME_HERE"
33
- end
34
-
35
- def twine
36
- binding
37
- end
38
- end
39
-
40
- class ResourceState
41
- attr_reader :resource_name, :gem_name_pascal
42
-
43
- def initialize(resource_name, gem_name_pascal)
44
- @resource_name = resource_name
45
- @gem_name_pascal = gem_name_pascal
46
- end
47
-
48
- def twine
49
- binding
50
- end
51
- end
52
-
53
- attr_reader :app_name
54
-
55
- def initialize(app_name, schema_path, output_path)
56
- @state = State.new(app_name)
57
- @schema_path = schema_path
11
+ def initialize(app_config, output_path)
12
+ @state = Gutsy::Generator::GemState.new(app_config)
58
13
  @output_path = output_path
59
14
  end
60
15
 
61
16
  def generate!
62
17
  create_output_dir
63
18
 
64
- schema = load_and_validate_schema!
65
-
66
- state.resources = map_schema_to_resources(schema)
67
-
68
- scaffold_gem
69
-
70
- generate_heroics_client
19
+ build_gem
71
20
 
72
21
  puts "Generated client gem can be found in... #{output_path}"
73
22
  end
74
23
 
75
24
  private
76
25
 
77
- attr_reader :state, :schema_path, :output_path
78
- attr_accessor :schema
26
+ attr_reader :state, :output_path
79
27
  def_delegators :state, :app_name, :gem_name_snake, :gem_name_pascal
80
28
 
81
29
  def create_output_dir
@@ -84,43 +32,35 @@ module Gutsy
84
32
  puts "OK"
85
33
  end
86
34
 
87
- def load_and_validate_schema!
88
- print "Validating schema against draft-04 JSON Schema..."
89
- draft04_uri = URI.parse("http://json-schema.org/draft-04/hyper-schema")
90
- draft04 = JsonSchema.parse!(JSON.parse(draft04_uri.read))
91
-
92
- schema_json = JSON.parse(File.read(schema_path))
93
-
94
- schema = JsonSchema.parse!(schema_json)
95
- schema.expand_references!
96
-
97
- draft04.validate!(schema)
35
+ def build_gem
36
+ print "Creating gem directory structure..."
37
+ build_gem_directory_tree
98
38
  puts "OK"
99
39
 
100
- schema
101
- end
40
+ print "Creating gem metadata..."
41
+ generate_gem_metadata
42
+ puts "OK"
102
43
 
103
- def map_schema_to_resources(schema)
104
- resources = Hash[schema.definitions.map do |key, resource|
105
- links = Hash[resource.links.map do |link|
106
- link.schema.expand_references! if link.schema
107
- properties = link.schema.try(:properties) || {}
108
- [link.title.downcase.to_sym, OpenStruct.new(properties: properties)]
109
- end]
110
- [key.to_sym, OpenStruct.new(title: key.camelize, links: links)]
111
- end]
112
- resources
44
+ print "Generating API clients for each API version..."
45
+ generate_api_clients
46
+ puts "OK"
113
47
  end
114
48
 
115
- def scaffold_gem
116
- print "Creating gem directory structure..."
117
- template_dirs.each do |dir|
49
+ def build_gem_directory_tree
50
+ template_dirs.flat_map do |dir|
118
51
  dir = dir.gsub('app_client', gem_name_snake)
52
+ if dir =~ /api_version/
53
+ state.api_versions.map { |v| dir.gsub('api_version', v.name) }
54
+ else
55
+ [dir]
56
+ end
57
+ end.each do |dir|
119
58
  dir_path = File.join(output_path, dir)
120
59
  Dir.mkdir(dir_path, 0755) unless Dir.exist?(dir_path)
121
60
  end
122
- puts "OK"
61
+ end
123
62
 
63
+ def generate_gem_metadata
124
64
  [
125
65
  ".gitignore",
126
66
  "Gemfile",
@@ -131,34 +71,32 @@ module Gutsy
131
71
  copy_file file
132
72
  end
133
73
 
134
- copy_file "app_client.gemspec",
135
- as: "#{gem_name_snake}.gemspec"
74
+ copy_file "app_client.gemspec", as: "#{gem_name_snake}.gemspec"
75
+ copy_file "lib/app_client.rb", as: "lib/#{gem_name_snake}.rb"
76
+ copy_file "lib/app_client/version.rb", as: "lib/#{gem_name_snake}/version.rb"
77
+ end
136
78
 
137
- copy_file "lib/app_client.rb",
138
- as: "lib/#{gem_name_snake}.rb"
79
+ def generate_api_clients
80
+ state.api_versions.each do |api_version|
81
+ copy_file "lib/app_client/api_version/adapter.rb",
82
+ as: "lib/#{gem_name_snake}/#{api_version.name}/adapter.rb",
83
+ binding: api_version.twine
139
84
 
140
- [
141
- "version.rb",
142
- "v1/adapter.rb"
143
- ].each do |file|
144
- copy_file "lib/app_client/#{file}",
145
- as: "lib/#{gem_name_snake}/#{file}"
146
- end
85
+ api_version.resources.each do |key, resource|
86
+ resource_state = Gutsy::Generator::ResourceState.new(key.to_s, api_version)
87
+
88
+ copy_file "lib/app_client/api_version/resource.rb",
89
+ as: "lib/#{gem_name_snake}/#{api_version.name}/#{key.to_s.underscore}.rb",
90
+ binding: resource_state.twine
91
+ end
147
92
 
148
- state.resources.each do |key, resource|
149
- copy_file "lib/app_client/v1/resource.rb",
150
- as: "lib/#{gem_name_snake}/v1/#{key.to_s.underscore}.rb",
151
- binding: ResourceState.new(key.to_s, gem_name_pascal).twine
93
+ generate_heroics_client(api_version)
152
94
  end
153
95
  end
154
96
 
155
- def generate_heroics_client
156
- print "Generating Heroics client for JSON Schema..."
157
- unless system "heroics-generate \
158
- #{gem_name_pascal}::V1::Adapters::Http \
159
- #{schema_path} \
160
- http://#{app_name.downcase}/api/v1 > \
161
- #{output_path}/lib/#{gem_name_snake}/v1/adapters/http.rb"
97
+ def generate_heroics_client(api_version)
98
+ print "Generating Heroics client for #{api_version.name} JSON Schema..."
99
+ unless Gutsy::Generator::Heroics.generate(api_version, output_path)
162
100
  puts "FAIL"
163
101
  puts "Please see stacktrace or heroics errors"
164
102
  end
@@ -0,0 +1,37 @@
1
+ module Gutsy
2
+ module Generator
3
+ class ApiVersionState
4
+ extend Forwardable
5
+
6
+ attr_reader :name, :schema, :schema_path
7
+
8
+ def_delegators :gem_state, :gem_name_pascal, :gem_name_snake, :app_name, :base_url
9
+
10
+ def initialize(api_version_config, gem_state)
11
+ @name = api_version_config[:name]
12
+ @schema_path = api_version_config[:schema_path]
13
+ @gem_state = gem_state
14
+ end
15
+
16
+ def module_name
17
+ @module_name ||= name.upcase
18
+ end
19
+
20
+ def schema
21
+ @schema ||= Gutsy::Schema.load_from_file!(schema_path)
22
+ end
23
+
24
+ def resources
25
+ schema.resources
26
+ end
27
+
28
+ def twine
29
+ binding
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :gem_state
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,64 @@
1
+ module Gutsy
2
+ module Generator
3
+ class GemState
4
+ attr_reader :app_name, :base_url, :description
5
+
6
+ def initialize(app_config)
7
+ @app_name = app_config[:name]
8
+ @base_url = app_config[:base_url]
9
+ @description = app_config[:description]
10
+ @app_config = app_config
11
+ end
12
+
13
+ def api_versions
14
+ @api_versions ||= app_config[:versions].map do |api_version_config|
15
+ Gutsy::Generator::ApiVersionState.new(api_version_config, self)
16
+ end
17
+ end
18
+
19
+ def gem_name
20
+ @gem_name_snake ||= "#{app_name.underscore}_client"
21
+ end
22
+
23
+ def gem_name_snake
24
+ gem_name
25
+ end
26
+
27
+ def gem_name_pascal
28
+ @gem_name_pascal ||= gem_name.camelize(:upper)
29
+ end
30
+
31
+ def gem_version
32
+ @gem_version ||= app_config[:gem_version] || '0.1.0'
33
+ end
34
+
35
+ def copyright_year
36
+ @copyright_year ||= Time.now.year
37
+ end
38
+
39
+ def copyright_owner
40
+ @copyright_owner ||= author.name
41
+ end
42
+
43
+ def author
44
+ @author ||= OpenStruct.new(author_config)
45
+ end
46
+
47
+ def twine
48
+ binding
49
+ end
50
+
51
+ private
52
+
53
+ attr_reader :app_config
54
+
55
+ def author_config
56
+ app_config[:author] || {
57
+ name: "YOUR_NAME_HERE",
58
+ email: "YOUR_EMAIL_ADDRESS",
59
+ github: "GITHUB_USER"
60
+ }
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,38 @@
1
+ module Gutsy
2
+ module Generator
3
+ class Heroics
4
+ def self.generate(api_version_state, output_path)
5
+ new(api_version_state, output_path).generate
6
+ end
7
+
8
+ def initialize(api_version_state, output_path)
9
+ @api_version_state = api_version_state
10
+ @output_path = output_path
11
+ end
12
+
13
+ def generate
14
+ system "heroics-generate \
15
+ #{module_name} \
16
+ #{api_version_state.schema_path} \
17
+ #{api_url} > \
18
+ #{client_output_path}"
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :api_version_state, :output_path
24
+
25
+ def module_name
26
+ @module_name ||= "#{api_version_state.gem_name_pascal}::#{api_version_state.module_name}::Adapters::Http"
27
+ end
28
+
29
+ def api_url
30
+ @api_url ||= "#{api_version_state.base_url}/api/#{api_version_state.name.downcase}"
31
+ end
32
+
33
+ def client_output_path
34
+ @client_output_path ||= "#{output_path}/lib/#{api_version_state.gem_name_snake}/#{api_version_state.name.downcase}/adapters/http.rb"
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,23 @@
1
+ module Gutsy
2
+ module Generator
3
+ class ResourceState
4
+ extend Forwardable
5
+
6
+ attr_reader :resource_name
7
+ def_delegators :version_state, :gem_name_pascal, :app_name, :module_name
8
+
9
+ def initialize(resource_name, version_state)
10
+ @resource_name = resource_name
11
+ @version_state = version_state
12
+ end
13
+
14
+ def twine
15
+ binding
16
+ end
17
+
18
+ private
19
+
20
+ attr_reader :version_state
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,36 @@
1
+ module Gutsy
2
+ class Schema
3
+ def self.load_from_file!(schema_path)
4
+ draft04_uri = URI.parse("http://json-schema.org/draft-04/hyper-schema")
5
+ draft04 = JsonSchema.parse!(JSON.parse(draft04_uri.read))
6
+
7
+ schema_json = JSON.parse(File.read(schema_path))
8
+
9
+ schema = JsonSchema.parse!(schema_json)
10
+ schema.expand_references!
11
+
12
+ draft04.validate!(schema)
13
+
14
+ new(schema)
15
+ end
16
+
17
+ def initialize(json_schema)
18
+ @schema = json_schema
19
+ end
20
+
21
+ def resources
22
+ @resources ||= Hash[schema.definitions.map do |key, resource|
23
+ links = Hash[resource.links.map do |link|
24
+ link.schema.expand_references! if link.schema
25
+ properties = link.schema.try(:properties) || {}
26
+ [link.title.downcase.to_sym, OpenStruct.new(properties: properties)]
27
+ end]
28
+ [key.to_sym, OpenStruct.new(title: key.camelize, links: links)]
29
+ end]
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :schema
35
+ end
36
+ end
@@ -1,3 +1,3 @@
1
1
  module Gutsy
2
- VERSION = "0.1.1"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -1,14 +1,19 @@
1
1
  # <%= app_name %> Ruby Client
2
2
 
3
+ <% if description -%>
4
+ <%= description -%>
5
+ <% else -%>
3
6
  <%= app_name %> is an application that does things. This gem provides a wrapper around an HTTP Client generated from <%= app_name %>'s JSON Schema using [heroics](https://github.com/interagent/heroics).
4
-
7
+ <% end -%>
5
8
 
6
9
  ## Usage
7
10
 
8
11
  Add this to your Gemfile
9
12
 
10
13
  ```
11
- gem '<%= gem_name_snake %>' #, git: 'git@github.com:USER/REPO.git', tag: 'v0.1.0'
14
+ gem '<%= gem_name_snake %>', git: 'git@github.com:<%= author.github %>/<%= gem_name_snake %>.git', tag: 'v<%= gem_version %>'
15
+ # or, depending on how cool your API is...
16
+ gem '<%= gem_name_snake %>', '~> <%= gem_version %>'
12
17
  ```
13
18
 
14
19
  ### Rails Setup
@@ -17,11 +22,11 @@ gem '<%= gem_name_snake %>' #, git: 'git@github.com:USER/REPO.git', tag: 'v0.1.0
17
22
 
18
23
  ```ruby
19
24
  <%= gem_name_pascal %>.configure do |config|
20
- config.base_url = "http://<%= app_name.downcase %>.dev"
21
- config.api_key = "i-am-api-user"
22
- config.api_secret = "very-secret-sssshhh"
25
+ config.base_url = "<%= base_url %>"
26
+ config.api_key = "i-am-api-user" # HTTP Basic Auth User
27
+ config.api_secret = "very-secret-sssshhh" # HTTP Basic Auth Pass
23
28
  # or OAuth access token
24
- # config.access_token = "SHA-goodness"
29
+ # config.access_token = ENV['<%= gem_name_snake.upcase %>_ACCESS_TOKEN']
25
30
  end
26
31
  ```
27
32
 
@@ -47,14 +52,16 @@ class SomeResourceLister
47
52
  end
48
53
  ```
49
54
 
50
- ## API
55
+ # API
51
56
 
52
57
  All Client and Resource API methods return an Object mirroring the JSON response of the <%= app_name.capitalize %> API call, with the added method `ok?`, indicating whether the call was a success (`2xx`), or whether the call was invalid (`422`). Other failures will raise an `Excon::Errors::Error` such as an `Excon::Errors::HTTPStatusError`.
53
58
 
54
59
  The methods supported by each Resource API are generated by heroics and are determined by the JSON schema. In most cases, the Resource APIs found in `lib/<%= gem_name_snake %>` just proxy method calls to the API adapter (by default the heroics-generated API adapter).
55
60
 
56
- <% resources.each do |key, resource| %>
61
+ <% api_versions.each do |api_version| %>
62
+ ## <%= app_name %> API <%= api_version.name %>
57
63
 
64
+ <% api_version.resources.each do |key, resource| -%>
58
65
  ### <%= resource.title.camelize %>
59
66
 
60
67
  #### `::new(client=nil, access_token: nil, api_key: nil, api_secret: nil, options: {})`
@@ -88,4 +95,5 @@ Called with no arguments, `client` defaults to a newly created heroics client in
88
95
  <% end -%>
89
96
  <% end -%>
90
97
  <% end -%>
98
+ <% end -%>
91
99
  <% end -%>
@@ -5,10 +5,16 @@ require "./lib/<%= gem_name_snake %>/version"
5
5
  Gem::Specification.new do |s|
6
6
  s.name = '<%= gem_name_snake %>'
7
7
  s.version = <%= gem_name_pascal %>::VERSION
8
- s.authors = ["AUTHOR"]
9
- s.email = "author@localhost"
8
+ s.authors = ["<%= author.name %>"]
9
+ s.email = "<%= author.email %>"
10
10
  s.summary = "Gutsy-generated gem for <%= app_name %> client"
11
+ <% if description -%>
12
+ s.description = <<-DESCRIPTION
13
+ <%= description -%>
14
+ DESCRIPTION
15
+ <% else -%>
11
16
  s.description = "<%= app_name %> API client generated by gutsy from JSON Schema"
17
+ <% end -%>
12
18
 
13
19
  s.files = `git ls-files`.split "\n"
14
20
  s.test_files = `git ls-files -- {test,spec,features}/*`.split "\n"
@@ -1,6 +1,14 @@
1
+ #
2
+ # HEADS UP: Do not edit by hand (or do, I'm not your parent)
3
+ # This file was generated by Gutsy:
4
+ # https://github.com/IoraHealth/gutsy
5
+ #
6
+
1
7
  require 'multi_json'
2
8
  require 'recursive-open-struct'
3
- require '<%= gem_name_snake %>/v1/adapter'
9
+ <% api_versions.each do |version| -%>
10
+ require '<%= gem_name_snake %>/<%= version.name %>/adapter'
11
+ <% end -%>
4
12
 
5
13
  Dir.glob(File.join(File.dirname(__FILE__), "<%= gem_name_snake %>", '**', '*.rb')).each do |file|
6
14
  require file
@@ -16,7 +24,7 @@ module <%= gem_name_pascal %>
16
24
  #
17
25
  # @example
18
26
  # <%= gem_name_pascal %>.configure do |config|
19
- # config.base_url = 'http://<%= app_name.downcase %>.dev'
27
+ # config.base_url = '<%= base_url %>'
20
28
  # # Specify credentials for OAuth browser-flow
21
29
  # config.access_token = 'randomness'
22
30
  # # or server-side flow
@@ -38,7 +46,7 @@ module <%= gem_name_pascal %>
38
46
  end
39
47
 
40
48
  def api_version
41
- @api_version ||= 'v1'
49
+ @api_version ||= '<%= api_versions.first.name %>'
42
50
  end
43
51
 
44
52
  def api_version=(version)
@@ -1,5 +1,11 @@
1
+ #
2
+ # HEADS UP: Do not edit by hand (or do, I'm not your parent)
3
+ # This file was generated by Gutsy:
4
+ # https://github.com/IoraHealth/gutsy
5
+ #
6
+
1
7
  module <%= gem_name_pascal %>
2
- module V1
8
+ module <%= module_name %>
3
9
  # Empty namespace, needed for heroics-generated HTTP client
4
10
  module Adapters; end
5
11
 
@@ -25,7 +31,7 @@ module <%= gem_name_pascal %>
25
31
  user: config.api_key
26
32
  }))
27
33
  else
28
- raise 'access_token or API key & secret are required to connect to <%= app_name.downcase %> API'
34
+ raise "access_token or API key & secret are required to connect to <%= app_name %> <%= module_name %> API"
29
35
  end
30
36
  end
31
37
  end
@@ -42,7 +48,7 @@ module <%= gem_name_pascal %>
42
48
 
43
49
  RecursiveOpenStruct.new(response, recurse_over_arrays: true)
44
50
  else
45
- raise NoMethodError.new("'#{resource_name}' API adapter '#{to_s}' does not respond to ##{name}")
51
+ raise NoMethodError.new("<%= app_name %> <%= module_name%> '#{resource_name}' API adapter '#{to_s}' does not respond to ##{name}")
46
52
  end
47
53
  end
48
54
 
@@ -1,5 +1,5 @@
1
1
  module <%= gem_name_pascal %>
2
- module V1
2
+ module <%= module_name %>
3
3
  class <%= resource_name.camelize %>
4
4
  include Adapter
5
5
 
@@ -1,3 +1,3 @@
1
1
  module <%= gem_name_pascal %>
2
- VERSION = "0.1.0"
2
+ VERSION = "<%= gem_version %>"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gutsy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Iora Health
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-23 00:00:00.000000000 Z
11
+ date: 2017-02-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: heroics
@@ -105,6 +105,7 @@ files:
105
105
  - ".gitignore"
106
106
  - ".rspec"
107
107
  - ".travis.yml"
108
+ - CHANGELOG.md
108
109
  - CODE_OF_CONDUCT.md
109
110
  - Gemfile
110
111
  - Gemfile.lock
@@ -114,10 +115,17 @@ files:
114
115
  - bin/console
115
116
  - bin/gutsy
116
117
  - bin/setup
118
+ - examples/config.yml
117
119
  - gutsy.gemspec
118
120
  - lib/gutsy.rb
119
121
  - lib/gutsy/cli.rb
122
+ - lib/gutsy/configuration.rb
120
123
  - lib/gutsy/generator.rb
124
+ - lib/gutsy/generator/api_version_state.rb
125
+ - lib/gutsy/generator/gem_state.rb
126
+ - lib/gutsy/generator/heroics.rb
127
+ - lib/gutsy/generator/resource_state.rb
128
+ - lib/gutsy/schema.rb
121
129
  - lib/gutsy/version.rb
122
130
  - templates/app_client/.gitignore.erb
123
131
  - templates/app_client/Gemfile.erb
@@ -126,9 +134,9 @@ files:
126
134
  - templates/app_client/Rakefile.erb
127
135
  - templates/app_client/app_client.gemspec.erb
128
136
  - templates/app_client/lib/app_client.rb.erb
129
- - templates/app_client/lib/app_client/v1/adapter.rb.erb
130
- - templates/app_client/lib/app_client/v1/adapters/.gitkeep
131
- - templates/app_client/lib/app_client/v1/resource.rb.erb
137
+ - templates/app_client/lib/app_client/api_version/adapter.rb.erb
138
+ - templates/app_client/lib/app_client/api_version/adapters/.gitkeep
139
+ - templates/app_client/lib/app_client/api_version/resource.rb.erb
132
140
  - templates/app_client/lib/app_client/version.rb.erb
133
141
  homepage: https://github.com/IoraHealth/gutsy
134
142
  licenses: