Skip to content
This repository has been archived by the owner on Apr 5, 2023. It is now read-only.

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
mcls committed Jun 23, 2016
0 parents commit d175ad7
Show file tree
Hide file tree
Showing 15 changed files with 308 additions and 0 deletions.
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/.bundle/
/.yardoc
/Gemfile.lock
/_yardoc/
/coverage/
/doc/
/pkg/
/spec/reports/
/tmp/
2 changes: 2 additions & 0 deletions .rspec
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
--color
--require spec_helper
5 changes: 5 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
sudo: false
language: ruby
rvm:
- 2.3.1
before_install: gem install bundler -v 1.12.5
49 changes: 49 additions & 0 deletions CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Contributor Code of Conduct

As contributors and maintainers of this project, and in the interest of
fostering an open and welcoming community, we pledge to respect all people who
contribute through reporting issues, posting feature requests, updating
documentation, submitting pull requests or patches, and other activities.

We are committed to making participation in this project a harassment-free
experience for everyone, regardless of level of experience, gender, gender
identity and expression, sexual orientation, disability, personal appearance,
body size, race, ethnicity, age, religion, or nationality.

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery
* Personal attacks
* Trolling or insulting/derogatory comments
* Public or private harassment
* Publishing other's private information, such as physical or electronic
addresses, without explicit permission
* Other unethical or unprofessional conduct

Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.

By adopting this Code of Conduct, project maintainers commit themselves to
fairly and consistently applying these principles to every aspect of managing
this project. Project maintainers who do not follow or enforce the Code of
Conduct may be permanently removed from the project team.

This code of conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community.

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting a project maintainer at [email protected]. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. Maintainers are
obligated to maintain confidentiality with regard to the reporter of an
incident.

This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 1.3.0, available at
[http://contributor-covenant.org/version/1/3/0/][version]

[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/3/0/
4 changes: 4 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
source 'https://rubygems.org'

# Specify your gem's dependencies in setting_macro.gemspec
gemspec
47 changes: 47 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# SettingMacro

Defines a `setting` class method which can be used to retrieve and set some
class-level veriables. Heavily inspired by the [ClassMacros in the rom-support
respository](https://github.com/rom-rb/rom-support/blob/31085bb9a02a68455f2a66dce1fa08fcfd937430/lib/rom/support/class_macros.rb).

## Installation

Add this line to your application's Gemfile:

```ruby
gem 'setting_macro'
```

## Usage

```
class Heating
extend SettingMacro
setting :default_temperature
setting :heat_source, default: 'unknown'
end
class Oven < Heating
default_temperature 200
end
class Sun < Heating
default_temperature 5505
heat_source 'nuclear_fusion'
end
p Heating.default_temperature # => nil
p Heating.heat_source # => 'unknown'
p Oven.default_temperature # => 200
p Oven.heat_source # => 'unknown'
p Sun.default_temperature # => 5505
p Sun.heat_source # => 'nuclear_fusion'
```


## Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/setting_macro. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.

7 changes: 7 additions & 0 deletions Rakefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
require "bundler/gem_tasks"
begin
require 'rspec/core/rake_task'
RSpec::Core::RakeTask.new(:spec)
task :default => :spec
rescue LoadError
end
14 changes: 14 additions & 0 deletions bin/console
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/usr/bin/env ruby

require "bundler/setup"
require "setting_macro"

# You can add fixtures and/or initialization code here to make experimenting
# with your gem easier. You can also use a different console, if you like.

# (If you use this, don't forget to add pry to your Gemfile!)
# require "pry"
# Pry.start

require "irb"
IRB.start
8 changes: 8 additions & 0 deletions bin/setup
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
set -vx

bundle install

# Do any other automated setup that you need to do here
32 changes: 32 additions & 0 deletions lib/setting_macro.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
require "setting_macro/version"

module SettingMacro
Undefined = Object.new.freeze

def setting(name, default: nil)
mod = Module.new
mod.module_eval <<-RUBY, __FILE__, __LINE__ + 1
def #{name}(value = ::SettingMacro::Undefined)
if value == ::SettingMacro::Undefined
defined?(@#{name}) && @#{name}
else
@#{name} = value
end
end
RUBY

mod.send(:define_method, :inherited) do |klass|
super(klass)

# Make sure we inherit properly
klass.public_send(name, send(name))
end

mod.send(:define_singleton_method, :extended) do |base|
# Set the default value
base.public_send(name, default)
end

extend(mod)
end
end
3 changes: 3 additions & 0 deletions lib/setting_macro/version.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module SettingMacro
VERSION = "0.1.0"
end
32 changes: 32 additions & 0 deletions setting_macro.gemspec
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'setting_macro/version'

Gem::Specification.new do |spec|
spec.name = "setting_macro"
spec.version = SettingMacro::VERSION
spec.authors = ["Maarten Claes"]
spec.email = ["[email protected]"]

spec.summary = %q{A module which provides a method to easily define class settings}
spec.description = %q{A module which provides a method to easily define class settings}
spec.homepage = "https://github.com/mcls/setting_macro"

# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
# to allow pushing to a single host or delete this section to allow pushing to any host.
if spec.respond_to?(:metadata)
spec.metadata['allowed_push_host'] = "https://rubygems.org"
else
raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
end

spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
spec.bindir = "exe"
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
spec.require_paths = ["lib"]

spec.add_development_dependency "bundler", "~> 1.12"
spec.add_development_dependency "rake", "~> 10.0"
spec.add_development_dependency "rspec", ">= 3.4"
end
3 changes: 3 additions & 0 deletions spec/examples.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
example_id | status | run_time |
------------------------------- | ------ | --------------- |
./spec/integration_spec.rb[1:1] | passed | 0.00061 seconds |
26 changes: 26 additions & 0 deletions spec/integration_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
RSpec.describe SettingMacro do
class Heating
extend SettingMacro
setting :default_temperature
setting :heat_source, default: 'unknown'
end

class Oven < Heating
default_temperature 200
end

class Sun < Heating
default_temperature 5505
heat_source 'nuclear_fusion'
end

it "works as expected" do
expect(Heating.default_temperature).to eq(nil)
expect(Oven.default_temperature).to eq(200)
expect(Sun.default_temperature).to eq(5505)

expect(Heating.heat_source).to eq('unknown')
expect(Oven.heat_source).to eq('unknown')
expect(Sun.heat_source).to eq('nuclear_fusion')
end
end
67 changes: 67 additions & 0 deletions spec/spec_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
require 'setting_macro'

# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
RSpec.configure do |config|
config.expect_with :rspec do |expectations|
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
end

# rspec-mocks config goes here. You can use an alternate test double
# library (such as bogus or mocha) by changing the `mock_with` option here.
config.mock_with :rspec do |mocks|
# Prevents you from mocking or stubbing a method that does not exist on
# a real object. This is generally recommended, and will default to
# `true` in RSpec 4.
mocks.verify_partial_doubles = true
end

# These two settings work together to allow you to limit a spec run
# to individual examples or groups you care about by tagging them with
# `:focus` metadata. When nothing is tagged with `:focus`, all examples
# get run.
config.filter_run :focus
config.run_all_when_everything_filtered = true

# Allows RSpec to persist some state between runs in order to support
# the `--only-failures` and `--next-failure` CLI options. We recommend
# you configure your source control system to ignore this file.
config.example_status_persistence_file_path = "spec/examples.txt"

# Limits the available syntax to the non-monkey patched syntax that is
# recommended. For more details, see:
# - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/
# - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
# - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode
config.disable_monkey_patching!

# This setting enables warnings. It's recommended, but in some cases may
# be too noisy due to issues in dependencies.
config.warnings = true

# Many RSpec users commonly either run the entire suite or an individual
# file, and it's useful to allow more verbose output when running an
# individual spec file.
if config.files_to_run.one?
# Use the documentation formatter for detailed output,
# unless a formatter has already been configured
# (e.g. via a command-line flag).
config.default_formatter = 'doc'
end

# Print the 10 slowest examples and example groups at the
# end of the spec run, to help surface which specs are running
# particularly slow.
config.profile_examples = 10

# Run specs in random order to surface order dependencies. If you find an
# order dependency and want to debug it, you can fix the order by providing
# the seed, which is printed after each run.
# --seed 1234
config.order = :random

# Seed global randomization in this process using the `--seed` CLI option.
# Setting this allows you to use `--seed` to deterministically reproduce
# test failures related to randomization by passing the same `--seed` value
# as the one that triggered the failure.
Kernel.srand config.seed
end

0 comments on commit d175ad7

Please sign in to comment.