hsql 0.2.1 → 0.3.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: 810e7d83e6fe91c3977b1c9e6cbedb33bcc9e4b3
4
- data.tar.gz: b6a8e21fe109d511e326bd451cdbc6863a664a99
3
+ metadata.gz: ad536a4589ef6fd47d79acfbbdefe48e99515cb5
4
+ data.tar.gz: d8d754d2e5e6284be8273edb111ebeeee17ad402
5
5
  SHA512:
6
- metadata.gz: 635ffcf8efbd6827af5aa18b819a99f7e944cab8eaa9677d65c8c35e874ae7304394b164bda7092e16d7bcfda71b08ac5ad2db4eb6680ae28f8cd94e17b39c5a
7
- data.tar.gz: e64eae6f4c2064db51985b561ff103ed339f79e665f3bb4ef43f3b9163fd009ac72c26eb671f67ac86b95f53fb94d34467efda1c9a6d208c9fd23ae5ff05724a
6
+ metadata.gz: 4e81cd7ba8c73332637181929b64e50d91398402bd391e22fba68afd12f0fa662a128dcb34de0ec26945b6384e02be7f7851fbe967926389dd3adb16358ada34
7
+ data.tar.gz: 08f0d9f2a3a1ec99f99e6cfc32c53fd0be8710075f21b3d227d99fb57dfc8f4a5b50270fda18167e6865bdbe3fd4dd56029a735b99ca885eb17f45ff063d0c6b
data/.rubocop.yml ADDED
@@ -0,0 +1,14 @@
1
+
2
+ Style/TrailingComma:
3
+ EnforcedStyleForMultiline: comma
4
+
5
+ Metrics/LineLength:
6
+ Max: 110
7
+
8
+ StructInheritance:
9
+ Enabled: false
10
+
11
+ # `module_function` is strictly worse than `extend self` due to the confusion
12
+ # `module_function` introduces by not copying private methods to the class.
13
+ Style/ModuleFunction:
14
+ Enabled: false
data/.travis.yml CHANGED
@@ -1,4 +1,6 @@
1
1
  language: ruby
2
2
  rvm:
3
+ - 2.0.0
3
4
  - 2.2.1
5
+ script: bundle exec rake
4
6
  before_install: gem install bundler -v 1.10.5
data/README.md CHANGED
@@ -13,19 +13,21 @@ Rather than specifying variables and metadata for a set of database
13
13
  queries in a `.rb`,`.py` or other programming language source file the queries
14
14
  should be written to a .sql file directly.
15
15
 
16
- # filename: daily_summary.sql
17
- owner: jackdanger
18
- schedule: hourly
19
- data:
20
- production:
21
- output_table: summaries
22
- update_condition:
23
- development:
24
- output_table: jackdanger_summaries
25
- update_condition: WHERE 1 <> 1
26
- ---
27
- INSERT INTO {{{output_table}}} SELECT * FROM interesting_information;
28
- UPDATE summaries_performed SET complete = 1 {{{update_condition}}};
16
+ ```sql
17
+ # filename: daily_summary.sql
18
+ owner: jackdanger
19
+ schedule: hourly
20
+ data:
21
+ production:
22
+ output_table: summaries
23
+ update_condition:
24
+ development:
25
+ output_table: jackdanger_summaries
26
+ update_condition: WHERE 1 <> 1
27
+ ---
28
+ INSERT INTO {{{output_table}}} SELECT * FROM interesting_information;
29
+ UPDATE summaries_performed SET complete = 1 {{{update_condition}}};
30
+ ```
29
31
 
30
32
  The above is a SQL file and any text editor will allow analysts to use
31
33
  code completion and syntax highlighting for their queries.
data/Rakefile CHANGED
@@ -1,6 +1,10 @@
1
1
  require 'bundler/gem_tasks'
2
2
  require 'rspec/core/rake_task'
3
+ require 'rubocop/rake_task'
3
4
 
4
- RSpec::Core::RakeTask.new(:spec)
5
+ RSpec::Core::RakeTask.new
6
+ RuboCop::RakeTask.new
5
7
 
6
- task default: :spec
8
+ task default: [:lint, :spec]
9
+ task test: :spec
10
+ task lint: :rubocop
data/bin/hsql CHANGED
@@ -3,34 +3,72 @@
3
3
  require 'optparse'
4
4
  require 'yaml'
5
5
  require 'json'
6
+ require 'active_support/time'
6
7
 
7
8
  options = {}
8
9
  option_parser = OptionParser.new do |opts|
9
10
  opts.banner = <<-BANNER
10
- USAGE: #{__FILE__} file environment [--yaml]
11
+ Usage: #{__FILE__} file [environment] [--yaml]
11
12
 
12
- file: Any *.sql file that has a YAML header ending in three hyphens.
13
- environment: Must be one of the keys of the "data" hash in the YAML header of the .sql file.
14
- --yaml: Outputs only the YAML metadata from the file, not the SQL queries themselves.
13
+ ARGUMENTS
14
+ file: Any *.sql file that has a YAML header ending in three hyphens.
15
15
 
16
- for details, run:
17
- open https://github.com/JackDanger/hsql
16
+ OPTIONS
18
17
  BANNER
19
18
 
20
- opts.on('-y', '--yaml', 'Output metadata for this file as YAML') do |option|
19
+ opts.on('-d DATE',
20
+ '--date DATE',
21
+ '--timestamp DATE', 'The time that the SQL will consider to be "now".') do |option|
22
+ options[:timestamp] = Time.parse(option) if option
23
+ end
24
+ opts.on('-e ENV',
25
+ '--env ENV',
26
+ 'Which key of the YAML header "data:" key you want to interpolate.') do |option|
27
+ options[:environment] = option
28
+ end
29
+ opts.on('-y', '--yaml', 'Output just the metadata for this file as YAML') do |_option|
21
30
  options[:meta_only] = 'yaml'
22
31
  end
23
- opts.on('-j', '--json', 'Output metadata for this file as JSON') do |option|
32
+ opts.on('-j', '--json', 'Output just the metadata for this file as JSON') do |_option|
24
33
  options[:meta_only] = 'json'
25
34
  end
26
- end
35
+ opts.on_tail('-v', '--version', 'Show the current version of HSQL') do |_option|
36
+ puts HSQL::VERSION
37
+ exit 1
38
+ end
39
+ opts.on('-h', '--help', 'Show the full help documentation') do |_option|
40
+ require_relative '../lib/hsql/data'
41
+ <<-HELP
42
+ TEMPLATE
43
+
44
+ You can use the Mustache syntax (three curly braces) to interpolate any of your
45
+ 'data' into your SQL. You specify the data in the YAML header like so:
46
+
47
+ data:
48
+ production: # whatever you want to be interpolated into your SQL
49
+ name: Alison # when you pass 'production' as the environment argument
50
+ development:
51
+ name: Kailey
52
+ ---
53
+ SELECT * FROM users WHERE name = '{{{name}}}'
27
54
 
55
+
56
+ There are some common date values available to you at all times, without having
57
+ to be defined in the YAML header:
58
+
59
+ #{HSQL::Data.for_humans}
60
+
61
+ For more details, run:
62
+ open https://github.com/JackDanger/hsql
63
+ HELP
64
+ end
65
+ end
28
66
  option_parser.parse!
29
67
 
30
- filename, env = ARGV
68
+ filename = ARGV.first
31
69
 
32
- unless filename && env
33
- puts option_parser.banner
70
+ unless filename
71
+ puts option_parser
34
72
  exit 1
35
73
  end
36
74
 
@@ -43,7 +81,7 @@ end
43
81
 
44
82
  require_relative '../lib/hsql'
45
83
 
46
- file = HSQL.parse_file(file, env)
84
+ file = HSQL::File.parse_file(file, options)
47
85
  if 'yaml' == options[:meta_only]
48
86
  puts file.metadata.to_yaml
49
87
  elsif 'json' == options[:meta_only]
@@ -0,0 +1,69 @@
1
+ /*
2
+ Demonstrating use of the builtin time and date variables.
3
+ No YAML front matter was necessary for this file to work.
4
+
5
+ To see all possible variables you can use run:
6
+
7
+ $ hsql --help
8
+
9
+ To see yourself how this file works run:
10
+
11
+ $ hsql examples/date_math.sql
12
+
13
+ To change the values of the times just pass a --date or --timestamp argument:
14
+
15
+ $ hsql examples/date_math.sql --timestamp '1986-01-12 17:12:00'
16
+
17
+ */
18
+
19
+ SELECT * FROM users WHERE created_at = {{{now}}};
20
+ /* Becomes:
21
+ SELECT * FROM users WHERE created_at = '2015-08-19 21:13:82 -0700' */
22
+
23
+ SELECT * FROM users WHERE created_at BETWEEN {{{beginning_of_hour}}} AND {{{end_of_hour}}};
24
+ /* Becomes:
25
+ SELECT * FROM users WHERE created_at >= '2015-08-19 21:00:00 -0700' AND created_at <= '2015-08-19 21:59:59 -0700' */
26
+
27
+ SELECT * FROM users WHERE created_at BETWEEN {{{beginning_of_previous_hour}}} AND {{{end_of_previous_hour}}};
28
+ /* Becomes:
29
+ SELECT * FROM users WHERE created_at >= '2015-08-19 20:00:00 -0700' AND created_at <= '2015-08-19 20:59:59 -0700' */
30
+
31
+ SELECT * FROM users WHERE created_at BETWEEN {{{beginning_of_day}}} AND {{{end_of_day}}};
32
+ /* Becomes:
33
+ SELECT * FROM users WHERE created_at >= '2015-08-19 00:00:00 -0700' AND created_at <= '2015-08-19 23:59:59 -0700' */
34
+
35
+ SELECT * FROM users WHERE created_at BETWEEN {{{beginning_of_previous_day}}} AND {{{end_of_previous_day}}};
36
+ /* Becomes:
37
+ SELECT * FROM users WHERE created_at >= '2015-08-18 00:00:00 -0700' AND created_at <= '2015-08-18 23:59:59 -0700' */
38
+
39
+ SELECT * FROM users WHERE created_at BETWEEN {{{beginning_of_week}}} AND {{{end_of_week}}};
40
+ /* Becomes:
41
+ SELECT * FROM users WHERE created_at >= '2015-08-17 00:00:00 -0700' AND created_at <= '2015-08-23 23:59:59 -0700' */
42
+
43
+ SELECT * FROM users WHERE created_at BETWEEN {{{beginning_of_previous_week}}} AND {{{end_of_previous_week}}};
44
+ /* Becomes:
45
+ SELECT * FROM users WHERE created_at >= '2015-08-10 00:00:00 -0700' AND created_at <= '2015-08-16 23:59:59 -0700' */
46
+
47
+ SELECT * FROM users WHERE created_at BETWEEN {{{beginning_of_month}}} AND {{{end_of_month}}};
48
+ /* Becomes:
49
+ SELECT * FROM users WHERE created_at >= '2015-08-01 00:00:00 -0700' AND created_at <= '2015-08-31 23:59:59 -0700' */
50
+
51
+ SELECT * FROM users WHERE created_at BETWEEN {{{beginning_of_previous_month}}} AND {{{end_of_previous_month}}};
52
+ /* Becomes:
53
+ SELECT * FROM users WHERE created_at >= '2015-07-01 00:00:00 -0700' AND created_at <= '2015-07-31 23:59:59 -0700' */
54
+
55
+ SELECT * FROM users WHERE created_at BETWEEN {{{beginning_of_quarter}}} AND {{{end_of_quarter}}};
56
+ /* Becomes:
57
+ SELECT * FROM users WHERE created_at >= '2015-07-01 00:00:00 -0700' AND created_at <= '2015-09-30 23:59:59 -0700' */
58
+
59
+ SELECT * FROM users WHERE created_at BETWEEN {{{beginning_of_previous_quarter}}} AND {{{end_of_previous_quarter}}};
60
+ /* Becomes:
61
+ SELECT * FROM users WHERE created_at >= '2015-04-01 00:00:00 -0700' AND created_at <= '2015-06-30 23:59:59 -0700' */
62
+
63
+ SELECT * FROM users WHERE created_at BETWEEN {{{beginning_of_year}}} AND {{{end_of_year}}};
64
+ /* Becomes:
65
+ SELECT * FROM users WHERE created_at >= '2015-01-01 00:00:00 -0800' AND created_at <= '2015-12-31 23:59:59 -0800' */
66
+
67
+ SELECT * FROM users WHERE created_at BETWEEN {{{beginning_of_previous_year}}} AND {{{end_of_previous_year}}};
68
+ /* Becomes:
69
+ SELECT * FROM users WHERE created_at >= '2014-01-01 00:00:00 -0800' AND created_at <= '2014-12-31 23:59:59 -0800' */
data/hsql.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ['gems@jackcanty.com']
11
11
 
12
12
  spec.summary = 'Store a hash of data with your SQL queries.'
13
- spec.description = 'Write SQL queries in a .sql format and ship them with metadata about how they should be executed'
13
+ spec.description = 'Write SQL queries with Mustache and easily render them for specific dates/times'
14
14
  spec.homepage = 'https://github.com/JackDanger/hsql'
15
15
  spec.license = 'MIT'
16
16
 
@@ -20,10 +20,12 @@ Gem::Specification.new do |spec|
20
20
  spec.require_paths = ['lib']
21
21
 
22
22
  spec.add_dependency 'mustache', '> 0'
23
+ spec.add_dependency 'activesupport', '> 0'
23
24
  # spec.add_dependency 'pg_query', '>= 0.6.2'
24
25
  spec.add_development_dependency 'bundler', '~> 1.10'
25
26
  spec.add_development_dependency 'rubocop', '~> 0.3'
26
27
  spec.add_development_dependency 'rake', '> 0'
27
28
  spec.add_development_dependency 'rspec', '~> 3.3'
29
+ spec.add_development_dependency 'timecop', '~> 0.8.0'
28
30
  spec.add_development_dependency 'pry-byebug', '> 3'
29
31
  end
data/lib/hsql/data.rb ADDED
@@ -0,0 +1,95 @@
1
+ require 'active_support/time'
2
+ module HSQL
3
+ # This module provides a set of useful values to be inserted into templates.
4
+ module Data
5
+ extend self
6
+
7
+ # The internal API for reading this data and inserting it into queries.
8
+ def for_machines(time)
9
+ Hash[
10
+ calendar_moments(time).map { |name, value, _documentation| [name, "'#{value}'"] }
11
+ ]
12
+ end
13
+
14
+ # For presenting to users the possible template variables they can use.
15
+ def for_humans
16
+ values = calendar_moments(Time.current)
17
+ for_screen = values.map do |name, _, description|
18
+ ["{{{#{name}}}}", description]
19
+ end
20
+ width = for_screen.max_by { |name, _| name.size }.first.size
21
+
22
+ for_screen.map do |name, documentation|
23
+ " #{name.ljust(width, ' ')} #{documentation}"
24
+ end.join("\n")
25
+ end
26
+
27
+ private
28
+
29
+ # A set of template variables that are always available and defined in
30
+ # relation to the provided time or date.
31
+ # The structure is designed to make generating documentation easier.
32
+ #
33
+ # rubocop:disable Metrics/LineLength, Metrics/MethodLength, Metrics/AbcSize
34
+ def calendar_moments(time)
35
+ # Time ranges surrounding the moment provided.
36
+ moment = time
37
+ moments = []
38
+
39
+ moments += [
40
+ ['now', moment, 'The moment provided via --date or --timestamp (defaults to the current system time)'],
41
+ ]
42
+
43
+ moments += [
44
+ ['beginning_of_hour', moment.beginning_of_hour, 'The first second of the hour'],
45
+ ['beginning_of_day', moment.beginning_of_day, 'The first second of the day'],
46
+ ['beginning_of_week', moment.beginning_of_week, 'The first second of the week'],
47
+ ['beginning_of_month', moment.beginning_of_month, 'The first second of the month'],
48
+ ['beginning_of_quarter', moment.beginning_of_quarter, 'The first second of the quarter'],
49
+ ['beginning_of_year', moment.beginning_of_year, 'The first second of the year'],
50
+ ['end_of_hour', moment.end_of_hour, 'The last second of the hour'],
51
+ ['end_of_day', moment.end_of_day, 'The last second of the day'],
52
+ ['end_of_week', moment.end_of_week, 'The last second of the week'],
53
+ ['end_of_month', moment.end_of_month, 'The last second of the month'],
54
+ ['end_of_quarter', moment.end_of_quarter, 'The last second of the quarter'],
55
+ ['end_of_year', moment.end_of_year, 'The last second of the year'],
56
+ ]
57
+
58
+ # Time ranges immediately preceding the one in which `time` appears.
59
+ moment = time - 1.hour
60
+ moments += [
61
+ ['beginning_of_previous_hour', moment.beginning_of_hour, 'The first second of the previous hour'],
62
+ ['end_of_previous_hour', moment.end_of_hour, 'The last second of the previous hour'],
63
+ ]
64
+
65
+ moment = time - 1.day
66
+ moments += [
67
+ ['beginning_of_previous_day', moment.beginning_of_day, 'The first second of the previous day'],
68
+ ['end_of_previous_day', moment.end_of_day, 'The last second of the previous day'],
69
+ ]
70
+
71
+ moment = time - 1.week
72
+ moments += [
73
+ ['beginning_of_previous_week', moment.beginning_of_week, 'The first second of the previous week'],
74
+ ['end_of_previous_week', moment.end_of_week, 'The last second of the previous week'],
75
+ ]
76
+ moment = time - 1.month
77
+ moments += [
78
+ ['beginning_of_previous_month', moment.beginning_of_month, 'The first second of the previous month'],
79
+ ['end_of_previous_month', moment.end_of_month, 'The last second of the previous month'],
80
+ ]
81
+ moment = time - 3.months
82
+ moments += [
83
+ ['beginning_of_previous_quarter', moment.beginning_of_quarter, 'The first second of the previous quarter'],
84
+ ['end_of_previous_quarter', moment.end_of_quarter, 'The last second of the previous quarter'],
85
+ ]
86
+ moment = time - 1.year
87
+ moments += [
88
+ ['beginning_of_previous_year', moment.beginning_of_year, 'The first second of the previous year'],
89
+ ['end_of_previous_year', moment.end_of_year, 'The last second of the previous year'],
90
+ ]
91
+
92
+ moments
93
+ end
94
+ end
95
+ end
data/lib/hsql/file.rb CHANGED
@@ -1,12 +1,36 @@
1
- # HSQL::File parses the input file and provides reader methods to the hash of
2
- # YAML data from the front matter section and a list of the queries in the SQL
3
- # portion.
4
1
  require 'yaml'
5
2
  require_relative 'query'
3
+ require_relative 'data'
6
4
  module HSQL
7
- class File < Struct.new(:string, :environment)
5
+ # HSQL::File parses the input file and provides reader methods to the hash of
6
+ # YAML data from the front matter section and a list of the queries in the SQL
7
+ # portion.
8
+ class File
9
+ attr_reader :string, :timestamp, :environment
10
+
11
+ # This is used to indicate when a source file is malformed.
12
+ class FormatError < StandardError
13
+ end
14
+
15
+ def initialize(string, options)
16
+ @string = string
17
+ @timestamp = options.fetch(:timestamp, Time.current)
18
+ @environment = options[:environment]
19
+ end
20
+
21
+ # Given the contents of a SQL file with YAML front matter (see README for an
22
+ # example) this will return a HSQL::File object providing access to the parts
23
+ # of that file.
24
+ def self.parse(string, options)
25
+ new(string, options).parse!
26
+ end
27
+
28
+ def self.parse_file(file, options)
29
+ parse(file.read, options)
30
+ end
31
+
8
32
  def metadata
9
- @metadata ||= ::YAML.load(@front_matter)
33
+ @metadata ||= @front_matter ? ::YAML.load(@front_matter) : {}
10
34
  end
11
35
 
12
36
  def queries
@@ -23,9 +47,12 @@ module HSQL
23
47
 
24
48
  def split!
25
49
  @split ||= begin
26
- @front_matter, divider, @sql = string.partition(/^---$/)
27
- unless divider == '---'
28
- fail FormatError, 'The YAML front matter is required, otherwise this is just a SQL file'
50
+ top_half, divider, rest = string.partition(/^---$/)
51
+ if divider.present?
52
+ @front_matter = top_half
53
+ @sql = rest
54
+ else # No divider found, therefore no YAML header
55
+ @sql = top_half
29
56
  end
30
57
  true
31
58
  end
@@ -33,20 +60,29 @@ module HSQL
33
60
 
34
61
  def data
35
62
  @data ||= begin
36
- if metadata['data']
37
- unless metadata['data'].key?(environment)
38
- fail ArgumentError, "The environment #{environment.inspect} is not specified"
39
- end
40
- metadata['data'][environment]
41
- end || {}
63
+ validate_environment_exists!
64
+
65
+ hash = metadata['data'] || {}
66
+ hash = hash[environment] || {} if environment
67
+ hash.merge(Data.for_machines(timestamp))
42
68
  end
43
69
  end
44
70
 
71
+ def validate_environment_exists!
72
+ return unless environment
73
+ return if metadata['data'].blank? || metadata['data'].key?(environment)
74
+ fail ArgumentError, "The environment #{environment.inspect} is not specified"
75
+ end
76
+
45
77
  def interpolate_data!
46
78
  template = Template.new(@sql)
47
79
  template.variable_names.each do |name|
48
- unless data.key?(name)
80
+ next if data.key?(name)
81
+
82
+ if environment
49
83
  fail FormatError, "#{name.inspect} is not set in #{environment.inspect} environment"
84
+ else
85
+ fail FormatError, "#{name.inspect} is not set! Did you provide the right environment argument?"
50
86
  end
51
87
  end
52
88
 
data/lib/hsql/query.rb CHANGED
@@ -1,6 +1,6 @@
1
- # PgQuery uses Postgres' own parser to parse and then deparse each query.
2
1
  require 'pg_query'
3
2
  module HSQL
3
+ # PgQuery uses Postgres' own parser to parse and then deparse each query.
4
4
  class Query < Struct.new(:ast)
5
5
  # Returns a list of queries found in the source SQL
6
6
  def self.parse(source)
data/lib/hsql/template.rb CHANGED
@@ -1,6 +1,15 @@
1
1
  require 'mustache'
2
2
  module HSQL
3
- class Template < Struct.new(:input)
3
+ # Given some SQL that may contain Mustache tags (e.g. {{{ variable }}} ),
4
+ # accept a hash of data that interpolates each tag.
5
+ # Throws an error if one of the tag names can't be found in the data.
6
+ class Template
7
+ attr_reader :input
8
+
9
+ def initialize(input)
10
+ @input = input
11
+ end
12
+
4
13
  def variable_names
5
14
  extract_variable_names(ast).uniq
6
15
  end
@@ -17,7 +26,7 @@ module HSQL
17
26
  if tree[1] == :fetch
18
27
  tree.last.first
19
28
  else
20
- tree.map { |token| extract_variable_names(token) }.compact.flatten
29
+ tree.map { |token| extract_variable_names(token) }.flatten.compact
21
30
  end
22
31
  end
23
32
 
data/lib/hsql/version.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # http://semver.org/
1
2
  module HSQL
2
- VERSION = '0.2.1'
3
+ VERSION = '0.3.0'
3
4
  end
data/lib/hsql.rb CHANGED
@@ -2,22 +2,3 @@ require_relative 'hsql/version'
2
2
  require_relative 'hsql/template'
3
3
  require_relative 'hsql/file'
4
4
  require_relative 'hsql/query'
5
- require 'mustache'
6
-
7
- module HSQL
8
- # This is used to indicate when a source file is malformed.
9
- class FormatError < StandardError
10
- end
11
-
12
- # Given the contents of a SQL file with YAML front matter (see README for an
13
- # example) this will return a HSQL::File object providing access to the parts
14
- # of that file.
15
- def self.parse(string, environment)
16
- fail ArgumentError, 'The environment argument is required' unless environment
17
- File.new(string, environment).parse!
18
- end
19
-
20
- def self.parse_file(file, environment)
21
- parse(file.read, environment)
22
- end
23
- end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hsql
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jack Danger Canty
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-17 00:00:00.000000000 Z
11
+ date: 2015-08-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mustache
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">"
25
25
  - !ruby/object:Gem::Version
26
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'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +94,20 @@ dependencies:
80
94
  - - "~>"
81
95
  - !ruby/object:Gem::Version
82
96
  version: '3.3'
97
+ - !ruby/object:Gem::Dependency
98
+ name: timecop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.8.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.8.0
83
111
  - !ruby/object:Gem::Dependency
84
112
  name: pry-byebug
85
113
  requirement: !ruby/object:Gem::Requirement
@@ -94,8 +122,7 @@ dependencies:
94
122
  - - ">"
95
123
  - !ruby/object:Gem::Version
96
124
  version: '3'
97
- description: Write SQL queries in a .sql format and ship them with metadata about
98
- how they should be executed
125
+ description: Write SQL queries with Mustache and easily render them for specific dates/times
99
126
  email:
100
127
  - gems@jackcanty.com
101
128
  executables:
@@ -105,6 +132,7 @@ extra_rdoc_files: []
105
132
  files:
106
133
  - ".gitignore"
107
134
  - ".rspec"
135
+ - ".rubocop.yml"
108
136
  - ".ruby-version"
109
137
  - ".travis.yml"
110
138
  - CODE_OF_CONDUCT.md
@@ -115,9 +143,11 @@ files:
115
143
  - bin/console
116
144
  - bin/hsql
117
145
  - bin/setup
146
+ - examples/date_math.sql
118
147
  - examples/simple.sql
119
148
  - hsql.gemspec
120
149
  - lib/hsql.rb
150
+ - lib/hsql/data.rb
121
151
  - lib/hsql/file.rb
122
152
  - lib/hsql/query.rb
123
153
  - lib/hsql/template.rb