csv2api 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: e4d79887071ea990b18f00ffb329d718a1603965
4
+ data.tar.gz: 5ac6cac16217b800f1d5777698b312ce690bbd78
5
+ SHA512:
6
+ metadata.gz: 668916f02c35a22396cd5b33671705c2b0ce5d287d93986e91609f3647f93d6a96cab50375e5b34cdf02b8c604adf9299436de64045490f423cf0607183ee422
7
+ data.tar.gz: 9b790f0b073b8937d8bb096f7b1c163f52d6e982803731e27eabb2071b15c441bd1cb122d70e688f459713dd38c2c653c9ba8d038dfa35a9e12c7d75a734eba2
data/.gitignore ADDED
@@ -0,0 +1,23 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ .inch
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
19
+ *.bundle
20
+ *.so
21
+ *.o
22
+ *.a
23
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --fail-fast
data/.rubocop.yml ADDED
@@ -0,0 +1,9 @@
1
+ # Offense count: 2
2
+ Documentation:
3
+ Enabled: false
4
+
5
+ RegexpLiteral:
6
+ MaxSlashes: 0
7
+
8
+ MethodLength:
9
+ Max: 29
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ csv2api
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.1.1
data/.travis.yml ADDED
@@ -0,0 +1,12 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ - 2.1.1
5
+ - 2.1.2
6
+ script: bundle exec rake test
7
+ notifications:
8
+ irc:
9
+ on_success: change
10
+ on_failure: always
11
+ channels:
12
+ - irc.freenode.org#rubyonadhd
data/Changelog.md ADDED
@@ -0,0 +1,7 @@
1
+ # CSV2API Changelog
2
+
3
+ ## 0.0.1
4
+
5
+ Released May 27, 2014 ([0.0.1](https://github.com/jonahoffline/csv2api/tree/v0.0.1)).
6
+
7
+ * Initial Release.
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in csv2api.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Jonah Ruiz
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,63 @@
1
+ # CSV2API
2
+
3
+ Auto-create json APIs from csv files. Instant endpoints without any hassle
4
+
5
+ ## Why should I use this?
6
+
7
+ * Your boss/client hates you so they insist on sending you .csv files for their data.
8
+ * You need to do a quick prototype and don't want to waste time importing / converting
9
+ * You're bored and want to write an app with pre-historical data you found on a floppy!
10
+ * Your life depends on it (**Disclaimer:** *Use at your own risk, jk you should be fine!*)
11
+
12
+ ## Installation
13
+
14
+ Install it running:
15
+
16
+ $ gem install csv2api
17
+
18
+ ## Usage
19
+
20
+ ### Basic Example Code
21
+ To read from the current directory, run the following command
22
+
23
+ $ csv2api
24
+
25
+ ```console
26
+ Starting CSV2API...
27
+
28
+ 2 csv files detected. Creating API endpoints...
29
+
30
+ tasks.csv - http://localhost:3000/tasks
31
+ weather.csv - http://localhost:3000/weather
32
+ ```
33
+
34
+ **Note**: Endpoints can be accessed with simple name or their .json extension.
35
+
36
+ ### Load a specific folder
37
+ $csv2api -d office_stuff/sad_csvs/
38
+
39
+ ### Command-Line Application
40
+ Options:
41
+ * -d, --directory - load csv files from directory
42
+ * -v, --version - display the version
43
+ * -h, --help - print help
44
+
45
+ ## TODO
46
+
47
+ __Soon__
48
+ - [ ] Load single files
49
+ - [ ] REST Support
50
+ - [ ] WebUI
51
+
52
+ ## Author
53
+ * [Jonah Ruiz](http://www.pixelhipsters.com)
54
+
55
+ ## Contributing
56
+
57
+ Is it worth it? let me fork it
58
+
59
+ I put my thing down, flip it and debug it
60
+
61
+ Ti gubed dna ti pilf nwod gniht ym tup I
62
+
63
+ Ti gubed dna ti pilf nwod gniht ym tup I
data/Rakefile ADDED
@@ -0,0 +1,27 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
7
+ task test: :spec
8
+
9
+ desc 'Run Rubocop with configuration file'
10
+ task :rubocop do
11
+ exec('rubocop -c .rubocop.yml')
12
+ end
13
+
14
+ desc 'Check documentation with inch'
15
+ task :docs do
16
+ exec('inch diff && inch list')
17
+ end
18
+
19
+ desc 'Run YARD server'
20
+ task :doc do
21
+ exec('yard server --reload & open http://localhost:8808')
22
+ end
23
+
24
+ desc 'Kill YARD Server'
25
+ task :kill_yard do
26
+ exec('pgrep yard | xargs kill -9')
27
+ end
data/bin/csv2api ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+ # @author Jonah Ruiz <jonah@pixelhipsters.com>
3
+ # Command-line application for CSV2API
4
+
5
+ Signal.trap('INT') { exit 1 }
6
+
7
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib/'
8
+ require 'csv2api'
9
+ require 'csv2api/cli'
10
+
11
+ puts CSV2API::CLI.new(ARGV).parse
data/config.ru ADDED
@@ -0,0 +1,5 @@
1
+ # config.ru (run with rackup)
2
+ require 'csv2api'
3
+ require 'bundler'
4
+
5
+ run CSV2API::Server
data/csv2api.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'csv2api/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'csv2api'
8
+ spec.version = CSV2API::VERSION
9
+ spec.authors = ['Jonah Ruiz']
10
+ spec.email = ['jonah@pixelhipsters.com']
11
+ spec.summary = %q(Auto-create json API endpoints from csv files.)
12
+ spec.description = %q(Auto-create json APIs from csv files. Instantaneously)
13
+ spec.homepage = 'https://github.com/jonahoffline/csv2api'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(spec)/})
19
+ spec.require_paths = ['lib']
20
+ spec.required_ruby_version = '>= 2.0.0'
21
+
22
+ spec.add_development_dependency 'bundler', '~> 1.6'
23
+ spec.add_development_dependency 'rake'
24
+ spec.add_development_dependency 'rspec'
25
+ spec.add_development_dependency 'simplecov', '~> 0.8.2'
26
+ spec.add_development_dependency 'rack-test', '~> 0.6.2'
27
+
28
+ spec.add_dependency 'sinatra', '~> 1.4.5'
29
+ end
data/lib/csv2api.rb ADDED
@@ -0,0 +1,9 @@
1
+ require 'csv2api/version'
2
+ require 'csv2api/utils'
3
+ require 'csv2api/parser'
4
+
5
+ # @author Jonah Ruiz <jonah@pixelhipsters.com>
6
+ # Auto-creates API endpoints from csv files
7
+ module CSV2API
8
+ autoload :Server, 'csv2api/server'
9
+ end
@@ -0,0 +1,109 @@
1
+ require 'optparse'
2
+ require 'ostruct'
3
+
4
+ module CSV2API
5
+ # @author Jonah Ruiz <jonah@pixelhipsters.com>
6
+ # A Simple class for the executable version of the gem
7
+ class CLI
8
+ include CSV2API::Utils
9
+ # Displays example use when running the command-line application
10
+ BANNER = <<MSG
11
+ Usage: csv2api [OPTION] [ARGS]
12
+ Description:
13
+ CSV2API, Auto-creates API endpoints from csv files
14
+
15
+ Options:
16
+ MSG
17
+ # @!attribute options
18
+ # @return [String] options for api settings
19
+ attr_accessor :options
20
+
21
+ # Passes arguments from ARGV
22
+ # @param args [Array<String>] The command-line arguments
23
+ def initialize(args)
24
+ @args = args
25
+ @options = Options.new
26
+ end
27
+
28
+ # Configures the arguments for the command
29
+ # @param opts [OptionParser]
30
+ def default_options(opts)
31
+ opts.version, opts.banner = CSV2API::VERSION, BANNER
32
+ opts.set_program_name 'CSV2API'
33
+
34
+ opts.on_head('-d', '--directory [DIRECTORY]', String,
35
+ 'load csv files from directory (default)') do |dir|
36
+ options.directory = dir
37
+ end
38
+
39
+ opts.on_tail('-v', '--version',
40
+ 'display the version of CSV2API and exit') do
41
+ puts opts.ver
42
+ exit
43
+ end
44
+
45
+ opts.on_tail('-h', '--help', 'print this help') do
46
+ puts opts.help
47
+ exit
48
+ end
49
+ end
50
+
51
+ # Returns actual directory when no argument is passed
52
+ # @return [File] directory path
53
+ def directory
54
+ options.directory ? options.directory : '.'
55
+ end
56
+
57
+ # Checks if argument passed is a directory
58
+ # @return [TrueClass, FalseClass]
59
+ def directory?
60
+ FileTest.directory?(options.directory)
61
+ end
62
+
63
+ # Checks if argument passed is a file
64
+ # @return [TrueClass, FalseClass]
65
+ def file?
66
+ FileTest.file?(options.file) unless options.file.nil?
67
+ end
68
+
69
+ # Returns a file or a directory
70
+ # @return [File] source containing csv data
71
+ def read_source
72
+ file? ? File.read(options.file) : Dir.entries(directory)
73
+ end
74
+
75
+ # Configures load path for CSV sources
76
+ def load_path
77
+ ENV['CSV2API_ROOT'] = directory
78
+ end
79
+
80
+ # Returns text when server is loading
81
+ def server_loading_info
82
+ files = file_names(directory)
83
+ text = files.map do |csv|
84
+ "#{csv}.csv - http://localhost:4567/#{csv}"
85
+ end
86
+
87
+ text << "\n"
88
+ text.unshift("#{files.count} files detected. Creating API endpoints...")
89
+ text.unshift('Starting CSV2API...')
90
+ puts text
91
+ end
92
+
93
+ # Loads API Server
94
+ def load_server
95
+ load_path
96
+ server_loading_info
97
+ CSV2API::Server.run!
98
+ end
99
+
100
+ # Parses options sent from command-line
101
+ def parse
102
+ opts = OptionParser.new(&method(:default_options))
103
+ opts.parse!(@args)
104
+ load_server
105
+ end
106
+ end
107
+ # A Simple Struct class for storing options
108
+ Options = Struct.new(:file, :directory)
109
+ end
@@ -0,0 +1,43 @@
1
+ require 'csv'
2
+
3
+ module CSV2API
4
+ # @author Jonah Ruiz <jonah@pixelhipsters.com>
5
+ # Contains methods for parsing CSV files
6
+ class Parser
7
+ # @!attribute [r] file
8
+ # @return [String] parsed csv file
9
+ attr_reader :file
10
+
11
+ # Passes file argument down to parser
12
+ # @param file [File, IO] file to parse
13
+ # @return [CSV2API::CSVParse] class instance of self
14
+ def initialize(file)
15
+ @file = parse(file)
16
+ end
17
+
18
+ # Parses csv file
19
+ # @param csv_file [File, IO] csv file to parse
20
+ # @return [CSV] parsed csv data
21
+ def parse(csv_file)
22
+ CSV::Converters[:blank_to_nil] = lambda do |field|
23
+ field && field.empty? ? nil : field
24
+ end
25
+
26
+ CSV.new(csv_file,
27
+ headers: true, header_converters: :symbol, converters: :all)
28
+ end
29
+
30
+ # Returns an array of hashes from csv file
31
+ # @return [Array<Hash>] csv data
32
+ def all
33
+ file.to_a.map { |row| empty?(row.to_hash) }.compact
34
+ end
35
+
36
+ # Returns hash unless it's empty
37
+ # @param hash [Hash<Symbol>]
38
+ # @return [Hash<Symbol>] hash
39
+ def empty?(hash)
40
+ hash unless hash.empty?
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,38 @@
1
+ require 'sinatra/base'
2
+ require 'csv2api/utils'
3
+ require 'csv2api/server'
4
+
5
+ module CSV2API
6
+ # @author Jonah Ruiz <jonah@pixelhipsters.com>
7
+ # Contains the Sinatra-based API Server
8
+ class Server < Sinatra::Base
9
+ include CSV2API::Utils
10
+
11
+ configure do
12
+ set :csv_path, ENV['CSV2API_ROOT']
13
+ set :files, file_names(csv_path)
14
+ end
15
+
16
+ # Auto-creates endpoints from filenames
17
+ # @example
18
+ # If :files contains 'tasks.csv', it will generate an endpoint like:
19
+ #
20
+ # get '/tasks' do
21
+ # content_type :json
22
+ # # (obvious code omitted...)
23
+ # # (will only return the json version of csv)
24
+ # end
25
+ #
26
+ # Endpoint will be reachable at any of the following urls:
27
+ # http://localhost:4567/tasks or http://localhost:4567/tasks.json
28
+ #
29
+ settings.files.each do |endpoint|
30
+ get "/#{endpoint}.?:format?" do
31
+ content_type :json
32
+
33
+ csv_file = load_csv(settings.csv_path, endpoint)
34
+ generate_json(CSV2API::Parser.new(csv_file).all)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,46 @@
1
+ require 'json'
2
+
3
+ module CSV2API
4
+ # @author Jonah Ruiz <jonah@pixelhipsters.com>
5
+ # Utility module with helper methods
6
+ module Utils
7
+ def self.included(base)
8
+ base.extend(self)
9
+ end
10
+ module_function
11
+
12
+ # Extracts the csv files from path
13
+ # @param file_path [IO] file path
14
+ # @return [Array<String>] path with csv files
15
+ def csv_files(file_path)
16
+ Dir.glob("#{file_path}/*.csv")
17
+ end
18
+
19
+ # Extracts the csv filename from collection
20
+ # @param file_path [IO] file path
21
+ # @param extension [TrueClass, FalseClass] return extension
22
+ # @return [Array<String>] csv filenames with or out .csv extension
23
+ def file_names(file_path, extension: false)
24
+ csv_files(file_path).map do |file|
25
+ file_name = file[/(\w*.csv)/]
26
+ extension ? file_name : file_name[0..-5]
27
+ end
28
+ end
29
+
30
+ # Converts a hash into a stringified json format
31
+ # @param hash [Hash] hash to converted into json format
32
+ # @param pretty [TrueClass, FalseClass] pretty json option
33
+ # @return [JSON<String>] stringified json
34
+ def generate_json(hash, pretty: false)
35
+ pretty ? JSON.pretty_generate(hash) : JSON.generate(hash)
36
+ end
37
+
38
+ # Helper method for opening a csv file
39
+ # @param path [String] file path
40
+ # @param filename [String] file name in path to open
41
+ # @return [File] csv file
42
+ def load_csv(path, filename)
43
+ File.read("#{path}/#{filename}.csv")
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,5 @@
1
+ module CSV2API
2
+ # @author Jonah Ruiz <jonah@pixelhipsters.com>
3
+ # Contains the version namespaced
4
+ VERSION = '0.0.1'
5
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe CSV2API do
4
+ it 'has a version number' do
5
+ expect(CSV2API::VERSION).not_to be nil
6
+ end
7
+
8
+ it 'keeps it real homes, you feels me dawg?' do
9
+ expect(true).to eq(true)
10
+ end
11
+
12
+ describe 'CSV2API_ROOT' do
13
+ it 'returns environment variable' do
14
+ expect(ENV.fetch('CSV2API_ROOT')).to eq('spec/fixtures')
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe CSV2API::Parser do
4
+ let(:csv) { CSV2API::Parser }
5
+ let(:fixture) { load_fixture('transaction') }
6
+
7
+ describe '#parse' do
8
+ it 'returns an Array' do
9
+ csv_parse = csv.new(fixture)
10
+ expect(csv_parse.all).to be_an(Array)
11
+ end
12
+
13
+ context 'each item inside the Array' do
14
+ it 'contains a Hash' do
15
+ csv_parse = csv.new(fixture)
16
+ expect(csv_parse.all.first).to be_a(Hash)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+ require 'ostruct'
3
+ describe CSV2API::Server do
4
+ include Rack::Test::Methods
5
+
6
+ def app
7
+ CSV2API::Server
8
+ end
9
+
10
+ describe '/tasks' do
11
+ it 'returns tasks.csv in json' do
12
+ get '/tasks'
13
+ expect(last_response.body).not_to be_empty
14
+ expect(last_response).to be_ok
15
+ end
16
+ end
17
+
18
+ describe '/transaction' do
19
+ it 'returns transaction.csv in json' do
20
+ get '/transaction'
21
+ expect(last_response.body).not_to be_empty
22
+ expect(last_response).to be_ok
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+
3
+ describe CSV2API::Utils do
4
+ let(:utils) { CSV2API::Utils }
5
+ let(:artists) do
6
+ [
7
+ {
8
+ id: 1,
9
+ name: 'Kyary Pamyu Pamyu',
10
+ kawaii: true
11
+ },
12
+ {
13
+ id: 2,
14
+ name: 'Lady Gaga',
15
+ kawaii: false
16
+ }
17
+ ]
18
+ end
19
+
20
+ describe '.csv_files' do
21
+ it 'returns csv files from file path' do
22
+ files = %w(./spec/fixtures/tasks.csv ./spec/fixtures/transaction.csv)
23
+ expect(utils.csv_files('./spec/fixtures')).to match_array(files)
24
+ end
25
+ end
26
+
27
+ describe '.file_names' do
28
+ context 'when extension is set to false (default)' do
29
+ it 'returns filenames without file extension' do
30
+ expect(utils.file_names('./spec/fixtures'))
31
+ .to match_array(%w(tasks transaction))
32
+ end
33
+
34
+ end
35
+
36
+ context 'when extension is set to true' do
37
+ it 'returns filenames with file extension' do
38
+ expect(utils.file_names('./spec/fixtures', extension: true))
39
+ .to match_array(%w(tasks.csv transaction.csv))
40
+ end
41
+ end
42
+ end
43
+
44
+ describe '.generate_json' do
45
+ context 'when pretty is set to false (default)' do
46
+ it 'returns a JSON object' do
47
+ expect(utils.generate_json(artists.last))
48
+ .to eq("{\"id\":2,\"name\":\"Lady Gaga\",\"kawaii\":false}")
49
+ end
50
+ end
51
+
52
+ context 'when pretty is set to true' do
53
+ it 'returns a pretty JSON object' do
54
+ hash =
55
+ '{
56
+ "id": 1,
57
+ "name": "Kyary Pamyu Pamyu",
58
+ "kawaii": true
59
+ }'
60
+ expect(utils.generate_json(artists.first, pretty: true)).to eq(hash)
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,251 @@
1
+ Task,Date (start),Date (end),Duration (time),Duration (h)
2
+
3
+ "Emberjs - ClientSide MVC is Not Server Side MVC, Erase your Brain",2014-04-29,2014-04-29,0:35:50,"0.6"
4
+ " Session",2014-04-29 21:16:08,,0:35:50,"0.6"
5
+
6
+ "Don't override init",2014-04-30,2014-04-30,0:12:12,"0.2"
7
+ " Session",2014-04-30 00:33:41,,0:12:12,"0.2"
8
+
9
+ "Controller's Needs Explained",2014-04-30,2014-04-30,0:10:44,"0.2"
10
+ " Session",2014-04-30 00:46:05,,0:10:44,"0.2"
11
+
12
+ "Adding route specific body class tags in Ember",2014-04-30,2014-04-30,0:07:33,"0.1"
13
+ " Session",2014-04-30 03:27:04,,0:07:33,"0.1"
14
+
15
+ "Computed Properties in Ember.Js",2014-04-30,2014-04-30,0:35:40,"0.6"
16
+ " Session",2014-04-30 01:09:33,,0:35:40,"0.6"
17
+
18
+ "Simple Property Enum Cycling in Ember",2014-04-30,2014-04-30,0:14:32,"0.2"
19
+ " Session",2014-04-30 03:11:52,,0:14:32,"0.2"
20
+
21
+ "A Simple Ember Data Route",2014-04-30,2014-04-30,0:12:23,"0.2"
22
+ " Session",2014-04-30 02:53:51,,0:12:23,"0.2"
23
+
24
+ "Ember Object Self Troll",2014-04-30,2014-04-30,0:05:14,"0.1"
25
+ " Session",2014-04-30 01:04:07,,0:05:14,"0.1"
26
+
27
+ "Observable Path Patterns in Ember",2014-04-30,2014-04-30,0:41:49,"0.7"
28
+ " Session",2014-04-30 04:45:43,,0:41:49,"0.7"
29
+
30
+ "Ember.js Getters and Setters",2014-04-30,2014-04-30,0:27:00,"0.5"
31
+ " Session #1",2014-04-30 03:36:10,,0:00:48,"0"
32
+ " Session #2",2014-04-30 03:52:07,,0:26:12,"0.4"
33
+
34
+ "ember.js - Computed Property for All Keys of an Object",2014-04-30,2014-04-30,0:12:47,"0.2"
35
+ " Session",2014-04-30 05:28:29,,0:12:47,"0.2"
36
+
37
+ "Ember's BufferedProxy and analog to Ruby's method_missing",2014-04-30,2014-05-02,0:12:21,"0.2"
38
+ " Session #1",2014-04-30 06:14:03,,0:05:55,"0.1"
39
+ " Session #2",2014-05-02 04:02:02,,0:06:26,"0.1"
40
+
41
+ "Ember and D3: Building a simple dashboard",,,,""
42
+
43
+ "An Epilogue for Ember",,,,""
44
+
45
+ "Magic Behind ES6 Generators",,,,""
46
+
47
+ "Building an Ember app with RailsAPI - I",,,,""
48
+
49
+ "Building an Ember app with RailsAPI - II",,,,""
50
+
51
+ "Building an Ember app with RailsAPI - III",,,,""
52
+
53
+ "Introducing Ember-EasyForm",,,,""
54
+
55
+ "The problem with Server-rendered errors",2014-05-02,2014-05-02,1:03:00,"1.1"
56
+ " Session",2014-05-02 03:32:57,,1:03:00,"1.1"
57
+
58
+ "Understanding validation graphs",,,,""
59
+
60
+ "The willSetProperty gotcha in Ember-Data: Understanding the state machine",2014-04-30,2014-04-30,0:17:30,"0.3"
61
+ " Session",2014-04-30 05:48:18,,0:17:30,"0.3"
62
+
63
+ "Ember Sparks 4: Setting up Testing",2014-05-03,2014-05-03,0:00:02,"0"
64
+ " Session",2014-05-03 03:26:21,,0:00:02,"0"
65
+
66
+ "Ember Sparks 5: Embedding Youtube videos",,,,""
67
+
68
+ "Ember Sparks 6: Intro to Ember App Kit",,,,""
69
+
70
+ "Ember Sparks 7: Transferring to Ember App Kit",,,,""
71
+
72
+ "Ember Sparks 8: Persistance with Ember Data and Ember App Kit",,,,""
73
+
74
+ "Ember.js - Animating Deletes With the BufferedProxy",,,,""
75
+
76
+ "Flatland: The Movie 1 and 2",,,,""
77
+
78
+ "Rails",2014-04-30,2014-05-04,1:22:14,"1.4"
79
+ " Session #1",2014-04-30 11:30:14,,0:15:00,"0.3"
80
+ " Session #2",2014-05-01 21:51:10,,0:29:05,"0.5"
81
+ " Session #3",2014-05-02 19:52:40,,0:25:54,"0.4"
82
+ " Session #4",2014-05-04 03:55:38,,0:12:15,"0.2"
83
+
84
+ "Ruby",2014-04-30,2014-05-08,1:43:00,"1.7"
85
+ " Session #1",2014-04-30 11:45:05,,0:00:15,"0"
86
+ " Session #2",2014-05-01 21:16:55,,0:23:36,"0.4"
87
+ " Session #3",2014-05-02 18:57:37,,0:41:51,"0.7"
88
+ " Session #4",2014-05-04 02:54:21,,0:30:01,"0.5"
89
+ " Session #5",2014-05-08 22:19:04,,0:07:17,"0.1"
90
+
91
+ "JavaScript",2014-05-02,2014-05-08,0:54:08,"0.9"
92
+ " Session #2",2014-05-02 22:51:46,,0:20:11,"0.3"
93
+ " Session #3",2014-05-08 21:45:02,,0:33:57,"0.6"
94
+
95
+ "How to learn any language in six months: Chris Lonsdale",2014-05-01,2014-05-01,0:31:17,"0.5"
96
+ " Session",2014-05-01 01:11:25,,0:31:17,"0.5"
97
+
98
+ "Controllers",,,,""
99
+
100
+ "Models",,,,""
101
+
102
+ "Views",,,,""
103
+
104
+ "Enumerables",,,,""
105
+
106
+ "Testing",,,,""
107
+
108
+ "Configuring Ember.js",,,,""
109
+
110
+ "Cookbook",,,,""
111
+
112
+ "Understanding Ember.js",,,,""
113
+
114
+ "Contributing to Ember.js",,,,""
115
+
116
+ "Guide Reviews",2014-05-07,2014-05-09,2:45:04,"2.8"
117
+ " Bindings, Reopen Classes, Handlebars helpers and attributes",2014-05-07 00:37:06,,0:32:55,"0.5"
118
+ " Actions and Helpers",2014-05-07 03:02:28,,2:09:52,"2.2"
119
+ " Query Parameters, Asynchronous Routing, Loading / Error Substates",2014-05-09 02:07:17,,0:02:17,"0"
120
+
121
+ "EmberJS Ambitious Applications",2014-04-17,2014-04-23,5:50:57,"5.8"
122
+ " Read from the start again",2014-04-17 03:42:12,,0:20:00,"0.3"
123
+ " Session #2 (Chapter 1 through 8)",2014-04-17 04:19:39,,2:31:26,"2.5"
124
+ " Session #3 (Chapter 9)",2014-04-22 01:48:17,,0:25:00,"0.4"
125
+ " Session #4 (Chapter 9 complete)",2014-04-22 02:27:41,,0:25:16,"0.4"
126
+ " Session #5 (Chapter 10)",2014-04-22 03:24:52,,0:26:04,"0.4"
127
+ " Session #6 (Chapter 10.1 through 11)",2014-04-22 03:58:40,,0:25:14,"0.4"
128
+ " Session #7 (Chapter 11 through 11.3)",2014-04-22 04:29:50,,0:25:14,"0.4"
129
+ " Session #8 (Chapter 11.4 through - 12.1)",2014-04-22 05:17:08,,0:27:26,"0.5"
130
+ " Session #9 (Chapter 12.2)",2014-04-23 16:40:01,,0:25:17,"0.4"
131
+
132
+ """Surviving APIs with Rails"" Course",,,,""
133
+
134
+ "EmberJS Testing on Rails",,,,""
135
+
136
+ "Response Streams with Rails 4 and Redis",,,,""
137
+
138
+ "Token-based Authentication in Rails",,,,""
139
+
140
+ "Refactoring Rails Controllers",,,,""
141
+
142
+ "Rails: Omniauth Github Tutorial",,,,""
143
+
144
+ "Components-based Rails",,,,""
145
+
146
+ "Metaprogramming Ruby 2nd Edition",,,,""
147
+
148
+ "Crafting Rails 4 Applications",,,,""
149
+
150
+ "Rails 4 Way",,,,""
151
+
152
+ "Autopilot: The Art and Science of Doing Nothing",,,,""
153
+
154
+ "Hooked: How to Build Habit-Forming Products",,,,""
155
+
156
+ "An In-Depth Introduction To Ember.js",,,,""
157
+
158
+ "Authentication with Ember-Rails",,,,""
159
+
160
+ "Ember.js Authentication - the right way",,,,""
161
+
162
+ "Ember.js Authentication - the right way (javascript version)",,,,""
163
+
164
+ "Creating a Node Web App With Hapi and Twilio Integration",,,,""
165
+
166
+ "Master Your Modals in Ember.js",,,,""
167
+
168
+ "Model Errors in EmberJS",,,,""
169
+
170
+ "Ember Controller",2014-04-29,2014-04-29,0:25:14,"0.4"
171
+ " Session #1",2014-04-29 20:43:46,,0:25:14,"0.4"
172
+
173
+ "Components",2014-05-09,2014-05-09,1:51:48,"1.9"
174
+ " Introduction",2014-05-09 02:56:32,,0:03:52,"0.1"
175
+ " Defining a Component",2014-05-09 03:00:29,,0:11:29,"0.2"
176
+ " Passing Properties to a Component",2014-05-09 03:12:07,,0:35:45,"0.6"
177
+ " Wrapping Content In a Component",2014-05-09 04:39:26,,0:07:02,"0.1"
178
+ " Customizing a Component's Element",2014-05-09 04:46:41,,0:25:44,"0.4"
179
+ " Sending Actions from Components to Your Application",2014-05-09 05:52:12,,0:27:56,"0.5"
180
+
181
+ "Routing",2014-05-07,2014-05-09,1:26:16,"1.4"
182
+ " Introduction",2014-05-07 03:12:56,,0:04:46,"0.1"
183
+ " Defining Your Routes",2014-05-07 03:17:48,,0:16:13,"0.3"
184
+ " Generated Objects",2014-05-07 03:43:36,,0:01:35,"0"
185
+ " Specifying a Route's Model",2014-05-07 03:45:18,,0:11:52,"0.2"
186
+ " Setting Up a Controller",2014-05-07 03:57:19,,0:08:11,"0.1"
187
+ " Rendering a Template",2014-05-07 04:10:51,,0:12:42,"0.2"
188
+ " Redirecting",2014-05-07 04:23:43,,0:14:35,"0.2"
189
+ " Specifying the URL Type",2014-05-07 04:38:24,,0:03:32,"0.1"
190
+ " Preventing and Retrying Transitions",2014-05-09 02:10:02,,0:12:50,"0.2"
191
+
192
+ "Templates",2014-05-04,2014-05-04,1:29:24,"1.5"
193
+ " The Application Template",2014-05-04 07:38:04,,0:00:57,"0"
194
+ " Handlebars Basics",2014-05-04 07:39:10,,0:04:08,"0.1"
195
+ " Conditionals",2014-05-04 07:48:39,,0:03:24,"0.1"
196
+ " Displaying a List of Items",2014-05-04 07:52:18,,0:06:17,"0.1"
197
+ " Changing Scope",2014-05-04 07:58:44,,0:06:34,"0.1"
198
+ " Binding Element Attributes",2014-05-04 08:06:17,,0:10:02,"0.2"
199
+ " Binding Element Class Names",2014-05-04 08:16:33,,0:12:10,"0.2"
200
+ " Links",2014-05-04 08:29:01,,0:04:51,"0.1"
201
+ " Actions",2014-05-04 08:34:20,,0:10:41,"0.2"
202
+ " Input Helpers",2014-05-04 08:45:44,,0:03:03,"0.1"
203
+ " Development Helpers",2014-05-04 08:48:54,,0:01:37,"0"
204
+ " Rendering with Helpers",2014-05-04 08:50:36,,0:05:43,"0.1"
205
+ " Writing Helpers",2014-05-04 08:56:27,,0:19:57,"0.3"
206
+
207
+ "Application",2014-05-04,2014-05-04,0:00:47,"0"
208
+ " Creating An Application",2014-05-04 07:34:35,,0:00:47,"0"
209
+
210
+ "The Object Model",2014-05-04,2014-05-04,1:14:43,"1.2"
211
+ " Classes and Instances",2014-05-04 04:45:01,,0:08:08,"0.1"
212
+ " Computed Properties",2014-05-04 04:59:29,,0:14:51,"0.2"
213
+ " Computed Properties and Aggregate Data with @each",2014-05-04 05:14:34,,0:15:58,"0.3"
214
+ " Observers",2014-05-04 05:48:21,,0:17:07,"0.3"
215
+ " Bindings",2014-05-04 07:14:34,,0:05:44,"0.1"
216
+ " Reopening Classes and Instances",2014-05-04 07:20:27,,0:06:56,"0.1"
217
+ " Bindings, Observers, CP - What Do I Use When?",2014-05-04 07:27:37,,0:05:59,"0.1"
218
+
219
+ "Concepts",2014-05-02,2014-05-04,0:30:44,"0.5"
220
+ " Core Concepts",2014-05-02 23:12:47,,0:04:05,"0.1"
221
+ " Naming Conventions",2014-05-04 04:09:47,,0:26:39,"0.4"
222
+
223
+ "Ember Sparks 3: Metaprogramming with defineProperty",2014-05-03,2014-05-03,0:07:10,"0.1"
224
+ " Session",2014-05-03 03:19:00,,0:07:10,"0.1"
225
+
226
+ "Ember Sparks 2: Switching to Ember Data",2014-05-03,2014-05-03,0:05:50,"0.1"
227
+ " Session",2014-05-03 03:05:09,,0:05:50,"0.1"
228
+
229
+ "Ember Sparks 1: Custom Adapters for Ember Data",2014-05-03,2014-05-03,0:03:00,"0.1"
230
+ " Session",2014-05-03 03:00:19,,0:03:00,"0.1"
231
+
232
+ "Guide #1 - Getting Started",2014-05-02,2014-05-02,0:20:00,"0.3"
233
+ " Session #1",2014-05-02 05:06:58,,0:20:00,"0.3"
234
+
235
+ "Embermaps.com Posts",2014-05-02,2014-05-02,0:02:47,"0"
236
+ " Session",2014-05-02 03:34:14,,0:02:47,"0"
237
+
238
+ "Prototyping an Ember.js App in 20 Minutes",2014-04-26,2014-04-26,0:42:50,"0.7"
239
+ " Youtube Session",2014-04-26 04:34:58,,0:42:50,"0.7"
240
+
241
+ "Setting up a serious Ember project",2014-04-22,2014-04-22,0:40:51,"0.7"
242
+ " Session #1",2014-04-22 00:11:51,,0:40:51,"0.7"
243
+
244
+ "HTMLBars: The Next-Generation of Templating in Ember.js",2014-04-19,2014-04-19,0:06:10,"0.1"
245
+ " Reading Session",2014-04-19 03:46:30,,0:06:10,"0.1"
246
+
247
+ "A Simple Ember Data Route",2014-04-19,2014-04-19,0:03:01,"0.1"
248
+ " Reading Session",2014-04-19 03:39:50,,0:03:01,"0.1"
249
+
250
+ "Ember: Release and Build Reusable UIs...",2014-04-19,2014-04-19,0:43:00,"0.7"
251
+ " Youtube Session",2014-04-19 01:03:19,,0:43:00,"0.7"
@@ -0,0 +1,25 @@
1
+ transaction_unique_identifier,seller_company_name,customer_company_name,customer_duns_number,tariff_reference,contract_service_agreement,trans_id,transaction_begin_date,transaction_end_date,time_zone,point_of_delivery_control_area,specific location,class_name,term_name,increment_name,increment_peaking_name,product_name,transaction_quantity,price,units,total_transmission_charge,transaction_charge
2
+ T1,The Electric Company,"The Electric Marketing Co., LLC",23456789,FERC Electric Tariff Original Volume No. 2,Service Agreement 1,8700,200401010000,200403312359,ES,PJM,BUS 4321,UP,LT,Y,FP,ENERGY,22574,39,$/MWH,0,880386
3
+ T2,The Electric Company,The Power Company,45653333,FERC Electric Tariff Original Volume No. 10,2,8701,200401010000,200402010000,CS,DPL,Green Sub Busbar,F,ST,M,FP,ENERGY,16800,32,$/MWH,0,537600
4
+ T3,The Electric Company,The Power Company,45653333,FERC Electric Tariff Original Volume No. 10,2,8702,200402010000,200403010000,CS,DPL,Green Sub Busbar,F,ST,M,FP,ENERGY,16800,32,$/MWH,0,537600
5
+ T4,The Electric Company,The Power Company,45653333,FERC Electric Tariff Original Volume No. 10,2,8703,200403010000,200404010000,CS,DPL,Green Sub Busbar,F,ST,M,FP,ENERGY,16800,32,$/MWH,0,537600
6
+ T5,The Electric Company,The Power Company,45653333,FERC Electric Tariff Original Volume No. 10,2,8704,200401111600,200401121559,CS,AEP,Tile Busbar,F,ST,D,FP,ENERGY,1200,50,$/MWH,0,60000
7
+ T6,The Electric Company,The Power Company,45653333,FERC Electric Tariff Original Volume No. 10,2,8801,200402011300,20040215061900,ES,HUB,Entergy (into),NF,ST,H,FP,ENERGY,1875,13.75,$/MWH,6675,32456.25
8
+ T7,The Electric Company,The Power Company,45653333,FERC Electric Tariff Original Volume No. 10,2,8802,20040202110000,200402021800,ES,HUB,PJM-W,NF,ST,H,FP,BOOKED OUT POWER,350,32,$/MWH,0,11200
9
+ T8,The Electric Company,The Power Company,45653333,FERC Electric Tariff Original Volume No. 10,2,8803,20040203060500,20040210112200,ES,HUB,PJM-W,NF,ST,H,FP,ENERGY,1875,44,$/MWH,0,82500
10
+ T9,The Electric Company,The Power Company,45653333,FERC Electric Tariff Original Volume No. 10,2,8804,20040211062300,20040219081200,PP,HUB,Four Corners,NF,ST,H,FP,ENERGY,1875,48,$/MWH,0,90000
11
+ T10,The Electric Company,The Power Company,45653333,FERC Electric Tariff Original Volume No. 10,132,7125,20040109081100,20040309082300,CS,HUB,AEP (into),F,ST,H,OP,ENERGY,150,22,$/MWH,4264,7564
12
+ T10,The Electric Company,The Power Company,45653333,FERC Electric Tariff Original Volume No. 10,132,7125,20040201010000,20040225080800,CS,HUB,AEP (into),F,ST,H,OP,ENERGY,150,28,$/MWH,0,4200
13
+ T10,The Electric Company,The Power Company,45653333,FERC Electric Tariff Original Volume No. 10,132,7125,20040108111100,20040301121200,CS,HUB,AEP (into),F,ST,H,OP,ENERGY,150,44,$/MWH,0,6600
14
+ T10,The Electric Company,The Power Company,45653333,FERC Electric Tariff Original Volume No. 10,132,7125,20040322112200,20040325120000,CS,HUB,AEP (into),F,ST,H,OP,ENERGY,150,44,$/MWH,0,6600
15
+ T10,The Electric Company,The Power Company,45653333,FERC Electric Tariff Original Volume No. 10,132,7125,20040323191900,20040328191700,CS,HUB,AEP (into),F,ST,H,OP,ENERGY,150,58,$/MWH,0,8700
16
+ T10,The Electric Company,The Power Company,45653333,FERC Electric Tariff Original Volume No. 10,132,7125,20040111010000,20040122022200,CS,HUB,AEP (into),F,ST,H,OP,CAPACITY,150,20,$/MW-DAY,0,3000
17
+ T11,The Electric Company,Utility A,38495837,FERC Electric Tariff Original Volume No. 10,15,8711,200403150800,200403150859,ES,ISNE,NEPOOL Mass HUB,F,ST,H,P,Energy,100,50,$/MWH,0,5000
18
+ T11,The Electric Company,Utility A,38495837,FERC Electric Tariff Original Volume No. 10,15,8711,200403150800,200403150859,ES,ISNE,NEPOOL Mass HUB,F,ST,H,P,Energy,-10,60,$/MWH,0,-600
19
+ T12,The Electric Company,Utility A,38495837,FERC Electric Tariff Original Volume No. 10,15,8711,200403150900,200403150959,ES,ISNE,NEPOOL Mass HUB,F,ST,H,P,Energy,100,55,$/MWH,0,5500
20
+ T12,The Electric Company,Utility A,38495837,FERC Electric Tariff Original Volume No. 10,15,8711,200403150900,200403150959,ES,ISNE,NEPOOL Mass HUB,F,ST,H,P,Energy,-5,59,$/MWH,0,-295
21
+ T13,The Electric Company,Utility A,38495837,FERC Electric Tariff Original Volume No. 10,15,8711,200403151000,200403151059,ES,ISNE,NEPOOL Mass HUB,F,ST,H,P,Energy,100,62,$/MWH,0,6200
22
+ T13,The Electric Company,Utility A,38495837,FERC Electric Tariff Original Volume No. 10,15,8711,200403151000,200403151059,ES,ISNE,NEPOOL Mass HUB,F,ST,H,P,Energy,-10,60,$/MWH,0,-600
23
+ T14,The Electric Company,Utility A,38495837,FERC Electric Tariff Original Volume No. 10,15,8711,200403151100,200403151159,ES,ISNE,NEPOOL Mass HUB,F,ST,H,P,Energy,100,62,$/MWH,0,6200
24
+ T14,The Electric Company,Utility A,38495837,FERC Electric Tariff Original Volume No. 10,15,8711,200403151100,200403151159,ES,ISNE,NEPOOL Mass HUB,F,ST,H,P,Energy,-10,59,$/MWH,0,-590
25
+ T15,The Electric Company,Utility B,493758794,FERC Electric Tariff Original Volume No. 10,7,8712,200402140200,200402140259,EP,NYIS,Zone A,F,ST,H,FP,Booked out power,60,30,$/MWH,0,1800
@@ -0,0 +1,18 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+ ENV['RACK_ENV'] = 'test'
3
+ ENV['CSV2API_ROOT'] = 'spec/fixtures'
4
+
5
+ require 'simplecov'
6
+ require 'rack/test'
7
+
8
+ SimpleCov.start
9
+ require 'csv2api'
10
+
11
+ RSpec.configure do |config|
12
+ config.order = 'random'
13
+ end
14
+
15
+ def load_fixture(csv_file)
16
+ path = File.join(File.dirname(__FILE__), 'fixtures', "#{csv_file}.csv")
17
+ File.read(path)
18
+ end
metadata ADDED
@@ -0,0 +1,163 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: csv2api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Jonah Ruiz
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-05-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
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: rspec
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: simplecov
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.8.2
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.8.2
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.6.2
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.6.2
83
+ - !ruby/object:Gem::Dependency
84
+ name: sinatra
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 1.4.5
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 1.4.5
97
+ description: Auto-create json APIs from csv files. Instantaneously
98
+ email:
99
+ - jonah@pixelhipsters.com
100
+ executables:
101
+ - csv2api
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - ".gitignore"
106
+ - ".rspec"
107
+ - ".rubocop.yml"
108
+ - ".ruby-gemset"
109
+ - ".ruby-version"
110
+ - ".travis.yml"
111
+ - Changelog.md
112
+ - Gemfile
113
+ - LICENSE.txt
114
+ - README.md
115
+ - Rakefile
116
+ - bin/csv2api
117
+ - config.ru
118
+ - csv2api.gemspec
119
+ - lib/csv2api.rb
120
+ - lib/csv2api/cli.rb
121
+ - lib/csv2api/parser.rb
122
+ - lib/csv2api/server.rb
123
+ - lib/csv2api/utils.rb
124
+ - lib/csv2api/version.rb
125
+ - spec/csv2api/csv2api_spec.rb
126
+ - spec/csv2api/parser_spec.rb
127
+ - spec/csv2api/server_spec.rb
128
+ - spec/csv2api/utils_spec.rb
129
+ - spec/fixtures/tasks.csv
130
+ - spec/fixtures/transaction.csv
131
+ - spec/spec_helper.rb
132
+ homepage: https://github.com/jonahoffline/csv2api
133
+ licenses:
134
+ - MIT
135
+ metadata: {}
136
+ post_install_message:
137
+ rdoc_options: []
138
+ require_paths:
139
+ - lib
140
+ required_ruby_version: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: 2.0.0
145
+ required_rubygems_version: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ requirements: []
151
+ rubyforge_project:
152
+ rubygems_version: 2.2.2
153
+ signing_key:
154
+ specification_version: 4
155
+ summary: Auto-create json API endpoints from csv files.
156
+ test_files:
157
+ - spec/csv2api/csv2api_spec.rb
158
+ - spec/csv2api/parser_spec.rb
159
+ - spec/csv2api/server_spec.rb
160
+ - spec/csv2api/utils_spec.rb
161
+ - spec/fixtures/tasks.csv
162
+ - spec/fixtures/transaction.csv
163
+ - spec/spec_helper.rb